diff options
author | Jiri Pirko <jpirko@redhat.com> | 2010-05-05 21:33:53 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-05-16 02:48:02 -0400 |
commit | a14462f1bd4d3962994f518459102000438665aa (patch) | |
tree | 309eda1cd2698a5224713e43173edbd640f4487f /net | |
parent | 10fc51b9953112ade61e33ff2f6f005f005a2361 (diff) |
net: adjust handle_macvlan to pass port struct to hook
Now there's null check here and also again in the hook. Looking at bridge bits
which are simmilar, port structure is rcu_dereferenced right away in
handle_bridge and passed to hook. Looks nicer.
Signed-off-by: Jiri Pirko <jpirko@redhat.com>
Acked-by: Patrick McHardy <kaber@trash.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
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 3daee30a7c82..5cbba0927a8e 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) |