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