// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) /* Copyright (C) 2018 Netronome Systems, Inc */ /* Copyright (C) 2021 Corigine, Inc */ #include <net/xfrm.h> #include "../nfp_net.h" #include "nfd3.h" void nfp_nfd3_ipsec_tx(struct nfp_nfd3_tx_desc *txd, struct sk_buff *skb) { struct xfrm_state *x = xfrm_input_state(skb); struct xfrm_offload *xo = xfrm_offload(skb); struct iphdr *iph = ip_hdr(skb); int l4_proto; if (x->xso.dev && (x->xso.dev->features & NETIF_F_HW_ESP_TX_CSUM)) { txd->flags |= NFD3_DESC_TX_CSUM; if (iph->version == 4) txd->flags |= NFD3_DESC_TX_IP4_CSUM; if (x->props.mode == XFRM_MODE_TRANSPORT) l4_proto = xo->proto; else if (x->props.mode == XFRM_MODE_TUNNEL) l4_proto = xo->inner_ipproto; else return; switch (l4_proto) { case IPPROTO_UDP: txd->flags |= NFD3_DESC_TX_UDP_CSUM; return; case IPPROTO_TCP: txd->flags |= NFD3_DESC_TX_TCP_CSUM; return; } } }