xref: /linux/include/net/xdp_sock.h (revision 782347b6)
1dac09149SBjörn Töpel /* SPDX-License-Identifier: GPL-2.0 */
2dac09149SBjörn Töpel /* AF_XDP internal functions
3c0c77d8fSBjörn Töpel  * Copyright(c) 2018 Intel Corporation.
4c0c77d8fSBjörn Töpel  */
5c0c77d8fSBjörn Töpel 
6c0c77d8fSBjörn Töpel #ifndef _LINUX_XDP_SOCK_H
7c0c77d8fSBjörn Töpel #define _LINUX_XDP_SOCK_H
8c0c77d8fSBjörn Töpel 
9e61e62b9SBjörn Töpel #include <linux/workqueue.h>
10e61e62b9SBjörn Töpel #include <linux/if_xdp.h>
11c0c77d8fSBjörn Töpel #include <linux/mutex.h>
12ac98d8aaSMagnus Karlsson #include <linux/spinlock.h>
13e61e62b9SBjörn Töpel #include <linux/mm.h>
14c0c77d8fSBjörn Töpel #include <net/sock.h>
15c0c77d8fSBjörn Töpel 
16b9b6b68eSBjörn Töpel struct net_device;
17b9b6b68eSBjörn Töpel struct xsk_queue;
18a71506a4SMagnus Karlsson struct xdp_buff;
19e61e62b9SBjörn Töpel 
20e61e62b9SBjörn Töpel struct xdp_umem {
217f7ffa4eSMagnus Karlsson 	void *addrs;
2293ee30f3SMagnus Karlsson 	u64 size;
23e61e62b9SBjörn Töpel 	u32 headroom;
242b43470aSBjörn Töpel 	u32 chunk_size;
251c1efc2aSMagnus Karlsson 	u32 chunks;
268ef4e27eSMagnus Karlsson 	u32 npgs;
27e61e62b9SBjörn Töpel 	struct user_struct *user;
28e61e62b9SBjörn Töpel 	refcount_t users;
2977cd0d7bSMagnus Karlsson 	u8 flags;
30173d3adbSBjörn Töpel 	bool zc;
318ef4e27eSMagnus Karlsson 	struct page **pgs;
328ef4e27eSMagnus Karlsson 	int id;
33921b6869SMagnus Karlsson 	struct list_head xsk_dma_list;
34537cf4e3SMagnus Karlsson 	struct work_struct work;
35e61e62b9SBjörn Töpel };
36c0c77d8fSBjörn Töpel 
37d817991cSBjörn Töpel struct xsk_map {
38d817991cSBjörn Töpel 	struct bpf_map map;
39d817991cSBjörn Töpel 	spinlock_t lock; /* Synchronize map updates */
40*782347b6SToke Høiland-Jørgensen 	struct xdp_sock __rcu *xsk_map[];
41d817991cSBjörn Töpel };
42d817991cSBjörn Töpel 
43c0c77d8fSBjörn Töpel struct xdp_sock {
44c0c77d8fSBjörn Töpel 	/* struct sock must be the first member of struct xdp_sock */
45c0c77d8fSBjörn Töpel 	struct sock sk;
468ef4e27eSMagnus Karlsson 	struct xsk_queue *rx ____cacheline_aligned_in_smp;
47b9b6b68eSBjörn Töpel 	struct net_device *dev;
48c0c77d8fSBjörn Töpel 	struct xdp_umem *umem;
49fbfc504aSBjörn Töpel 	struct list_head flush_node;
50c4655761SMagnus Karlsson 	struct xsk_buff_pool *pool;
51965a9909SMagnus Karlsson 	u16 queue_id;
52ac98d8aaSMagnus Karlsson 	bool zc;
53455302d1SIlya Maximets 	enum {
54455302d1SIlya Maximets 		XSK_READY = 0,
55455302d1SIlya Maximets 		XSK_BOUND,
56455302d1SIlya Maximets 		XSK_UNBOUND,
57455302d1SIlya Maximets 	} state;
588ef4e27eSMagnus Karlsson 
59fada7fdcSJonathan Lemon 	struct xsk_queue *tx ____cacheline_aligned_in_smp;
60a5aa8e52SMagnus Karlsson 	struct list_head tx_list;
61bf0bdd13SIlya Maximets 	/* Protects generic receive. */
62bf0bdd13SIlya Maximets 	spinlock_t rx_lock;
638aa5a335SCiara Loftus 
648aa5a335SCiara Loftus 	/* Statistics */
65c497176cSBjörn Töpel 	u64 rx_dropped;
668aa5a335SCiara Loftus 	u64 rx_queue_full;
678aa5a335SCiara Loftus 
680402acd6SBjörn Töpel 	struct list_head map_list;
690402acd6SBjörn Töpel 	/* Protects map_list */
700402acd6SBjörn Töpel 	spinlock_t map_list_lock;
718ef4e27eSMagnus Karlsson 	/* Protects multiple processes in the control path */
728ef4e27eSMagnus Karlsson 	struct mutex mutex;
737361f9c3SMagnus Karlsson 	struct xsk_queue *fq_tmp; /* Only as tmp storage before bind */
747361f9c3SMagnus Karlsson 	struct xsk_queue *cq_tmp; /* Only as tmp storage before bind */
75c0c77d8fSBjörn Töpel };
76c0c77d8fSBjörn Töpel 
77c497176cSBjörn Töpel #ifdef CONFIG_XDP_SOCKETS
7890254034SBjörn Töpel 
79a71506a4SMagnus Karlsson int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp);
80e312b9e7SBjörn Töpel int __xsk_map_redirect(struct xdp_sock *xs, struct xdp_buff *xdp);
81e312b9e7SBjörn Töpel void __xsk_map_flush(void);
82d817991cSBjörn Töpel 
83c497176cSBjörn Töpel #else
84a71506a4SMagnus Karlsson 
85c497176cSBjörn Töpel static inline int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)
86c497176cSBjörn Töpel {
87c497176cSBjörn Töpel 	return -ENOTSUPP;
88c497176cSBjörn Töpel }
89c497176cSBjörn Töpel 
90a71506a4SMagnus Karlsson static inline int __xsk_map_redirect(struct xdp_sock *xs, struct xdp_buff *xdp)
91d57d7642SMaxim Mikityanskiy {
92a71506a4SMagnus Karlsson 	return -EOPNOTSUPP;
93d57d7642SMaxim Mikityanskiy }
94d57d7642SMaxim Mikityanskiy 
95a71506a4SMagnus Karlsson static inline void __xsk_map_flush(void)
9690254034SBjörn Töpel {
9790254034SBjörn Töpel }
9890254034SBjörn Töpel 
99c497176cSBjörn Töpel #endif /* CONFIG_XDP_SOCKETS */
100c497176cSBjörn Töpel 
101c0c77d8fSBjörn Töpel #endif /* _LINUX_XDP_SOCK_H */
102