diff options
| -rw-r--r-- | net/core/datagram.c | 36 | ||||
| -rw-r--r-- | net/core/skbuff.c | 3 |
2 files changed, 29 insertions, 10 deletions
diff --git a/net/core/datagram.c b/net/core/datagram.c index 6b1c04ca1d50..488dd1a825c0 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
| @@ -739,22 +739,38 @@ __sum16 __skb_checksum_complete_head(struct sk_buff *skb, int len) | |||
| 739 | __sum16 sum; | 739 | __sum16 sum; |
| 740 | 740 | ||
| 741 | sum = csum_fold(skb_checksum(skb, 0, len, skb->csum)); | 741 | sum = csum_fold(skb_checksum(skb, 0, len, skb->csum)); |
| 742 | if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) && !sum && | 742 | if (likely(!sum)) { |
| 743 | !skb->csum_complete_sw) | 743 | if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) && |
| 744 | netdev_rx_csum_fault(skb->dev); | 744 | !skb->csum_complete_sw) |
| 745 | 745 | netdev_rx_csum_fault(skb->dev); | |
| 746 | /* Save checksum complete for later use */ | 746 | } |
| 747 | skb->csum = sum; | 747 | skb->csum_valid = !sum; |
| 748 | skb->ip_summed = CHECKSUM_COMPLETE; | ||
| 749 | skb->csum_complete_sw = 1; | ||
| 750 | |||
| 751 | return sum; | 748 | return sum; |
| 752 | } | 749 | } |
| 753 | EXPORT_SYMBOL(__skb_checksum_complete_head); | 750 | EXPORT_SYMBOL(__skb_checksum_complete_head); |
| 754 | 751 | ||
| 755 | __sum16 __skb_checksum_complete(struct sk_buff *skb) | 752 | __sum16 __skb_checksum_complete(struct sk_buff *skb) |
| 756 | { | 753 | { |
| 757 | return __skb_checksum_complete_head(skb, skb->len); | 754 | __wsum csum; |
| 755 | __sum16 sum; | ||
| 756 | |||
| 757 | csum = skb_checksum(skb, 0, skb->len, 0); | ||
| 758 | |||
| 759 | /* skb->csum holds pseudo checksum */ | ||
| 760 | sum = csum_fold(csum_add(skb->csum, csum)); | ||
| 761 | if (likely(!sum)) { | ||
| 762 | if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE) && | ||
| 763 | !skb->csum_complete_sw) | ||
| 764 | netdev_rx_csum_fault(skb->dev); | ||
| 765 | } | ||
| 766 | |||
| 767 | /* Save full packet checksum */ | ||
| 768 | skb->csum = csum; | ||
| 769 | skb->ip_summed = CHECKSUM_COMPLETE; | ||
| 770 | skb->csum_complete_sw = 1; | ||
| 771 | skb->csum_valid = !sum; | ||
| 772 | |||
| 773 | return sum; | ||
| 758 | } | 774 | } |
| 759 | EXPORT_SYMBOL(__skb_checksum_complete); | 775 | EXPORT_SYMBOL(__skb_checksum_complete); |
| 760 | 776 | ||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index bf92824af3f7..9cd5344fad73 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
| @@ -689,6 +689,9 @@ static void __copy_skb_header(struct sk_buff *new, const struct sk_buff *old) | |||
| 689 | new->ooo_okay = old->ooo_okay; | 689 | new->ooo_okay = old->ooo_okay; |
| 690 | new->no_fcs = old->no_fcs; | 690 | new->no_fcs = old->no_fcs; |
| 691 | new->encapsulation = old->encapsulation; | 691 | new->encapsulation = old->encapsulation; |
| 692 | new->encap_hdr_csum = old->encap_hdr_csum; | ||
| 693 | new->csum_valid = old->csum_valid; | ||
| 694 | new->csum_complete_sw = old->csum_complete_sw; | ||
| 692 | #ifdef CONFIG_XFRM | 695 | #ifdef CONFIG_XFRM |
| 693 | new->sp = secpath_get(old->sp); | 696 | new->sp = secpath_get(old->sp); |
| 694 | #endif | 697 | #endif |
