diff options
Diffstat (limited to 'net/bridge/br_forward.c')
-rw-r--r-- | net/bridge/br_forward.c | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/net/bridge/br_forward.c b/net/bridge/br_forward.c index d3409e6b5453..056b67b0e277 100644 --- a/net/bridge/br_forward.c +++ b/net/bridge/br_forward.c | |||
@@ -35,16 +35,11 @@ static inline int should_deliver(const struct net_bridge_port *p, | |||
35 | p->state == BR_STATE_FORWARDING; | 35 | p->state == BR_STATE_FORWARDING; |
36 | } | 36 | } |
37 | 37 | ||
38 | static inline unsigned int packet_length(const struct sk_buff *skb) | ||
39 | { | ||
40 | return skb->len - (skb->protocol == htons(ETH_P_8021Q) ? VLAN_HLEN : 0); | ||
41 | } | ||
42 | |||
43 | int br_dev_queue_push_xmit(struct sk_buff *skb) | 38 | int br_dev_queue_push_xmit(struct sk_buff *skb) |
44 | { | 39 | { |
45 | /* ip_fragment doesn't copy the MAC header */ | 40 | /* ip_fragment doesn't copy the MAC header */ |
46 | if (nf_bridge_maybe_copy_header(skb) || | 41 | if (nf_bridge_maybe_copy_header(skb) || |
47 | (packet_length(skb) > skb->dev->mtu && !skb_is_gso(skb))) { | 42 | !is_skb_forwardable(skb->dev, skb)) { |
48 | kfree_skb(skb); | 43 | kfree_skb(skb); |
49 | } else { | 44 | } else { |
50 | skb_push(skb, ETH_HLEN); | 45 | skb_push(skb, ETH_HLEN); |
@@ -71,7 +66,7 @@ static void __br_deliver(const struct net_bridge_port *to, struct sk_buff *skb) | |||
71 | skb->dev = to->dev; | 66 | skb->dev = to->dev; |
72 | 67 | ||
73 | if (unlikely(netpoll_tx_running(to->br->dev))) { | 68 | if (unlikely(netpoll_tx_running(to->br->dev))) { |
74 | if (packet_length(skb) > skb->dev->mtu && !skb_is_gso(skb)) | 69 | if (!is_skb_forwardable(skb->dev, skb)) |
75 | kfree_skb(skb); | 70 | kfree_skb(skb); |
76 | else { | 71 | else { |
77 | skb_push(skb, ETH_HLEN); | 72 | skb_push(skb, ETH_HLEN); |