xref: /linux/include/net/xdp_sock.h (revision fbfc504a)
1c0c77d8fSBjörn Töpel /* SPDX-License-Identifier: GPL-2.0
2c0c77d8fSBjörn Töpel  * AF_XDP internal functions
3c0c77d8fSBjörn Töpel  * Copyright(c) 2018 Intel Corporation.
4c0c77d8fSBjörn Töpel  *
5c0c77d8fSBjörn Töpel  * This program is free software; you can redistribute it and/or modify it
6c0c77d8fSBjörn Töpel  * under the terms and conditions of the GNU General Public License,
7c0c77d8fSBjörn Töpel  * version 2, as published by the Free Software Foundation.
8c0c77d8fSBjörn Töpel  *
9c0c77d8fSBjörn Töpel  * This program is distributed in the hope it will be useful, but WITHOUT
10c0c77d8fSBjörn Töpel  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11c0c77d8fSBjörn Töpel  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
12c0c77d8fSBjörn Töpel  * more details.
13c0c77d8fSBjörn Töpel  */
14c0c77d8fSBjörn Töpel 
15c0c77d8fSBjörn Töpel #ifndef _LINUX_XDP_SOCK_H
16c0c77d8fSBjörn Töpel #define _LINUX_XDP_SOCK_H
17c0c77d8fSBjörn Töpel 
18c0c77d8fSBjörn Töpel #include <linux/mutex.h>
19c0c77d8fSBjörn Töpel #include <net/sock.h>
20c0c77d8fSBjörn Töpel 
21b9b6b68eSBjörn Töpel struct net_device;
22b9b6b68eSBjörn Töpel struct xsk_queue;
23c0c77d8fSBjörn Töpel struct xdp_umem;
24c0c77d8fSBjörn Töpel 
25c0c77d8fSBjörn Töpel struct xdp_sock {
26c0c77d8fSBjörn Töpel 	/* struct sock must be the first member of struct xdp_sock */
27c0c77d8fSBjörn Töpel 	struct sock sk;
28b9b6b68eSBjörn Töpel 	struct xsk_queue *rx;
29b9b6b68eSBjörn Töpel 	struct net_device *dev;
30c0c77d8fSBjörn Töpel 	struct xdp_umem *umem;
31*fbfc504aSBjörn Töpel 	struct list_head flush_node;
32965a9909SMagnus Karlsson 	u16 queue_id;
33c0c77d8fSBjörn Töpel 	/* Protects multiple processes in the control path */
34c0c77d8fSBjörn Töpel 	struct mutex mutex;
35c497176cSBjörn Töpel 	u64 rx_dropped;
36c0c77d8fSBjörn Töpel };
37c0c77d8fSBjörn Töpel 
38c497176cSBjörn Töpel struct xdp_buff;
39c497176cSBjörn Töpel #ifdef CONFIG_XDP_SOCKETS
40c497176cSBjörn Töpel int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp);
41c497176cSBjörn Töpel int xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp);
42c497176cSBjörn Töpel void xsk_flush(struct xdp_sock *xs);
43*fbfc504aSBjörn Töpel bool xsk_is_setup_for_bpf_map(struct xdp_sock *xs);
44c497176cSBjörn Töpel #else
45c497176cSBjörn Töpel static inline int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)
46c497176cSBjörn Töpel {
47c497176cSBjörn Töpel 	return -ENOTSUPP;
48c497176cSBjörn Töpel }
49c497176cSBjörn Töpel 
50c497176cSBjörn Töpel static inline int xsk_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)
51c497176cSBjörn Töpel {
52c497176cSBjörn Töpel 	return -ENOTSUPP;
53c497176cSBjörn Töpel }
54c497176cSBjörn Töpel 
55c497176cSBjörn Töpel static inline void xsk_flush(struct xdp_sock *xs)
56c497176cSBjörn Töpel {
57c497176cSBjörn Töpel }
58*fbfc504aSBjörn Töpel 
59*fbfc504aSBjörn Töpel static inline bool xsk_is_setup_for_bpf_map(struct xdp_sock *xs)
60*fbfc504aSBjörn Töpel {
61*fbfc504aSBjörn Töpel 	return false;
62*fbfc504aSBjörn Töpel }
63c497176cSBjörn Töpel #endif /* CONFIG_XDP_SOCKETS */
64c497176cSBjörn Töpel 
65c0c77d8fSBjörn Töpel #endif /* _LINUX_XDP_SOCK_H */
66