162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 262306a36Sopenharmony_ci/* Copyright (C) 2018 Netronome Systems, Inc */ 362306a36Sopenharmony_ci/* Copyright (C) 2021 Corigine, Inc */ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <net/xfrm.h> 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include "../nfp_net.h" 862306a36Sopenharmony_ci#include "nfd3.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_civoid nfp_nfd3_ipsec_tx(struct nfp_nfd3_tx_desc *txd, struct sk_buff *skb) 1162306a36Sopenharmony_ci{ 1262306a36Sopenharmony_ci struct xfrm_state *x = xfrm_input_state(skb); 1362306a36Sopenharmony_ci struct xfrm_offload *xo = xfrm_offload(skb); 1462306a36Sopenharmony_ci struct iphdr *iph = ip_hdr(skb); 1562306a36Sopenharmony_ci int l4_proto; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci if (x->xso.dev && (x->xso.dev->features & NETIF_F_HW_ESP_TX_CSUM)) { 1862306a36Sopenharmony_ci txd->flags |= NFD3_DESC_TX_CSUM; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci if (iph->version == 4) 2162306a36Sopenharmony_ci txd->flags |= NFD3_DESC_TX_IP4_CSUM; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci if (x->props.mode == XFRM_MODE_TRANSPORT) 2462306a36Sopenharmony_ci l4_proto = xo->proto; 2562306a36Sopenharmony_ci else if (x->props.mode == XFRM_MODE_TUNNEL) 2662306a36Sopenharmony_ci l4_proto = xo->inner_ipproto; 2762306a36Sopenharmony_ci else 2862306a36Sopenharmony_ci return; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci switch (l4_proto) { 3162306a36Sopenharmony_ci case IPPROTO_UDP: 3262306a36Sopenharmony_ci txd->flags |= NFD3_DESC_TX_UDP_CSUM; 3362306a36Sopenharmony_ci return; 3462306a36Sopenharmony_ci case IPPROTO_TCP: 3562306a36Sopenharmony_ci txd->flags |= NFD3_DESC_TX_TCP_CSUM; 3662306a36Sopenharmony_ci return; 3762306a36Sopenharmony_ci } 3862306a36Sopenharmony_ci } 3962306a36Sopenharmony_ci} 40