[Devel] [PATCH rh7] Revert diff-ve-net-bridge-fix-deliver-vs-close-seq

Vladimir Davydov vdavydov at parallels.com
Fri Aug 21 02:08:21 PDT 2015


This PCS6 patch was ported to Vz7 by the initial commit (2a8b5de95918).
It is only relevant if there is via_phys_dev stuff, which may set
BR_ALREADY_SEEN skb->brmark. However, the via_phys_dev feature was
removed in the scope of PSBM-12955, so this patch is not needed any
more.

Moreover, it is buggy. The point is it may call skb_clone, which does
not initialize all skb fields. As a result, some fields may contain
junk. One of such fields is skb->csum_bad, which appeared after the last
rebase. skb_checksum_validate, which is now called by icmpv6_rcv,
identifies an skb as corrupted and drops it if this flag is set. In
particular, this results in ping6 failures with "Address unreachable"
error.

https://jira.sw.ru/browse/PSBM-38924

Signed-off-by: Vladimir Davydov <vdavydov at parallels.com>
---
 net/bridge/br_input.c | 15 +++++----------
 1 file changed, 5 insertions(+), 10 deletions(-)

diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c
index c9c4b3bc7ae6..cf29b38b3b0c 100644
--- a/net/bridge/br_input.c
+++ b/net/bridge/br_input.c
@@ -68,7 +68,6 @@ int br_handle_frame_finish(struct sk_buff *skb)
 	struct sk_buff *skb2;
 	bool unicast = true;
 	u16 vid = 0;
-	int err = 0;
 
 	if (!p || p->state == BR_STATE_DISABLED)
 		goto drop;
@@ -124,21 +123,17 @@ int br_handle_frame_finish(struct sk_buff *skb)
 		skb = NULL;
 	}
 
-	if (skb2 == skb)
-		skb2 = skb_clone(skb, GFP_ATOMIC);
-
-	if (skb2)
-		err = br_pass_frame_up(skb2);
-
 	if (skb) {
 		if (dst) {
 			dst->used = jiffies;
-			br_forward(dst->dst, skb, NULL);
+			br_forward(dst->dst, skb, skb2);
 		} else
-			br_flood_forward(br, skb, NULL, unicast);
+			br_flood_forward(br, skb, skb2, unicast);
 	}
 
-	return err;
+	if (skb2)
+		return br_pass_frame_up(skb2);
+
 out:
 	return 0;
 drop:
-- 
2.1.4




More information about the Devel mailing list