diff options
Diffstat (limited to 'net/core/dev.c')
-rw-r--r-- | net/core/dev.c | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/net/core/dev.c b/net/core/dev.c index 820bac239738..6666b28b6815 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -1766,19 +1766,14 @@ EXPORT_SYMBOL_GPL(is_skb_forwardable); | |||
1766 | 1766 | ||
1767 | int __dev_forward_skb(struct net_device *dev, struct sk_buff *skb) | 1767 | int __dev_forward_skb(struct net_device *dev, struct sk_buff *skb) |
1768 | { | 1768 | { |
1769 | if (skb_orphan_frags(skb, GFP_ATOMIC) || | 1769 | int ret = ____dev_forward_skb(dev, skb); |
1770 | unlikely(!is_skb_forwardable(dev, skb))) { | ||
1771 | atomic_long_inc(&dev->rx_dropped); | ||
1772 | kfree_skb(skb); | ||
1773 | return NET_RX_DROP; | ||
1774 | } | ||
1775 | 1770 | ||
1776 | skb_scrub_packet(skb, true); | 1771 | if (likely(!ret)) { |
1777 | skb->priority = 0; | 1772 | skb->protocol = eth_type_trans(skb, dev); |
1778 | skb->protocol = eth_type_trans(skb, dev); | 1773 | skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); |
1779 | skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); | 1774 | } |
1780 | 1775 | ||
1781 | return 0; | 1776 | return ret; |
1782 | } | 1777 | } |
1783 | EXPORT_SYMBOL_GPL(__dev_forward_skb); | 1778 | EXPORT_SYMBOL_GPL(__dev_forward_skb); |
1784 | 1779 | ||
@@ -2484,7 +2479,7 @@ int skb_checksum_help(struct sk_buff *skb) | |||
2484 | goto out; | 2479 | goto out; |
2485 | } | 2480 | } |
2486 | 2481 | ||
2487 | *(__sum16 *)(skb->data + offset) = csum_fold(csum); | 2482 | *(__sum16 *)(skb->data + offset) = csum_fold(csum) ?: CSUM_MANGLED_0; |
2488 | out_set_summed: | 2483 | out_set_summed: |
2489 | skb->ip_summed = CHECKSUM_NONE; | 2484 | skb->ip_summed = CHECKSUM_NONE; |
2490 | out: | 2485 | out: |