bridge: Do br_pass_frame_up after other ports
authorHerbert Xu <herbert@gondor.apana.org.au>
Sat, 27 Feb 2010 19:41:39 +0000 (19:41 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sun, 28 Feb 2010 08:48:42 +0000 (00:48 -0800)
At the moment we deliver to the local bridge port via the function
br_pass_frame_up before all other ports.  There is no requirement
for this.

For the purpose of IGMP snooping, it would be more convenient if
we did the local port last.  Therefore this patch rearranges the
bridge input processing so that the local bridge port gets to see
the packet last (if at all).

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/bridge/br_input.c

index 5ee1a3682bf282dc1893e1be3596daba847371f9..9589937e1c0a95a6816535981575dec85f3cb29a 100644 (file)
@@ -73,9 +73,6 @@ int br_handle_frame_finish(struct sk_buff *skb)
        if (skb2 == skb)
                skb2 = skb_clone(skb, GFP_ATOMIC);
 
-       if (skb2)
-               br_pass_frame_up(br, skb2);
-
        if (skb) {
                if (dst)
                        br_forward(dst->dst, skb);
@@ -83,6 +80,9 @@ int br_handle_frame_finish(struct sk_buff *skb)
                        br_flood_forward(br, skb);
        }
 
+       if (skb2)
+               br_pass_frame_up(br, skb2);
+
 out:
        return 0;
 drop: