Skip to content

Commit 5281252

Browse files
committed
Merge branch 'nfp-ipsec-csum'
Simon Horman says: ==================== nfp: fix incorrect IPsec checksum handling this short series resolves two problems with IPsec checksum handling in the nfp driver. * PATCH 1/3, 2/3: Correct setting of checksum flags. One patch for each of the nfd3 and nfdk datapaths. * Patch 3/3: Correct configuration of NETIF_F_CSUM_MASK so that the stack does not unecessarily calculate csums for IPsec offload packets. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 84cba18 + 1cf78d4 commit 5281252

File tree

5 files changed

+41
-9
lines changed

5 files changed

+41
-9
lines changed

drivers/net/ethernet/netronome/nfp/nfd3/dp.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -324,14 +324,15 @@ netdev_tx_t nfp_nfd3_tx(struct sk_buff *skb, struct net_device *netdev)
324324

325325
/* Do not reorder - tso may adjust pkt cnt, vlan may override fields */
326326
nfp_nfd3_tx_tso(r_vec, txbuf, txd, skb, md_bytes);
327-
nfp_nfd3_tx_csum(dp, r_vec, txbuf, txd, skb);
327+
if (ipsec)
328+
nfp_nfd3_ipsec_tx(txd, skb);
329+
else
330+
nfp_nfd3_tx_csum(dp, r_vec, txbuf, txd, skb);
328331
if (skb_vlan_tag_present(skb) && dp->ctrl & NFP_NET_CFG_CTRL_TXVLAN) {
329332
txd->flags |= NFD3_DESC_TX_VLAN;
330333
txd->vlan = cpu_to_le16(skb_vlan_tag_get(skb));
331334
}
332335

333-
if (ipsec)
334-
nfp_nfd3_ipsec_tx(txd, skb);
335336
/* Gather DMA */
336337
if (nr_frags > 0) {
337338
__le64 second_half;

drivers/net/ethernet/netronome/nfp/nfd3/ipsec.c

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,30 @@
1010
void nfp_nfd3_ipsec_tx(struct nfp_nfd3_tx_desc *txd, struct sk_buff *skb)
1111
{
1212
struct xfrm_state *x = xfrm_input_state(skb);
13+
struct xfrm_offload *xo = xfrm_offload(skb);
14+
struct iphdr *iph = ip_hdr(skb);
15+
int l4_proto;
1316

1417
if (x->xso.dev && (x->xso.dev->features & NETIF_F_HW_ESP_TX_CSUM)) {
15-
txd->flags |= NFD3_DESC_TX_CSUM | NFD3_DESC_TX_IP4_CSUM |
16-
NFD3_DESC_TX_TCP_CSUM | NFD3_DESC_TX_UDP_CSUM;
18+
txd->flags |= NFD3_DESC_TX_CSUM;
19+
20+
if (iph->version == 4)
21+
txd->flags |= NFD3_DESC_TX_IP4_CSUM;
22+
23+
if (x->props.mode == XFRM_MODE_TRANSPORT)
24+
l4_proto = xo->proto;
25+
else if (x->props.mode == XFRM_MODE_TUNNEL)
26+
l4_proto = xo->inner_ipproto;
27+
else
28+
return;
29+
30+
switch (l4_proto) {
31+
case IPPROTO_UDP:
32+
txd->flags |= NFD3_DESC_TX_UDP_CSUM;
33+
return;
34+
case IPPROTO_TCP:
35+
txd->flags |= NFD3_DESC_TX_TCP_CSUM;
36+
return;
37+
}
1738
}
1839
}

drivers/net/ethernet/netronome/nfp/nfdk/dp.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -387,15 +387,17 @@ netdev_tx_t nfp_nfdk_tx(struct sk_buff *skb, struct net_device *netdev)
387387
if (!skb_is_gso(skb)) {
388388
real_len = skb->len;
389389
/* Metadata desc */
390-
metadata = nfp_nfdk_tx_csum(dp, r_vec, 1, skb, metadata);
390+
if (!ipsec)
391+
metadata = nfp_nfdk_tx_csum(dp, r_vec, 1, skb, metadata);
391392
txd->raw = cpu_to_le64(metadata);
392393
txd++;
393394
} else {
394395
/* lso desc should be placed after metadata desc */
395396
(txd + 1)->raw = nfp_nfdk_tx_tso(r_vec, txbuf, skb);
396397
real_len = txbuf->real_len;
397398
/* Metadata desc */
398-
metadata = nfp_nfdk_tx_csum(dp, r_vec, txbuf->pkt_cnt, skb, metadata);
399+
if (!ipsec)
400+
metadata = nfp_nfdk_tx_csum(dp, r_vec, txbuf->pkt_cnt, skb, metadata);
399401
txd->raw = cpu_to_le64(metadata);
400402
txd += 2;
401403
txbuf++;

drivers/net/ethernet/netronome/nfp/nfdk/ipsec.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@
99
u64 nfp_nfdk_ipsec_tx(u64 flags, struct sk_buff *skb)
1010
{
1111
struct xfrm_state *x = xfrm_input_state(skb);
12+
struct iphdr *iph = ip_hdr(skb);
1213

13-
if (x->xso.dev && (x->xso.dev->features & NETIF_F_HW_ESP_TX_CSUM))
14-
flags |= NFDK_DESC_TX_L3_CSUM | NFDK_DESC_TX_L4_CSUM;
14+
if (x->xso.dev && (x->xso.dev->features & NETIF_F_HW_ESP_TX_CSUM)) {
15+
if (iph->version == 4)
16+
flags |= NFDK_DESC_TX_L3_CSUM;
17+
flags |= NFDK_DESC_TX_L4_CSUM;
18+
}
1519

1620
return flags;
1721
}

drivers/net/ethernet/netronome/nfp/nfp_net_common.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
#include <net/tls.h>
3939
#include <net/vxlan.h>
4040
#include <net/xdp_sock_drv.h>
41+
#include <net/xfrm.h>
4142

4243
#include "nfpcore/nfp_dev.h"
4344
#include "nfpcore/nfp_nsp.h"
@@ -1897,6 +1898,9 @@ nfp_net_features_check(struct sk_buff *skb, struct net_device *dev,
18971898
features &= ~NETIF_F_GSO_MASK;
18981899
}
18991900

1901+
if (xfrm_offload(skb))
1902+
return features;
1903+
19001904
/* VXLAN/GRE check */
19011905
switch (vlan_get_protocol(skb)) {
19021906
case htons(ETH_P_IP):

0 commit comments

Comments
 (0)