diff options
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 31 |
1 files changed, 19 insertions, 12 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index d23972f56fc7..7f31d0f88424 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1687,31 +1687,37 @@ static inline int deliver_skb(struct sk_buff *skb, | |||
1687 | } | 1687 | } |
1688 | 1688 | ||
1689 | #if defined(CONFIG_BRIDGE) || defined (CONFIG_BRIDGE_MODULE) | 1689 | #if defined(CONFIG_BRIDGE) || defined (CONFIG_BRIDGE_MODULE) |
1690 | int (*br_handle_frame_hook)(struct net_bridge_port *p, struct sk_buff **pskb); | 1690 | /* These hooks defined here for ATM */ |
1691 | struct net_bridge; | 1691 | struct net_bridge; |
1692 | struct net_bridge_fdb_entry *(*br_fdb_get_hook)(struct net_bridge *br, | 1692 | struct net_bridge_fdb_entry *(*br_fdb_get_hook)(struct net_bridge *br, |
1693 | unsigned char *addr); | 1693 | unsigned char *addr); |
1694 | void (*br_fdb_put_hook)(struct net_bridge_fdb_entry *ent); | 1694 | void (*br_fdb_put_hook)(struct net_bridge_fdb_entry *ent) __read_mostly; |
1695 | 1695 | ||
1696 | static __inline__ int handle_bridge(struct sk_buff **pskb, | 1696 | /* |
1697 | struct packet_type **pt_prev, int *ret, | 1697 | * If bridge module is loaded call bridging hook. |
1698 | struct net_device *orig_dev) | 1698 | * returns NULL if packet was consumed. |
1699 | */ | ||
1700 | struct sk_buff *(*br_handle_frame_hook)(struct net_bridge_port *p, | ||
1701 | struct sk_buff *skb) __read_mostly; | ||
1702 | static inline struct sk_buff *handle_bridge(struct sk_buff *skb, | ||
1703 | struct packet_type **pt_prev, int *ret, | ||
1704 | struct net_device *orig_dev) | ||
1699 | { | 1705 | { |
1700 | struct net_bridge_port *port; | 1706 | struct net_bridge_port *port; |
1701 | 1707 | ||
1702 | if ((*pskb)->pkt_type == PACKET_LOOPBACK || | 1708 | if (skb->pkt_type == PACKET_LOOPBACK || |
1703 | (port = rcu_dereference((*pskb)->dev->br_port)) == NULL) | 1709 | (port = rcu_dereference(skb->dev->br_port)) == NULL) |
1704 | return 0; | 1710 | return skb; |
1705 | 1711 | ||
1706 | if (*pt_prev) { | 1712 | if (*pt_prev) { |
1707 | *ret = deliver_skb(*pskb, *pt_prev, orig_dev); | 1713 | *ret = deliver_skb(skb, *pt_prev, orig_dev); |
1708 | *pt_prev = NULL; | 1714 | *pt_prev = NULL; |
1709 | } | 1715 | } |
1710 | 1716 | ||
1711 | return br_handle_frame_hook(port, pskb); | 1717 | return br_handle_frame_hook(port, skb); |
1712 | } | 1718 | } |
1713 | #else | 1719 | #else |
1714 | #define handle_bridge(skb, pt_prev, ret, orig_dev) (0) | 1720 | #define handle_bridge(skb, pt_prev, ret, orig_dev) (skb) |
1715 | #endif | 1721 | #endif |
1716 | 1722 | ||
1717 | #ifdef CONFIG_NET_CLS_ACT | 1723 | #ifdef CONFIG_NET_CLS_ACT |
@@ -1818,7 +1824,8 @@ int netif_receive_skb(struct sk_buff *skb) | |||
1818 | ncls: | 1824 | ncls: |
1819 | #endif | 1825 | #endif |
1820 | 1826 | ||
1821 | if (handle_bridge(&skb, &pt_prev, &ret, orig_dev)) | 1827 | skb = handle_bridge(skb, &pt_prev, &ret, orig_dev); |
1828 | if (!skb) | ||
1822 | goto out; | 1829 | goto out; |
1823 | 1830 | ||
1824 | type = skb->protocol; | 1831 | type = skb->protocol; |