skb_pull(skb, ETH_HLEN);
 
        if (dest[0] & 1)
-               br_flood_deliver(br, skb, 0);
+               br_flood_deliver(br, skb);
        else if ((dst = __br_fdb_get(br, dest)) != NULL)
                br_deliver(dst->dst, skb);
        else
-               br_flood_deliver(br, skb, 0);
+               br_flood_deliver(br, skb);
 
        return 0;
 }
 
 }
 
 /* called under bridge lock */
-static void br_flood(struct net_bridge *br, struct sk_buff *skb, int clone,
+static void br_flood(struct net_bridge *br, struct sk_buff *skb,
        void (*__packet_hook)(const struct net_bridge_port *p,
                              struct sk_buff *skb))
 {
        struct net_bridge_port *p;
        struct net_bridge_port *prev;
 
-       if (clone) {
-               struct sk_buff *skb2;
-
-               if ((skb2 = skb_clone(skb, GFP_ATOMIC)) == NULL) {
-                       br->statistics.tx_dropped++;
-                       return;
-               }
-
-               skb = skb2;
-       }
-
        prev = NULL;
 
        list_for_each_entry_rcu(p, &br->port_list, list) {
 
 
 /* called with rcu_read_lock */
-void br_flood_deliver(struct net_bridge *br, struct sk_buff *skb, int clone)
+void br_flood_deliver(struct net_bridge *br, struct sk_buff *skb)
 {
-       br_flood(br, skb, clone, __br_deliver);
+       br_flood(br, skb, __br_deliver);
 }
 
 /* called under bridge lock */
-void br_flood_forward(struct net_bridge *br, struct sk_buff *skb, int clone)
+void br_flood_forward(struct net_bridge *br, struct sk_buff *skb)
 {
-       br_flood(br, skb, clone, __br_forward);
+       br_flood(br, skb, __br_forward);
 }
 
        struct net_bridge_port *p = rcu_dereference(skb->dev->br_port);
        struct net_bridge *br;
        struct net_bridge_fdb_entry *dst;
-       int passedup = 0;
+       struct sk_buff *skb2;
 
        if (!p || p->state == BR_STATE_DISABLED)
                goto drop;
        if (p->state == BR_STATE_LEARNING)
                goto drop;
 
-       if (br->dev->flags & IFF_PROMISC) {
-               struct sk_buff *skb2;
+       /* The packet skb2 goes to the local host (NULL to skip). */
+       skb2 = NULL;
 
-               skb2 = skb_clone(skb, GFP_ATOMIC);
-               if (skb2 != NULL) {
-                       passedup = 1;
-                       br_pass_frame_up(br, skb2);
-               }
-       }
+       if (br->dev->flags & IFF_PROMISC)
+               skb2 = skb;
+
+       dst = NULL;
 
        if (is_multicast_ether_addr(dest)) {
                br->statistics.multicast++;
-               br_flood_forward(br, skb, !passedup);
-               if (!passedup)
-                       br_pass_frame_up(br, skb);
-               goto out;
+               skb2 = skb;
+       } else if ((dst = __br_fdb_get(br, dest)) && dst->is_local) {
+               skb2 = skb;
+               /* Do not forward the packet since it's local. */
+               skb = NULL;
        }
 
-       dst = __br_fdb_get(br, dest);
-       if (dst != NULL && dst->is_local) {
-               if (!passedup)
-                       br_pass_frame_up(br, skb);
-               else
-                       kfree_skb(skb);
-               goto out;
-       }
+       if (skb2 == skb)
+               skb2 = skb_clone(skb, GFP_ATOMIC);
 
-       if (dst != NULL) {
-               br_forward(dst->dst, skb);
-               goto out;
-       }
+       if (skb2)
+               br_pass_frame_up(br, skb2);
 
-       br_flood_forward(br, skb, 0);
+       if (skb) {
+               if (dst)
+                       br_forward(dst->dst, skb);
+               else
+                       br_flood_forward(br, skb);
+       }
 
 out:
        return 0;
 
 extern void br_forward(const struct net_bridge_port *to,
                struct sk_buff *skb);
 extern int br_forward_finish(struct sk_buff *skb);
-extern void br_flood_deliver(struct net_bridge *br,
-                     struct sk_buff *skb,
-                     int clone);
-extern void br_flood_forward(struct net_bridge *br,
-                     struct sk_buff *skb,
-                     int clone);
+extern void br_flood_deliver(struct net_bridge *br, struct sk_buff *skb);
+extern void br_flood_forward(struct net_bridge *br, struct sk_buff *skb);
 
 /* br_if.c */
 extern void br_port_carrier_check(struct net_bridge_port *p);