]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
enic: Check inner ip proto for pseudo header csum
authorGovindarajulu Varadarajan <gvaradar@cisco.com>
Thu, 1 Mar 2018 19:07:19 +0000 (11:07 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 4 Mar 2018 23:19:25 +0000 (18:19 -0500)
To compute pseudo IP header csum, we need to check the inner header for
encap pkt, not outer IP header.

Also add pseudo csum for IPv6 inner pkt.

Signed-off-by: Govindarajulu Varadarajan <gvaradar@cisco.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/cisco/enic/enic_main.c

index f202ba72a8116af610216d756596747a27741104..252285894968d3c3989ab4bbccf2f038145ffea4 100644 (file)
@@ -635,12 +635,25 @@ static int enic_queue_wq_skb_csum_l4(struct enic *enic, struct vnic_wq *wq,
 
 static void enic_preload_tcp_csum_encap(struct sk_buff *skb)
 {
-       if (skb->protocol == cpu_to_be16(ETH_P_IP)) {
+       const struct ethhdr *eth = (struct ethhdr *)skb_inner_mac_header(skb);
+
+       switch (eth->h_proto) {
+       case ntohs(ETH_P_IP):
                inner_ip_hdr(skb)->check = 0;
                inner_tcp_hdr(skb)->check =
                        ~csum_tcpudp_magic(inner_ip_hdr(skb)->saddr,
                                           inner_ip_hdr(skb)->daddr, 0,
                                           IPPROTO_TCP, 0);
+               break;
+       case ntohs(ETH_P_IPV6):
+               inner_tcp_hdr(skb)->check =
+                       ~csum_ipv6_magic(&inner_ipv6_hdr(skb)->saddr,
+                                        &inner_ipv6_hdr(skb)->daddr, 0,
+                                        IPPROTO_TCP, 0);
+               break;
+       default:
+               WARN_ONCE(1, "Non ipv4/ipv6 inner pkt for encap offload");
+               break;
        }
 }