Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/* AF_XDP internal functions
  3 * Copyright(c) 2018 Intel Corporation.
  4 */
  5
  6#ifndef _LINUX_XDP_SOCK_H
  7#define _LINUX_XDP_SOCK_H
  8
  9#include <linux/bpf.h>
 10#include <linux/workqueue.h>
 11#include <linux/if_xdp.h>
 12#include <linux/mutex.h>
 13#include <linux/spinlock.h>
 14#include <linux/mm.h>
 15#include <net/sock.h>
 16
 17#define XDP_UMEM_SG_FLAG (1 << 1)
 18
 19struct net_device;
 20struct xsk_queue;
 21struct xdp_buff;
 22
 23struct xdp_umem {
 24	void *addrs;
 25	u64 size;
 26	u32 headroom;
 27	u32 chunk_size;
 28	u32 chunks;
 29	u32 npgs;
 30	struct user_struct *user;
 31	refcount_t users;
 32	u8 flags;
 33	u8 tx_metadata_len;
 34	bool zc;
 35	struct page **pgs;
 36	int id;
 37	struct list_head xsk_dma_list;
 38	struct work_struct work;
 39};
 40
 41struct xsk_map {
 42	struct bpf_map map;
 43	spinlock_t lock; /* Synchronize map updates */
 44	atomic_t count;
 45	struct xdp_sock __rcu *xsk_map[];
 46};
 47
 48struct xdp_sock {
 49	/* struct sock must be the first member of struct xdp_sock */
 50	struct sock sk;
 51	struct xsk_queue *rx ____cacheline_aligned_in_smp;
 52	struct net_device *dev;
 53	struct xdp_umem *umem;
 54	struct list_head flush_node;
 55	struct xsk_buff_pool *pool;
 56	u16 queue_id;
 57	bool zc;
 58	bool sg;
 59	enum {
 60		XSK_READY = 0,
 61		XSK_BOUND,
 62		XSK_UNBOUND,
 63	} state;
 64
 65	struct xsk_queue *tx ____cacheline_aligned_in_smp;
 66	struct list_head tx_list;
 67	/* record the number of tx descriptors sent by this xsk and
 68	 * when it exceeds MAX_PER_SOCKET_BUDGET, an opportunity needs
 69	 * to be given to other xsks for sending tx descriptors, thereby
 70	 * preventing other XSKs from being starved.
 71	 */
 72	u32 tx_budget_spent;
 73
 74	/* Protects generic receive. */
 75	spinlock_t rx_lock;
 76
 77	/* Statistics */
 78	u64 rx_dropped;
 79	u64 rx_queue_full;
 80
 81	/* When __xsk_generic_xmit() must return before it sees the EOP descriptor for the current
 82	 * packet, the partially built skb is saved here so that packet building can resume in next
 83	 * call of __xsk_generic_xmit().
 84	 */
 85	struct sk_buff *skb;
 86
 87	struct list_head map_list;
 88	/* Protects map_list */
 89	spinlock_t map_list_lock;
 90	/* Protects multiple processes in the control path */
 91	struct mutex mutex;
 92	struct xsk_queue *fq_tmp; /* Only as tmp storage before bind */
 93	struct xsk_queue *cq_tmp; /* Only as tmp storage before bind */
 94};
 95
 96/*
 97 * AF_XDP TX metadata hooks for network devices.
 98 * The following hooks can be defined; unless noted otherwise, they are
 99 * optional and can be filled with a null pointer.
100 *
101 * void (*tmo_request_timestamp)(void *priv)
102 *     Called when AF_XDP frame requested egress timestamp.
103 *
104 * u64 (*tmo_fill_timestamp)(void *priv)
105 *     Called when AF_XDP frame, that had requested egress timestamp,
106 *     received a completion. The hook needs to return the actual HW timestamp.
107 *
108 * void (*tmo_request_checksum)(u16 csum_start, u16 csum_offset, void *priv)
109 *     Called when AF_XDP frame requested HW checksum offload. csum_start
110 *     indicates position where checksumming should start.
111 *     csum_offset indicates position where checksum should be stored.
112 *
113 */
114struct xsk_tx_metadata_ops {
115	void	(*tmo_request_timestamp)(void *priv);
116	u64	(*tmo_fill_timestamp)(void *priv);
117	void	(*tmo_request_checksum)(u16 csum_start, u16 csum_offset, void *priv);
118};
119
120#ifdef CONFIG_XDP_SOCKETS
121
122int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp);
123int __xsk_map_redirect(struct xdp_sock *xs, struct xdp_buff *xdp);
124void __xsk_map_flush(void);
125
126/**
127 *  xsk_tx_metadata_to_compl - Save enough relevant metadata information
128 *  to perform tx completion in the future.
129 *  @meta: pointer to AF_XDP metadata area
130 *  @compl: pointer to output struct xsk_tx_metadata_to_compl
131 *
132 *  This function should be called by the networking device when
133 *  it prepares AF_XDP egress packet. The value of @compl should be stored
134 *  and passed to xsk_tx_metadata_complete upon TX completion.
135 */
136static inline void xsk_tx_metadata_to_compl(struct xsk_tx_metadata *meta,
137					    struct xsk_tx_metadata_compl *compl)
138{
139	if (!meta)
140		return;
141
142	if (meta->flags & XDP_TXMD_FLAGS_TIMESTAMP)
143		compl->tx_timestamp = &meta->completion.tx_timestamp;
144	else
145		compl->tx_timestamp = NULL;
146}
147
148/**
149 *  xsk_tx_metadata_request - Evaluate AF_XDP TX metadata at submission
150 *  and call appropriate xsk_tx_metadata_ops operation.
151 *  @meta: pointer to AF_XDP metadata area
152 *  @ops: pointer to struct xsk_tx_metadata_ops
153 *  @priv: pointer to driver-private aread
154 *
155 *  This function should be called by the networking device when
156 *  it prepares AF_XDP egress packet.
157 */
158static inline void xsk_tx_metadata_request(const struct xsk_tx_metadata *meta,
159					   const struct xsk_tx_metadata_ops *ops,
160					   void *priv)
161{
162	if (!meta)
163		return;
164
165	if (ops->tmo_request_timestamp)
166		if (meta->flags & XDP_TXMD_FLAGS_TIMESTAMP)
167			ops->tmo_request_timestamp(priv);
168
169	if (ops->tmo_request_checksum)
170		if (meta->flags & XDP_TXMD_FLAGS_CHECKSUM)
171			ops->tmo_request_checksum(meta->request.csum_start,
172						  meta->request.csum_offset, priv);
173}
174
175/**
176 *  xsk_tx_metadata_complete - Evaluate AF_XDP TX metadata at completion
177 *  and call appropriate xsk_tx_metadata_ops operation.
178 *  @compl: pointer to completion metadata produced from xsk_tx_metadata_to_compl
179 *  @ops: pointer to struct xsk_tx_metadata_ops
180 *  @priv: pointer to driver-private aread
181 *
182 *  This function should be called by the networking device upon
183 *  AF_XDP egress completion.
184 */
185static inline void xsk_tx_metadata_complete(struct xsk_tx_metadata_compl *compl,
186					    const struct xsk_tx_metadata_ops *ops,
187					    void *priv)
188{
189	if (!compl)
190		return;
191	if (!compl->tx_timestamp)
192		return;
193
194	*compl->tx_timestamp = ops->tmo_fill_timestamp(priv);
195}
196
197#else
198
199static inline int xsk_generic_rcv(struct xdp_sock *xs, struct xdp_buff *xdp)
200{
201	return -ENOTSUPP;
202}
203
204static inline int __xsk_map_redirect(struct xdp_sock *xs, struct xdp_buff *xdp)
205{
206	return -EOPNOTSUPP;
207}
208
209static inline void __xsk_map_flush(void)
210{
211}
212
213static inline void xsk_tx_metadata_to_compl(struct xsk_tx_metadata *meta,
214					    struct xsk_tx_metadata_compl *compl)
215{
216}
217
218static inline void xsk_tx_metadata_request(struct xsk_tx_metadata *meta,
219					   const struct xsk_tx_metadata_ops *ops,
220					   void *priv)
221{
222}
223
224static inline void xsk_tx_metadata_complete(struct xsk_tx_metadata_compl *compl,
225					    const struct xsk_tx_metadata_ops *ops,
226					    void *priv)
227{
228}
229
230#endif /* CONFIG_XDP_SOCKETS */
231
232#if defined(CONFIG_XDP_SOCKETS) && defined(CONFIG_DEBUG_NET)
233bool xsk_map_check_flush(void);
234#else
235static inline bool xsk_map_check_flush(void)
236{
237	return false;
238}
239#endif
240
241#endif /* _LINUX_XDP_SOCK_H */