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