Author: marek Date: 2010-05-22 07:13:51 +0200 (Sat, 22 May 2010) New Revision: 1678
Modified: trunk/batman-adv-kernelland/hard-interface.c trunk/batman-adv-kernelland/send.c Log: batman-adv: Adding netfilter-bridge hooks
batman-adv is receiving and sending the packets of its own ether type on a very early/low level. Therefore we need to add explicit hooks to give netfilter/ebtables a chance to filter them.
Signed-off-by: Linus L?\195?\188ssing linus.luessing@web.de Reported-by: Antonio Quartulli ordex@ritirata.org
Modified: trunk/batman-adv-kernelland/hard-interface.c =================================================================== --- trunk/batman-adv-kernelland/hard-interface.c 2010-05-22 05:09:53 UTC (rev 1677) +++ trunk/batman-adv-kernelland/hard-interface.c 2010-05-22 05:13:51 UTC (rev 1678) @@ -28,10 +28,12 @@ #include "bat_sysfs.h" #include "originator.h" #include "hash.h" -#include "compat.h"
#include <linux/if_arp.h> +#include <linux/netfilter_bridge.h>
+#include "compat.h" + #define MIN(x, y) ((x) < (y) ? (x) : (y))
struct batman_if *get_batman_if_by_netdev(struct net_device *net_dev) @@ -433,6 +435,11 @@ return NOTIFY_DONE; }
+int batman_skb_recv_finish(struct sk_buff *skb) +{ + return NF_ACCEPT; +} + /* receive a packet with the batman ethertype coming on a hard * interface */ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, @@ -452,6 +459,13 @@ if (atomic_read(&module_state) != MODULE_ACTIVE) goto err_free;
+ /* if netfilter/ebtables wants to block incoming batman + * packets then give them a chance to do so here */ + ret = NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, dev, NULL, + batman_skb_recv_finish); + if (ret != 1) + goto err_out; + /* packet should hold at least type and version */ if (unlikely(skb_headlen(skb) < 2)) goto err_free; @@ -531,7 +545,6 @@ return NET_RX_DROP; }
- struct notifier_block hard_if_notifier = { .notifier_call = hard_if_event, };
Modified: trunk/batman-adv-kernelland/send.c =================================================================== --- trunk/batman-adv-kernelland/send.c 2010-05-22 05:09:53 UTC (rev 1677) +++ trunk/batman-adv-kernelland/send.c 2010-05-22 05:13:51 UTC (rev 1678) @@ -29,6 +29,7 @@ #include "vis.h" #include "aggregation.h" #include "gateway_common.h" +#include <linux/netfilter_bridge.h>
#include "compat.h"
@@ -93,9 +94,12 @@
/* dev_queue_xmit() returns a negative result on error. However on * congestion and traffic shaping, it drops and returns NET_XMIT_DROP - * (which is > 0). This will not be treated as an error. */ + * (which is > 0). This will not be treated as an error. + * Also, if netfilter/ebtables wants to block outgoing batman + * packets then giving them a chance to do so here */
- return dev_queue_xmit(skb); + return NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev, + dev_queue_xmit); send_skb_err: kfree_skb(skb); return NET_XMIT_DROP;