From patchwork Wed May 19 01:25:49 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Linus_L=C3=BCssing?= X-Patchwork-Id: 104 Return-Path: Received: from fmmailgate01.web.de (fmmailgate01.web.de [217.72.192.221]) by open-mesh.net (Postfix) with ESMTP id CDB271542A7 for ; Tue, 18 May 2010 22:02:47 +0200 (CEST) Received: from smtp02.web.de ( [172.20.0.184]) by fmmailgate01.web.de (Postfix) with ESMTP id 264CD15A33BF8 for ; Wed, 19 May 2010 03:26:34 +0200 (CEST) Received: from [188.192.185.221] (helo=localhost) by smtp02.web.de with asmtp (TLSv1:AES128-SHA:128) (WEB.DE 4.110 #4) id 1OEY3N-0001qk-00; Wed, 19 May 2010 03:26:33 +0200 From: =?UTF-8?q?Linus=20L=C3=BCssing?= To: b.a.t.m.a.n@lists.open-mesh.org Date: Wed, 19 May 2010 03:25:49 +0200 Message-Id: <1274232349-10414-1-git-send-email-linus.luessing@web.de> X-Mailer: git-send-email 1.7.1 In-Reply-To: <20100517072041.GA23674@ritirata.org> References: <20100517072041.GA23674@ritirata.org> MIME-Version: 1.0 Sender: linus.luessing@web.de X-Sender: linus.luessing@web.de X-Provags-ID: V01U2FsdGVkX1/6JOOpDbUB0j1tc/1h2ugTiduFwT35YLJqFVcK Jx7EclXy7mFcXkhtRbGoiTvYCHHgsndcmutF1u+42e2+WPqqV7 LH/u66Pc4pv4Iv0YrKHg== Subject: [B.A.T.M.A.N.] [PATCH] batman-adv: Adding netfilter-bridge hooks X-BeenThere: b.a.t.m.a.n@lists.open-mesh.org X-Mailman-Version: 2.1.11 Precedence: list Reply-To: The list for a Better Approach To Mobile Ad-hoc Networking List-Id: The list for a Better Approach To Mobile Ad-hoc Networking List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 18 May 2010 20:02:48 -0000 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üssing Reported-by: Antonio Quartulli --- batman-adv-kernelland/hard-interface.c | 17 +++++++++++++++-- batman-adv-kernelland/send.c | 8 ++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/batman-adv-kernelland/hard-interface.c b/batman-adv-kernelland/hard-interface.c index cc7fbae..6a64930 100644 --- a/batman-adv-kernelland/hard-interface.c +++ b/batman-adv-kernelland/hard-interface.c @@ -28,9 +28,11 @@ #include "bat_sysfs.h" #include "originator.h" #include "hash.h" -#include "compat.h" #include +#include + +#include "compat.h" #define MIN(x, y) ((x) < (y) ? (x) : (y)) @@ -433,6 +435,11 @@ out: 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 @@ int batman_skb_recv(struct sk_buff *skb, struct net_device *dev, 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 @@ err_out: return NET_RX_DROP; } - struct notifier_block hard_if_notifier = { .notifier_call = hard_if_event, }; diff --git a/batman-adv-kernelland/send.c b/batman-adv-kernelland/send.c index 99d11fe..b0d3627 100644 --- a/batman-adv-kernelland/send.c +++ b/batman-adv-kernelland/send.c @@ -29,6 +29,7 @@ #include "vis.h" #include "aggregation.h" #include "gateway_common.h" +#include #include "compat.h" @@ -93,9 +94,12 @@ int send_skb_packet(struct sk_buff *skb, /* 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;