diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/core/dev.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 3daee30a7c8..5cbba0927a8 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -2612,7 +2612,8 @@ static inline struct sk_buff *handle_bridge(struct sk_buff *skb, | |||
2612 | #endif | 2612 | #endif |
2613 | 2613 | ||
2614 | #if defined(CONFIG_MACVLAN) || defined(CONFIG_MACVLAN_MODULE) | 2614 | #if defined(CONFIG_MACVLAN) || defined(CONFIG_MACVLAN_MODULE) |
2615 | struct sk_buff *(*macvlan_handle_frame_hook)(struct sk_buff *skb) __read_mostly; | 2615 | struct sk_buff *(*macvlan_handle_frame_hook)(struct macvlan_port *p, |
2616 | struct sk_buff *skb) __read_mostly; | ||
2616 | EXPORT_SYMBOL_GPL(macvlan_handle_frame_hook); | 2617 | EXPORT_SYMBOL_GPL(macvlan_handle_frame_hook); |
2617 | 2618 | ||
2618 | static inline struct sk_buff *handle_macvlan(struct sk_buff *skb, | 2619 | static inline struct sk_buff *handle_macvlan(struct sk_buff *skb, |
@@ -2620,14 +2621,17 @@ static inline struct sk_buff *handle_macvlan(struct sk_buff *skb, | |||
2620 | int *ret, | 2621 | int *ret, |
2621 | struct net_device *orig_dev) | 2622 | struct net_device *orig_dev) |
2622 | { | 2623 | { |
2623 | if (skb->dev->macvlan_port == NULL) | 2624 | struct macvlan_port *port; |
2625 | |||
2626 | port = rcu_dereference(skb->dev->macvlan_port); | ||
2627 | if (!port) | ||
2624 | return skb; | 2628 | return skb; |
2625 | 2629 | ||
2626 | if (*pt_prev) { | 2630 | if (*pt_prev) { |
2627 | *ret = deliver_skb(skb, *pt_prev, orig_dev); | 2631 | *ret = deliver_skb(skb, *pt_prev, orig_dev); |
2628 | *pt_prev = NULL; | 2632 | *pt_prev = NULL; |
2629 | } | 2633 | } |
2630 | return macvlan_handle_frame_hook(skb); | 2634 | return macvlan_handle_frame_hook(port, skb); |
2631 | } | 2635 | } |
2632 | #else | 2636 | #else |
2633 | #define handle_macvlan(skb, pt_prev, ret, orig_dev) (skb) | 2637 | #define handle_macvlan(skb, pt_prev, ret, orig_dev) (skb) |