diff options
Diffstat (limited to 'include/net/xdp.h')
-rw-r--r-- | include/net/xdp.h | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/include/net/xdp.h b/include/net/xdp.h new file mode 100644 index 000000000000..b2362ddfa694 --- /dev/null +++ b/include/net/xdp.h | |||
@@ -0,0 +1,48 @@ | |||
1 | /* include/net/xdp.h | ||
2 | * | ||
3 | * Copyright (c) 2017 Jesper Dangaard Brouer, Red Hat Inc. | ||
4 | * Released under terms in GPL version 2. See COPYING. | ||
5 | */ | ||
6 | #ifndef __LINUX_NET_XDP_H__ | ||
7 | #define __LINUX_NET_XDP_H__ | ||
8 | |||
9 | /** | ||
10 | * DOC: XDP RX-queue information | ||
11 | * | ||
12 | * The XDP RX-queue info (xdp_rxq_info) is associated with the driver | ||
13 | * level RX-ring queues. It is information that is specific to how | ||
14 | * the driver have configured a given RX-ring queue. | ||
15 | * | ||
16 | * Each xdp_buff frame received in the driver carry a (pointer) | ||
17 | * reference to this xdp_rxq_info structure. This provides the XDP | ||
18 | * data-path read-access to RX-info for both kernel and bpf-side | ||
19 | * (limited subset). | ||
20 | * | ||
21 | * For now, direct access is only safe while running in NAPI/softirq | ||
22 | * context. Contents is read-mostly and must not be updated during | ||
23 | * driver NAPI/softirq poll. | ||
24 | * | ||
25 | * The driver usage API is a register and unregister API. | ||
26 | * | ||
27 | * The struct is not directly tied to the XDP prog. A new XDP prog | ||
28 | * can be attached as long as it doesn't change the underlying | ||
29 | * RX-ring. If the RX-ring does change significantly, the NIC driver | ||
30 | * naturally need to stop the RX-ring before purging and reallocating | ||
31 | * memory. In that process the driver MUST call unregistor (which | ||
32 | * also apply for driver shutdown and unload). The register API is | ||
33 | * also mandatory during RX-ring setup. | ||
34 | */ | ||
35 | |||
36 | struct xdp_rxq_info { | ||
37 | struct net_device *dev; | ||
38 | u32 queue_index; | ||
39 | u32 reg_state; | ||
40 | } ____cacheline_aligned; /* perf critical, avoid false-sharing */ | ||
41 | |||
42 | int xdp_rxq_info_reg(struct xdp_rxq_info *xdp_rxq, | ||
43 | struct net_device *dev, u32 queue_index); | ||
44 | void xdp_rxq_info_unreg(struct xdp_rxq_info *xdp_rxq); | ||
45 | void xdp_rxq_info_unused(struct xdp_rxq_info *xdp_rxq); | ||
46 | bool xdp_rxq_info_is_reg(struct xdp_rxq_info *xdp_rxq); | ||
47 | |||
48 | #endif /* __LINUX_NET_XDP_H__ */ | ||