Bridge
Andrew Thompson
thompsa at freebsd.org
Wed Sep 13 21:48:49 PDT 2006
On Thu, Sep 14, 2006 at 08:38:02AM +0400, Eygene Ryabinkin wrote:
> Andrew, good day!
>
> > The check for ARP happens before the ipfw layer2 code so it isnt
> > currently possible to filter them.
> >
> > switch (ether_type) {
> > case ETHERTYPE_ARP:
> > case ETHERTYPE_REVARP:
> > return (0); /* Automatically pass */
> I am a bit confused because in the another thread (also created by
> Jon Otterholm) you've answered that
> -----
> The only way that you will be able to filter ARP packets is by setting
> pfil_onlyip=0, ipfw=1 and use the IPFW layer2 filtering.
> -----
> citing the same code. Am I understand something incorrectly or these
> two answers do contradict with each other?
Yes, thats just me being stupid :)
My first answer to Jon was not correct, you can not currently filter
ARP. I have attached a patch that should make this possible my
rearranging things.
Thanks for pointing it out.
Andrew
-------------- next part --------------
Index: if_bridge.c
===================================================================
RCS file: /home/ncvs/src/sys/net/if_bridge.c,v
retrieving revision 1.79
diff -u -p -r1.79 if_bridge.c
--- if_bridge.c 25 Aug 2006 20:11:56 -0000 1.79
+++ if_bridge.c 14 Sep 2006 04:38:50 -0000
@@ -490,11 +490,9 @@ sysctl_pfil_ipfw(SYSCTL_HANDLER_ARGS)
/*
* Disable pfil so that ipfw doesnt run twice, if the user
* really wants both then they can re-enable pfil_bridge and/or
- * pfil_member. Also allow non-ip packets as ipfw can filter by
- * layer2 type.
+ * pfil_member.
*/
if (pfil_ipfw) {
- pfil_onlyip = 0;
pfil_bridge = 0;
pfil_member = 0;
}
@@ -2736,34 +2734,6 @@ bridge_pfil(struct mbuf **mp, struct ifn
}
}
- /*
- * If we're trying to filter bridge traffic, don't look at anything
- * other than IP and ARP traffic. If the filter doesn't understand
- * IPv6, don't allow IPv6 through the bridge either. This is lame
- * since if we really wanted, say, an AppleTalk filter, we are hosed,
- * but of course we don't have an AppleTalk filter to begin with.
- * (Note that since pfil doesn't understand ARP it will pass *ALL*
- * ARP traffic.)
- */
- switch (ether_type) {
- case ETHERTYPE_ARP:
- case ETHERTYPE_REVARP:
- return (0); /* Automatically pass */
- case ETHERTYPE_IP:
-#ifdef INET6
- case ETHERTYPE_IPV6:
-#endif /* INET6 */
- break;
- default:
- /*
- * Check to see if the user wants to pass non-ip
- * packets, these will not be checked by pfil(9) and
- * passed unconditionally so the default is to drop.
- */
- if (pfil_onlyip)
- goto bad;
- }
-
/* Strip off the Ethernet header and keep a copy. */
m_copydata(*mp, 0, ETHER_HDR_LEN, (caddr_t) &eh2);
m_adj(*mp, ETHER_HDR_LEN);
@@ -2836,9 +2806,14 @@ ipfwpass:
error = 0;
/*
- * Run the packet through pfil
+ * Run the packet through pfil. (Note that since pfil doesn't understand
+ * ARP it will pass *ALL* ARP traffic.)
*/
switch (ether_type) {
+ case ETHERTYPE_ARP:
+ case ETHERTYPE_REVARP:
+ return (0); /* Automatically pass */
+
case ETHERTYPE_IP:
/*
* before calling the firewall, swap fields the same as
@@ -2930,7 +2905,14 @@ ipfwpass:
break;
#endif
default:
- error = 0;
+ /*
+ * Check to see if the user wants to pass non-ip
+ * packets.
+ */
+ if (pfil_onlyip) {
+ error = -1;
+ goto bad;
+ }
break;
}
More information about the freebsd-net
mailing list