static void br_pass_frame_up(struct net_bridge *br, struct sk_buff *skb) { struct net_device *indev, *brdev = br->dev; #if defined(CONFIG_MIPS_BRCM) && defined(CONFIG_BLOG) blog_dev( skb, br->dev, DIR_RX, skb->len ); #endif brdev->stats.rx_packets++; brdev->stats.rx_bytes += skb->len; indev = skb->dev; skb->dev = brdev; NF_HOOK(PF_BRIDGE, NF_BR_LOCAL_IN, skb, indev, NULL, netif_receive_skb); }
/* net device transmit always called with no BH (preempt_disabled) */ int br_dev_xmit(struct sk_buff *skb, struct net_device *dev) { struct net_bridge *br = netdev_priv(dev); const unsigned char *dest = skb->data; struct net_bridge_fdb_entry *dst; #if defined(CONFIG_MIPS_BRCM) && defined(CONFIG_BLOG) blog_dev( skb, dev, DIR_TX, skb->len ); #endif dev->stats.tx_packets++; dev->stats.tx_bytes += skb->len; skb_reset_mac_header(skb); skb_pull(skb, ETH_HLEN); #if defined(CONFIG_MIPS_BRCM) && defined(CONFIG_BR_MLD_SNOOP) if ((0x33 == dest[0]) && (0x33 == dest[1])) { if (!br_mld_mc_forward(br, skb, 0, 0)) br_flood_deliver(br, skb); } else #endif if (dest[0] & 1) { #if defined(CONFIG_MIPS_BRCM) && defined(CONFIG_BR_IGMP_SNOOP) if (!br_igmp_mc_forward(br, skb, 0, 0)) #endif 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); return 0; }