#ifndef __LINUX_NET_XDP_H__
#define __LINUX_NET_XDP_H__
#include <linux/bitfield.h>
#include <linux/filter.h>
#include <linux/netdevice.h>
#include <linux/skbuff.h>
enum xdp_mem_type { … };
#define XDP_XMIT_FLUSH …
#define XDP_XMIT_FLAGS_MASK …
struct xdp_mem_info { … };
struct page_pool;
struct xdp_rxq_info { … } ____cacheline_aligned;
struct xdp_txq_info { … };
enum xdp_buff_flags { … };
struct xdp_buff { … };
static __always_inline bool xdp_buff_has_frags(struct xdp_buff *xdp)
{ … }
static __always_inline void xdp_buff_set_frags_flag(struct xdp_buff *xdp)
{ … }
static __always_inline void xdp_buff_clear_frags_flag(struct xdp_buff *xdp)
{ … }
static __always_inline bool xdp_buff_is_frag_pfmemalloc(struct xdp_buff *xdp)
{ … }
static __always_inline void xdp_buff_set_frag_pfmemalloc(struct xdp_buff *xdp)
{ … }
static __always_inline void
xdp_init_buff(struct xdp_buff *xdp, u32 frame_sz, struct xdp_rxq_info *rxq)
{ … }
static __always_inline void
xdp_prepare_buff(struct xdp_buff *xdp, unsigned char *hard_start,
int headroom, int data_len, const bool meta_valid)
{ … }
#define xdp_data_hard_end(xdp) …
static inline struct skb_shared_info *
xdp_get_shared_info_from_buff(struct xdp_buff *xdp)
{ … }
static __always_inline unsigned int xdp_get_buff_len(struct xdp_buff *xdp)
{ … }
struct xdp_frame { … };
static __always_inline bool xdp_frame_has_frags(struct xdp_frame *frame)
{ … }
static __always_inline bool xdp_frame_is_frag_pfmemalloc(struct xdp_frame *frame)
{ … }
#define XDP_BULK_QUEUE_SIZE …
struct xdp_frame_bulk { … };
static __always_inline void xdp_frame_bulk_init(struct xdp_frame_bulk *bq)
{ … }
static inline struct skb_shared_info *
xdp_get_shared_info_from_frame(struct xdp_frame *frame)
{ … }
struct xdp_cpumap_stats { … };
static inline void xdp_scrub_frame(struct xdp_frame *frame)
{ … }
static inline void
xdp_update_skb_shared_info(struct sk_buff *skb, u8 nr_frags,
unsigned int size, unsigned int truesize,
bool pfmemalloc)
{ … }
void xdp_warn(const char *msg, const char *func, const int line);
#define XDP_WARN(msg) …
struct xdp_frame *xdp_convert_zc_to_xdp_frame(struct xdp_buff *xdp);
struct sk_buff *__xdp_build_skb_from_frame(struct xdp_frame *xdpf,
struct sk_buff *skb,
struct net_device *dev);
struct sk_buff *xdp_build_skb_from_frame(struct xdp_frame *xdpf,
struct net_device *dev);
int xdp_alloc_skb_bulk(void **skbs, int n_skb, gfp_t gfp);
struct xdp_frame *xdpf_clone(struct xdp_frame *xdpf);
static inline
void xdp_convert_frame_to_buff(struct xdp_frame *frame, struct xdp_buff *xdp)
{ … }
static inline
int xdp_update_frame_from_buff(struct xdp_buff *xdp,
struct xdp_frame *xdp_frame)
{ … }
static inline
struct xdp_frame *xdp_convert_buff_to_frame(struct xdp_buff *xdp)
{ … }
void __xdp_return(void *data, struct xdp_mem_info *mem, bool napi_direct,
struct xdp_buff *xdp);
void xdp_return_frame(struct xdp_frame *xdpf);
void xdp_return_frame_rx_napi(struct xdp_frame *xdpf);
void xdp_return_buff(struct xdp_buff *xdp);
void xdp_flush_frame_bulk(struct xdp_frame_bulk *bq);
void xdp_return_frame_bulk(struct xdp_frame *xdpf,
struct xdp_frame_bulk *bq);
static __always_inline unsigned int xdp_get_frame_len(struct xdp_frame *xdpf)
{ … }
int __xdp_rxq_info_reg(struct xdp_rxq_info *xdp_rxq,
struct net_device *dev, u32 queue_index,
unsigned int napi_id, u32 frag_size);
static inline int
xdp_rxq_info_reg(struct xdp_rxq_info *xdp_rxq,
struct net_device *dev, u32 queue_index,
unsigned int napi_id)
{ … }
void xdp_rxq_info_unreg(struct xdp_rxq_info *xdp_rxq);
void xdp_rxq_info_unused(struct xdp_rxq_info *xdp_rxq);
bool xdp_rxq_info_is_reg(struct xdp_rxq_info *xdp_rxq);
int xdp_rxq_info_reg_mem_model(struct xdp_rxq_info *xdp_rxq,
enum xdp_mem_type type, void *allocator);
void xdp_rxq_info_unreg_mem_model(struct xdp_rxq_info *xdp_rxq);
int xdp_reg_mem_model(struct xdp_mem_info *mem,
enum xdp_mem_type type, void *allocator);
void xdp_unreg_mem_model(struct xdp_mem_info *mem);
static __always_inline void
xdp_set_data_meta_invalid(struct xdp_buff *xdp)
{ … }
static __always_inline bool
xdp_data_meta_unsupported(const struct xdp_buff *xdp)
{ … }
static inline bool xdp_metalen_invalid(unsigned long metalen)
{ … }
struct xdp_attachment_info { … };
struct netdev_bpf;
void xdp_attachment_setup(struct xdp_attachment_info *info,
struct netdev_bpf *bpf);
#define DEV_MAP_BULK_SIZE …
#define XDP_METADATA_KFUNC_xxx … \
enum xdp_rx_metadata { … };
enum xdp_rss_hash_type { … };
struct xdp_metadata_ops { … };
#ifdef CONFIG_NET
u32 bpf_xdp_metadata_kfunc_id(int id);
bool bpf_dev_bound_kfunc_id(u32 btf_id);
void xdp_set_features_flag(struct net_device *dev, xdp_features_t val);
void xdp_features_set_redirect_target(struct net_device *dev, bool support_sg);
void xdp_features_clear_redirect_target(struct net_device *dev);
#else
static inline u32 bpf_xdp_metadata_kfunc_id(int id) { return 0; }
static inline bool bpf_dev_bound_kfunc_id(u32 btf_id) { return false; }
static inline void
xdp_set_features_flag(struct net_device *dev, xdp_features_t val)
{
}
static inline void
xdp_features_set_redirect_target(struct net_device *dev, bool support_sg)
{
}
static inline void
xdp_features_clear_redirect_target(struct net_device *dev)
{
}
#endif
static inline void xdp_clear_features_flag(struct net_device *dev)
{ … }
static __always_inline u32 bpf_prog_run_xdp(const struct bpf_prog *prog,
struct xdp_buff *xdp)
{ … }
#endif