Skip to content

Commit

Permalink
nfp: fix incorrectly set csum flag for nfd3 path
Browse files Browse the repository at this point in the history
[ Upstream commit 3e04419 ]

The csum flag of IPsec packet are set repeatedly. Therefore, the csum
flag set of IPsec and non-IPsec packet need to be distinguished.

As the ipv6 header does not have a csum field, so l3-csum flag is not
required to be set for ipv6 case.

L4-csum flag include the tcp csum flag and udp csum flag, we shouldn't
set the udp and tcp csum flag at the same time for one packet, should
set l4-csum flag according to the transport layer is tcp or udp.

Fixes: 57f273a ("nfp: add framework to support ipsec offloading")
Signed-off-by: Huanhuan Wang <huanhuan.wang@corigine.com>
Reviewed-by: Louis Peens <louis.peens@corigine.com>
Signed-off-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
  • Loading branch information
wanghuanhuan12 authored and gregkh committed Mar 17, 2023
1 parent 8cfbdda commit c9d24c3
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 5 deletions.
7 changes: 4 additions & 3 deletions drivers/net/ethernet/netronome/nfp/nfd3/dp.c
Expand Up @@ -327,14 +327,15 @@ netdev_tx_t nfp_nfd3_tx(struct sk_buff *skb, struct net_device *netdev)

/* Do not reorder - tso may adjust pkt cnt, vlan may override fields */
nfp_nfd3_tx_tso(r_vec, txbuf, txd, skb, md_bytes);
nfp_nfd3_tx_csum(dp, r_vec, txbuf, txd, skb);
if (ipsec)
nfp_nfd3_ipsec_tx(txd, skb);
else
nfp_nfd3_tx_csum(dp, r_vec, txbuf, txd, skb);
if (skb_vlan_tag_present(skb) && dp->ctrl & NFP_NET_CFG_CTRL_TXVLAN) {
txd->flags |= NFD3_DESC_TX_VLAN;
txd->vlan = cpu_to_le16(skb_vlan_tag_get(skb));
}

if (ipsec)
nfp_nfd3_ipsec_tx(txd, skb);
/* Gather DMA */
if (nr_frags > 0) {
__le64 second_half;
Expand Down
25 changes: 23 additions & 2 deletions drivers/net/ethernet/netronome/nfp/nfd3/ipsec.c
Expand Up @@ -10,9 +10,30 @@
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 | NFD3_DESC_TX_IP4_CSUM |
NFD3_DESC_TX_TCP_CSUM | NFD3_DESC_TX_UDP_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;
}
}
}

0 comments on commit c9d24c3

Please sign in to comment.