Whoops, that patch was buggy.  Take #2.

--- br_input.c.orig     Fri Dec  7 21:11:27 2001
+++ br_input.c  Fri Dec  7 21:34:28 2001
@@ -29,7 +29,7 @@
        return 0;
 }
 
-static void br_pass_frame_up(struct net_bridge *br, struct sk_buff *skb)
+static void br_pass_frame_up(struct net_bridge *br, struct sk_buff *skb, int for_us)
 {
        struct net_device *indev;
 
@@ -38,9 +38,11 @@
 
        indev = skb->dev;
        skb->dev = &br->dev;
-       skb->pkt_type = PACKET_HOST;
        skb_push(skb, ETH_HLEN);
+       skb->pkt_type = PACKET_HOST;
        skb->protocol = eth_type_trans(skb, &br->dev);
+       if (!for_us)
+               skb->pkt_type = PACKET_OTHERHOST;
 
        NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL,
                        br_pass_frame_up_finish);
@@ -70,43 +72,29 @@
                skb2 = skb_clone(skb, GFP_ATOMIC);
                if (skb2) {
                        passedup = 1;
-                       br_pass_frame_up(br, skb2);
+                       br_pass_frame_up(br, skb2, p->state == BR_STATE_FORWARDING);
                }
        }
 
        if (skb->mac.ethernet->h_source[0] & 1)
                goto freeandout;
 
-       if (!passedup &&
-           (dest[0] & 1) &&
-           (br->dev.flags & IFF_ALLMULTI || br->dev.mc_list != NULL)) {
-               struct sk_buff *skb2;
-
-               skb2 = skb_clone(skb, GFP_ATOMIC);
-               if (skb2) {
-                       passedup = 1;
-                       br_pass_frame_up(br, skb2);
-               }
-       }
+       if (p->state == BR_STATE_LEARNING ||
+           p->state == BR_STATE_FORWARDING)
+               br_fdb_insert(br, p, skb->mac.ethernet->h_source, 0);
 
        if (br->stp_enabled &&
            !memcmp(dest, bridge_ula, 5) &&
            !(dest[5] & 0xF0))
                goto handle_special_frame;
 
-       if (p->state == BR_STATE_LEARNING ||
-           p->state == BR_STATE_FORWARDING)
-               br_fdb_insert(br, p, skb->mac.ethernet->h_source, 0);
-
        if (p->state != BR_STATE_FORWARDING)
                goto freeandout;
 
        if (dest[0] & 1) {
-               br_flood_forward(br, skb, 1);
+               br_flood_forward(br, skb, !passedup);
                if (!passedup)
-                       br_pass_frame_up(br, skb);
-               else
-                       kfree_skb(skb);
+                       br_pass_frame_up(br, skb, 1);
                return;
        }
 
@@ -114,7 +102,7 @@
 
        if (dst != NULL && dst->is_local) {
                if (!passedup)
-                       br_pass_frame_up(br, skb);
+                       br_pass_frame_up(br, skb, 1);
                else
                        kfree_skb(skb);
                br_fdb_put(dst);

_______________________________________________
Bridge mailing list
[EMAIL PROTECTED]
http://www.math.leidenuniv.nl/mailman/listinfo/bridge

Reply via email to