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 <gvara...@cisco.com>
---
 drivers/net/ethernet/cisco/enic/enic_main.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c 
b/drivers/net/ethernet/cisco/enic/enic_main.c
index f202ba72a811..252285894968 100644
--- a/drivers/net/ethernet/cisco/enic/enic_main.c
+++ b/drivers/net/ethernet/cisco/enic/enic_main.c
@@ -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;
        }
 }
 
-- 
2.16.2

Reply via email to