{
        struct net_device *dev = BR_INPUT_SKB_CB(skb)->brdev;
        const unsigned char *src = eth_hdr(skb)->h_source;
+       struct sk_buff *nskb;
 
        if (!should_deliver(p, skb))
                return;
        if (skb->dev == p->dev && ether_addr_equal(src, addr))
                return;
 
-       skb = pskb_copy(skb, GFP_ATOMIC);
-       if (!skb) {
+       __skb_push(skb, ETH_HLEN);
+       nskb = pskb_copy(skb, GFP_ATOMIC);
+       __skb_pull(skb, ETH_HLEN);
+       if (!nskb) {
                DEV_STATS_INC(dev, tx_dropped);
                return;
        }
 
+       skb = nskb;
+       __skb_pull(skb, ETH_HLEN);
        if (!is_broadcast_ether_addr(addr))
                memcpy(eth_hdr(skb)->h_dest, addr, ETH_ALEN);