From patchwork Wed Oct 17 20:28: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: 2399 Return-Path: Received: from cora.hrz.tu-chemnitz.de (cora.hrz.tu-chemnitz.de [134.109.228.40]) by open-mesh.org (Postfix) with ESMTPS id 5B966601512 for ; Wed, 17 Oct 2012 22:29:17 +0200 (CEST) Authentication-Results: open-mesh.org; dkim=pass reason="1024-bit key; insecure key" header.i=@tu-chemnitz.de header.b=ZOD5tMQw; 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=AStP1T+bZB+nD3N4C1dWbq+NOAq1J9Okx2a8C6mDqHk=; b=ZOD5tMQwx4coKYsHOzi7nyrO14SMuC0w/U4vrzeHfcSj2ssBqQqaD0RbQAbHeqYE6sBZE3fIehioEjFxfLwk9hMW8/zmNU7Xk/tFe5D3NYUmtSUJsd0tqKPTXO3k/PcgWwCLwOVOxpb5GvsOzVGpE+hxu6Un6t93qOTXjOkdw9A=; Received: from p57aa192f.dip0.t-ipconnect.de ([87.170.25.47] helo=pandem0nium) by cora.hrz.tu-chemnitz.de with esmtpsa (TLSv1:AES256-SHA:256) (Exim 4.80) (envelope-from ) id 1TOaEu-0005nJ-3w; Wed, 17 Oct 2012 22:29:16 +0200 Received: from dotslash by pandem0nium with local (Exim 4.72) (envelope-from ) id 1TOaEi-0008Ma-Vt; Wed, 17 Oct 2012 22:29:04 +0200 From: Simon Wunderlich To: b.a.t.m.a.n@lists.open-mesh.org Date: Wed, 17 Oct 2012 22:28:57 +0200 Message-Id: <1350505737-32105-1-git-send-email-siwu@hrz.tu-chemnitz.de> X-Mailer: git-send-email 1.7.2.5 In-Reply-To: <1350505240-32005-1-git-send-email-siwu@hrz.tu-chemnitz.de> References: <1350505240-32005-1-git-send-email-siwu@hrz.tu-chemnitz.de> X-purgate: clean X-purgate-type: clean X-purgate-ID: 154106::1350505756-00000CD1-A2F46175/0-0/0-0 X-Scan-AV: cora.hrz.tu-chemnitz.de; 2012-10-17 22:29:16; 9d50506246e2b383e7c66f56a97e5e15 X-Scan-SA: cora.hrz.tu-chemnitz.de; 2012-10-17 22:29:16; 72e6191f7fc999530be23b80d6f3808d 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.] [PATCHv3] batman-adv: Fix broadcast duplist for fragmentation 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: Wed, 17 Oct 2012 20:29:17 -0000 If the skb is fragmented, the checksum must be computed on the individual fragments, just using skb->data may fail on fragmented data. Instead of doing linearizing the packet, use the new batadv_crc32 to do that more efficiently- it should not hurt replacing the old crc16 by the new crc32. Reported-by: Sven Eckelmann Signed-off-by: Simon Wunderlich --- PATCHv2: change uint32_t to __be32 PATCHv3: this time also changed in types.h --- bridge_loop_avoidance.c | 18 +++++++----------- bridge_loop_avoidance.h | 3 +-- routing.c | 10 +++------- types.h | 2 +- 4 files changed, 12 insertions(+), 21 deletions(-) diff --git a/bridge_loop_avoidance.c b/bridge_loop_avoidance.c index c6c1c59..e04b15f 100644 --- a/bridge_loop_avoidance.c +++ b/bridge_loop_avoidance.c @@ -1247,8 +1247,7 @@ int batadv_bla_init(struct batadv_priv *bat_priv) /** * batadv_bla_check_bcast_duplist * @bat_priv: the bat priv with all the soft interface information - * @bcast_packet: encapsulated broadcast frame plus batman header - * @bcast_packet_len: length of encapsulated broadcast frame plus batman header + * @skb: contains the bcast_packet to be checked * * check if it is on our broadcast list. Another gateway might * have sent the same packet because it is connected to the same backbone, @@ -1260,20 +1259,17 @@ int batadv_bla_init(struct batadv_priv *bat_priv) * the same host however as this might be intended. */ int batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv, - struct batadv_bcast_packet *bcast_packet, - int bcast_packet_len) + struct sk_buff *skb) { - int i, length, curr, ret = 0; - uint8_t *content; - uint16_t crc; + int i, curr, ret = 0; + __be32 crc; + struct batadv_bcast_packet *bcast_packet; struct batadv_bcast_duplist_entry *entry; - length = bcast_packet_len - sizeof(*bcast_packet); - content = (uint8_t *)bcast_packet; - content += sizeof(*bcast_packet); + bcast_packet = (struct batadv_bcast_packet *)skb->data; /* calculate the crc ... */ - crc = crc16(0, content, length); + crc = batadv_skb_crc32(skb, (u8 *)(bcast_packet + 1)); spin_lock_bh(&bat_priv->bla.bcast_duplist_lock); diff --git a/bridge_loop_avoidance.h b/bridge_loop_avoidance.h index 789cb73..f1bc9cd 100644 --- a/bridge_loop_avoidance.h +++ b/bridge_loop_avoidance.h @@ -31,8 +31,7 @@ int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq, void *offset); int batadv_bla_is_backbone_gw_orig(struct batadv_priv *bat_priv, uint8_t *orig); int batadv_bla_check_bcast_duplist(struct batadv_priv *bat_priv, - struct batadv_bcast_packet *bcast_packet, - int hdr_size); + struct sk_buff *skb); void batadv_bla_update_orig_address(struct batadv_priv *bat_priv, struct batadv_hard_iface *primary_if, struct batadv_hard_iface *oldif); diff --git a/routing.c b/routing.c index 5da62df..5da7724 100644 --- a/routing.c +++ b/routing.c @@ -1181,16 +1181,12 @@ int batadv_recv_bcast_packet(struct sk_buff *skb, spin_unlock_bh(&orig_node->bcast_seqno_lock); - /* keep skb linear for crc calculation */ - if (skb_linearize(skb) < 0) - goto out; - - bcast_packet = (struct batadv_bcast_packet *)skb->data; - /* check whether this has been sent by another originator before */ - if (batadv_bla_check_bcast_duplist(bat_priv, bcast_packet, skb->len)) + if (batadv_bla_check_bcast_duplist(bat_priv, skb)) goto out; + bcast_packet = (struct batadv_bcast_packet *)skb->data; + /* rebroadcast packet */ batadv_add_bcast_packet_to_list(bat_priv, skb, 1); diff --git a/types.h b/types.h index 7b3d0d7..ae9ac9a 100644 --- a/types.h +++ b/types.h @@ -156,7 +156,7 @@ struct batadv_neigh_node { #ifdef CONFIG_BATMAN_ADV_BLA struct batadv_bcast_duplist_entry { uint8_t orig[ETH_ALEN]; - uint16_t crc; + __be32 crc; unsigned long entrytime; }; #endif