157f273adSHuanhuan Wang // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 257f273adSHuanhuan Wang /* Copyright (C) 2018 Netronome Systems, Inc */ 357f273adSHuanhuan Wang /* Copyright (C) 2021 Corigine, Inc */ 457f273adSHuanhuan Wang 557f273adSHuanhuan Wang #include <net/xfrm.h> 657f273adSHuanhuan Wang 757f273adSHuanhuan Wang #include "../nfp_net.h" 857f273adSHuanhuan Wang #include "nfd3.h" 957f273adSHuanhuan Wang nfp_nfd3_ipsec_tx(struct nfp_nfd3_tx_desc * txd,struct sk_buff * skb)1057f273adSHuanhuan Wangvoid nfp_nfd3_ipsec_tx(struct nfp_nfd3_tx_desc *txd, struct sk_buff *skb) 1157f273adSHuanhuan Wang { 1257f273adSHuanhuan Wang struct xfrm_state *x = xfrm_input_state(skb); 13*3e04419cSHuanhuan Wang struct xfrm_offload *xo = xfrm_offload(skb); 14*3e04419cSHuanhuan Wang struct iphdr *iph = ip_hdr(skb); 15*3e04419cSHuanhuan Wang int l4_proto; 1657f273adSHuanhuan Wang 1757f273adSHuanhuan Wang if (x->xso.dev && (x->xso.dev->features & NETIF_F_HW_ESP_TX_CSUM)) { 18*3e04419cSHuanhuan Wang txd->flags |= NFD3_DESC_TX_CSUM; 19*3e04419cSHuanhuan Wang 20*3e04419cSHuanhuan Wang if (iph->version == 4) 21*3e04419cSHuanhuan Wang txd->flags |= NFD3_DESC_TX_IP4_CSUM; 22*3e04419cSHuanhuan Wang 23*3e04419cSHuanhuan Wang if (x->props.mode == XFRM_MODE_TRANSPORT) 24*3e04419cSHuanhuan Wang l4_proto = xo->proto; 25*3e04419cSHuanhuan Wang else if (x->props.mode == XFRM_MODE_TUNNEL) 26*3e04419cSHuanhuan Wang l4_proto = xo->inner_ipproto; 27*3e04419cSHuanhuan Wang else 28*3e04419cSHuanhuan Wang return; 29*3e04419cSHuanhuan Wang 30*3e04419cSHuanhuan Wang switch (l4_proto) { 31*3e04419cSHuanhuan Wang case IPPROTO_UDP: 32*3e04419cSHuanhuan Wang txd->flags |= NFD3_DESC_TX_UDP_CSUM; 33*3e04419cSHuanhuan Wang return; 34*3e04419cSHuanhuan Wang case IPPROTO_TCP: 35*3e04419cSHuanhuan Wang txd->flags |= NFD3_DESC_TX_TCP_CSUM; 36*3e04419cSHuanhuan Wang return; 37*3e04419cSHuanhuan Wang } 3857f273adSHuanhuan Wang } 3957f273adSHuanhuan Wang } 40