aboutsummaryrefslogtreecommitdiffstats
path: root/net/bridge/br_forward.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/bridge/br_forward.c')
-rw-r--r--net/bridge/br_forward.c9
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
38static 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
43int br_dev_queue_push_xmit(struct sk_buff *skb) 38int 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);