From a3452e089f43cd80957622bc1c59c6ed5bc6f38c Mon Sep 17 00:00:00 2001 From: Daniel Lezcano Date: Wed, 30 Mar 2011 02:42:17 -0700 Subject: [PATCH] --- yaml --- r: 243559 b: refs/heads/master c: 79b569f0ec53a14c4d71e79d93a8676d9a0fda6d h: refs/heads/master i: 243557: f050c90ec9092b20d04f554e7710486ae652da63 243555: 3a9f55567a68dc3772ac810cceeab3bc22b872e9 243551: 640cefbd3b52610f85348f3a56866d0a8578cefa v: v3 --- [refs] | 2 +- trunk/net/core/dev.c | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 990041c5b946..4eb835cf954e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7a635ea989991d7f12d57a12f2ba7cb6d211e083 +refs/heads/master: 79b569f0ec53a14c4d71e79d93a8676d9a0fda6d diff --git a/trunk/net/core/dev.c b/trunk/net/core/dev.c index 563ddc28139d..3da9fb06d47a 100644 --- a/trunk/net/core/dev.c +++ b/trunk/net/core/dev.c @@ -1454,6 +1454,27 @@ static inline void net_timestamp_check(struct sk_buff *skb) __net_timestamp(skb); } +static inline bool is_skb_forwardable(struct net_device *dev, + struct sk_buff *skb) +{ + unsigned int len; + + if (!(dev->flags & IFF_UP)) + return false; + + len = dev->mtu + dev->hard_header_len + VLAN_HLEN; + if (skb->len <= len) + return true; + + /* if TSO is enabled, we don't care about the length as the packet + * could be forwarded without being segmented before + */ + if (skb_is_gso(skb)) + return true; + + return false; +} + /** * dev_forward_skb - loopback an skb to another netif * @@ -1477,8 +1498,7 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb) skb_orphan(skb); nf_reset(skb); - if (unlikely(!(dev->flags & IFF_UP) || - (skb->len > (dev->mtu + dev->hard_header_len + VLAN_HLEN)))) { + if (unlikely(!is_skb_forwardable(dev, skb))) { atomic_long_inc(&dev->rx_dropped); kfree_skb(skb); return NET_RX_DROP;