diff options
| author | Paul Durrant <Paul.Durrant@citrix.com> | 2014-01-09 05:02:48 -0500 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2014-01-14 17:24:19 -0500 |
| commit | b5cf66cd114ca24757ccf7c1f3e4d8ed86fe868c (patch) | |
| tree | 66260c1adbda75fb290ca7085337045c91706aef | |
| parent | 2721637c1c0f644d7d67d0698c4a32b440d7f0f8 (diff) | |
xen-netfront: use new skb_checksum_setup function
Use skb_checksum_setup to set up partial checksum offsets rather
then a private implementation.
Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com>
Cc: David Vrabel <david.vrabel@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | drivers/net/xen-netfront.c | 48 |
1 files changed, 3 insertions, 45 deletions
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c index e59acb1daa23..c41537b577a4 100644 --- a/drivers/net/xen-netfront.c +++ b/drivers/net/xen-netfront.c | |||
| @@ -859,9 +859,7 @@ static RING_IDX xennet_fill_frags(struct netfront_info *np, | |||
| 859 | 859 | ||
| 860 | static int checksum_setup(struct net_device *dev, struct sk_buff *skb) | 860 | static int checksum_setup(struct net_device *dev, struct sk_buff *skb) |
| 861 | { | 861 | { |
| 862 | struct iphdr *iph; | 862 | bool recalculate_partial_csum = false; |
| 863 | int err = -EPROTO; | ||
| 864 | int recalculate_partial_csum = 0; | ||
| 865 | 863 | ||
| 866 | /* | 864 | /* |
| 867 | * A GSO SKB must be CHECKSUM_PARTIAL. However some buggy | 865 | * A GSO SKB must be CHECKSUM_PARTIAL. However some buggy |
| @@ -873,54 +871,14 @@ static int checksum_setup(struct net_device *dev, struct sk_buff *skb) | |||
| 873 | struct netfront_info *np = netdev_priv(dev); | 871 | struct netfront_info *np = netdev_priv(dev); |
| 874 | np->rx_gso_checksum_fixup++; | 872 | np->rx_gso_checksum_fixup++; |
| 875 | skb->ip_summed = CHECKSUM_PARTIAL; | 873 | skb->ip_summed = CHECKSUM_PARTIAL; |
| 876 | recalculate_partial_csum = 1; | 874 | recalculate_partial_csum = true; |
| 877 | } | 875 | } |
| 878 | 876 | ||
| 879 | /* A non-CHECKSUM_PARTIAL SKB does not require setup. */ | 877 | /* A non-CHECKSUM_PARTIAL SKB does not require setup. */ |
| 880 | if (skb->ip_summed != CHECKSUM_PARTIAL) | 878 | if (skb->ip_summed != CHECKSUM_PARTIAL) |
| 881 | return 0; | 879 | return 0; |
| 882 | 880 | ||
| 883 | if (skb->protocol != htons(ETH_P_IP)) | 881 | return skb_checksum_setup(skb, recalculate_partial_csum); |
| 884 | goto out; | ||
| 885 | |||
| 886 | iph = (void *)skb->data; | ||
| 887 | |||
| 888 | switch (iph->protocol) { | ||
| 889 | case IPPROTO_TCP: | ||
| 890 | if (!skb_partial_csum_set(skb, 4 * iph->ihl, | ||
| 891 | offsetof(struct tcphdr, check))) | ||
| 892 | goto out; | ||
| 893 | |||
| 894 | if (recalculate_partial_csum) { | ||
| 895 | struct tcphdr *tcph = tcp_hdr(skb); | ||
| 896 | tcph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, | ||
| 897 | skb->len - iph->ihl*4, | ||
| 898 | IPPROTO_TCP, 0); | ||
| 899 | } | ||
| 900 | break; | ||
| 901 | case IPPROTO_UDP: | ||
| 902 | if (!skb_partial_csum_set(skb, 4 * iph->ihl, | ||
| 903 | offsetof(struct udphdr, check))) | ||
| 904 | goto out; | ||
| 905 | |||
| 906 | if (recalculate_partial_csum) { | ||
| 907 | struct udphdr *udph = udp_hdr(skb); | ||
| 908 | udph->check = ~csum_tcpudp_magic(iph->saddr, iph->daddr, | ||
| 909 | skb->len - iph->ihl*4, | ||
| 910 | IPPROTO_UDP, 0); | ||
| 911 | } | ||
| 912 | break; | ||
| 913 | default: | ||
| 914 | if (net_ratelimit()) | ||
| 915 | pr_err("Attempting to checksum a non-TCP/UDP packet, dropping a protocol %d packet\n", | ||
| 916 | iph->protocol); | ||
| 917 | goto out; | ||
| 918 | } | ||
| 919 | |||
| 920 | err = 0; | ||
| 921 | |||
| 922 | out: | ||
| 923 | return err; | ||
| 924 | } | 882 | } |
| 925 | 883 | ||
| 926 | static int handle_incoming_queue(struct net_device *dev, | 884 | static int handle_incoming_queue(struct net_device *dev, |
