[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