[Devel] [PATCH RHEL7 COMMIT] ve/bridge: Revert diff-ve-net-bridge-fix-deliver-vs-close-seq

Konstantin Khorenko khorenko at virtuozzo.com
Tue Sep 1 06:12:29 PDT 2015


The commit is pushed to "branch-rh7-3.10.0-229.7.2-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-229.7.2.vz7.6.5
------>
commit 019b0e9d6ccaf0c0ec064ec0c2b2045a6e17dc0d
Author: Vladimir Davydov <vdavydov at parallels.com>
Date:   Tue Sep 1 17:12:29 2015 +0400

    ve/bridge: Revert diff-ve-net-bridge-fix-deliver-vs-close-seq
    
    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 c9c4b3b..cf29b38 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:



More information about the Devel mailing list