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