From patchwork Sun Oct 14 12:46:57 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Wunderlich X-Patchwork-Id: 2384 Return-Path: Received: from nick.hrz.tu-chemnitz.de (nick.hrz.tu-chemnitz.de [134.109.228.11]) by open-mesh.org (Postfix) with ESMTPS id 625276012CB for ; Sun, 14 Oct 2012 14:47:10 +0200 (CEST) Authentication-Results: open-mesh.org; dkim=pass reason="1024-bit key; insecure key" header.i=@tu-chemnitz.de header.b=XDGPNznQ; dkim-adsp=none (insecure policy); dkim-atps=neutral DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=tu-chemnitz.de; s=dkim2010; h=References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From; bh=5wvnyW9mYesoHb7WOfylzYd7vAz2ePzLfzZhHwLymkc=; b=XDGPNznQJQD388nMhrtXbyGDxoL2D2NIi7tkMIltqFd65ZhxgFQhrezeSyIBMq2sghtl8Qbbcd87TmWgSiZ6zOCiM2qD2TfaAVm5NApbPWOtx5r7cJNVOs6yTA59FjRUZm8LgFIoXIhTmY4Qd6g2SLK8FNYCnzBdtI8e/1RFDPg=; Received: from p57aa0057.dip0.t-ipconnect.de ([87.170.0.87] helo=pandem0nium) by nick.hrz.tu-chemnitz.de with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.80) (envelope-from ) id 1TNNb3-0006Xh-8h; Sun, 14 Oct 2012 14:47:09 +0200 Received: from dotslash by pandem0nium with local (Exim 4.72) (envelope-from ) id 1TNNav-0004us-7d; Sun, 14 Oct 2012 14:47:01 +0200 From: Simon Wunderlich To: b.a.t.m.a.n@lists.open-mesh.org Date: Sun, 14 Oct 2012 14:46:57 +0200 Message-Id: <1350218817-18871-1-git-send-email-siwu@hrz.tu-chemnitz.de> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <10556116.CPovbmhTyy@sven-laptop.home.narfation.org> References: <10556116.CPovbmhTyy@sven-laptop.home.narfation.org> X-purgate: clean X-purgate-type: clean X-purgate-ID: 154106::1350218829-00005597-653E1C89/0-0/0-0 X-Scan-AV: nick.hrz.tu-chemnitz.de; 2012-10-14 14:47:09; d72493d4149f9252a42406eb63299306 X-Scan-SA: nick.hrz.tu-chemnitz.de; 2012-10-14 14:47:09; dac12359e4b5a6954c2658dea3351ad0 X-Spam-Score: -1.0 (-) X-Spam-Report: --- Textanalyse SpamAssassin 3.3.1 (-1.0 Punkte) Fragen an/questions to: Postmaster TU Chemnitz * -1.0 ALL_TRUSTED Passed through trusted hosts only via SMTP --- Ende Textanalyse Cc: Simon Wunderlich Subject: [B.A.T.M.A.N.] [PATCH] batman-adv: dirty hack to recompute mac_len in the rx path X-BeenThere: b.a.t.m.a.n@lists.open-mesh.org X-Mailman-Version: 2.1.15 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: Sun, 14 Oct 2012 12:47:10 -0000 It is possible that the mac_len is not properly exported because of strange device configuration (this behaviour has been observed when using batman-adv on top of a vlan interface). Therefore it is needed to explicitly recompute it at the very beginning of the rx path. This is done by appending the recompute function to the skb_share_mac() function, hence the "dirty hack" in the subject. We expect this problem to be fixed in linux 3.8 and above. Reported-by: Antonio Quartulli Signed-off-by: Simon Wunderlich --- this is a rewrite of Antonios patch "batman-adv: recompute mac_len at the beginning of the rx path". It is intended to fix the issue for out-of-kernel releases, without hurting the in-kernel code too much. Obviously, this patch won't go upstream into the kernel. This version includes Svens "more sane" version, and also has implements skb_reset_mac_len() for kernels prior to 3.0. --- compat.h | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/compat.h b/compat.h index 14969e0..47223f5 100644 --- a/compat.h +++ b/compat.h @@ -137,6 +137,11 @@ void batadv_free_rcu_neigh_node(struct rcu_head *rcu); void batadv_free_rcu_tt_local_entry(struct rcu_head *rcu); void batadv_free_rcu_backbone_gw(struct rcu_head *rcu); +static inline void skb_reset_mac_len(struct sk_buff *skb) +{ + skb->mac_len = skb->network_header - skb->mac_header; +} + #endif /* < KERNEL_VERSION(3, 0, 0) */ @@ -159,4 +164,23 @@ static inline void eth_hw_addr_random(struct net_device *dev) #endif /* < KERNEL_VERSION(3, 5, 0) */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(3, 8, 0) + +/* hack for not correctly set mac_len. This may happen for some special + * configurations like batman-adv on VLANs. + * + * This is pretty dirty, but we only use skb_share_check() in main.c right + * before mac_len is checked, and the recomputation shouldn't hurt too much. + */ +#define skb_share_check(skb, b) \ + ({ \ + struct sk_buff *_t_skb; \ + _t_skb = skb_share_check(skb, b); \ + if (_t_skb) \ + skb_reset_mac_len(_t_skb); \ + _t_skb; \ + }) + +#endif /* < KERNEL_VERSION(3, 8, 0) */ + #endif /* _NET_BATMAN_ADV_COMPAT_H_ */