Skip to content

Commit 65d88fd

Browse files
borkmanndavem330
authored andcommitted
bpf, nfp: add meta data support
Implement support for transferring XDP meta data into skb for nfp driver; before calling into the program, xdp.data_meta points to xdp.data, where on program return with pass verdict, we call into skb_metadata_set(). Signed-off-by: Daniel Borkmann <[email protected]> Acked-by: Alexei Starovoitov <[email protected]> Acked-by: John Fastabend <[email protected]> Reviewed-by: Jakub Kicinski <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 22c8852 commit 65d88fd

File tree

1 file changed

+15
-25
lines changed

1 file changed

+15
-25
lines changed

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

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,27 +1574,6 @@ nfp_net_tx_xdp_buf(struct nfp_net_dp *dp, struct nfp_net_rx_ring *rx_ring,
15741574
return true;
15751575
}
15761576

1577-
static int nfp_net_run_xdp(struct bpf_prog *prog, void *data, void *hard_start,
1578-
unsigned int *off, unsigned int *len)
1579-
{
1580-
struct xdp_buff xdp;
1581-
void *orig_data;
1582-
int ret;
1583-
1584-
xdp.data_hard_start = hard_start;
1585-
xdp.data = data + *off;
1586-
xdp_set_data_meta_invalid(&xdp);
1587-
xdp.data_end = data + *off + *len;
1588-
1589-
orig_data = xdp.data;
1590-
ret = bpf_prog_run_xdp(prog, &xdp);
1591-
1592-
*len -= xdp.data - orig_data;
1593-
*off += xdp.data - orig_data;
1594-
1595-
return ret;
1596-
}
1597-
15981577
/**
15991578
* nfp_net_rx() - receive up to @budget packets on @rx_ring
16001579
* @rx_ring: RX ring to receive from
@@ -1630,6 +1609,7 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
16301609
struct nfp_meta_parsed meta;
16311610
struct net_device *netdev;
16321611
dma_addr_t new_dma_addr;
1612+
u32 meta_len_xdp = 0;
16331613
void *new_frag;
16341614

16351615
idx = D_IDX(rx_ring, rx_ring->rd_p);
@@ -1708,16 +1688,24 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
17081688

17091689
if (xdp_prog && !(rxd->rxd.flags & PCIE_DESC_RX_BPF &&
17101690
dp->bpf_offload_xdp) && !meta.portid) {
1691+
void *orig_data = rxbuf->frag + pkt_off;
17111692
unsigned int dma_off;
1712-
void *hard_start;
1693+
struct xdp_buff xdp;
17131694
int act;
17141695

1715-
hard_start = rxbuf->frag + NFP_NET_RX_BUF_HEADROOM;
1696+
xdp.data_hard_start = rxbuf->frag + NFP_NET_RX_BUF_HEADROOM;
1697+
xdp.data = orig_data;
1698+
xdp.data_meta = orig_data;
1699+
xdp.data_end = orig_data + pkt_len;
1700+
1701+
act = bpf_prog_run_xdp(xdp_prog, &xdp);
1702+
1703+
pkt_len -= xdp.data - orig_data;
1704+
pkt_off += xdp.data - orig_data;
17161705

1717-
act = nfp_net_run_xdp(xdp_prog, rxbuf->frag, hard_start,
1718-
&pkt_off, &pkt_len);
17191706
switch (act) {
17201707
case XDP_PASS:
1708+
meta_len_xdp = xdp.data - xdp.data_meta;
17211709
break;
17221710
case XDP_TX:
17231711
dma_off = pkt_off - NFP_NET_RX_BUF_HEADROOM;
@@ -1785,6 +1773,8 @@ static int nfp_net_rx(struct nfp_net_rx_ring *rx_ring, int budget)
17851773
if (rxd->rxd.flags & PCIE_DESC_RX_VLAN)
17861774
__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
17871775
le16_to_cpu(rxd->rxd.vlan));
1776+
if (meta_len_xdp)
1777+
skb_metadata_set(skb, meta_len_xdp);
17881778

17891779
napi_gro_receive(&rx_ring->r_vec->napi, skb);
17901780
}

0 commit comments

Comments
 (0)