xref: /freebsd-src/sys/compat/linuxkpi/common/include/linux/netdevice.h (revision 105331f658e2f14fb4daa64dcd076c7369505295)
18d59ecb2SHans Petter Selasky /*-
28d59ecb2SHans Petter Selasky  * Copyright (c) 2010 Isilon Systems, Inc.
38d59ecb2SHans Petter Selasky  * Copyright (c) 2010 iX Systems, Inc.
48d59ecb2SHans Petter Selasky  * Copyright (c) 2010 Panasas, Inc.
5427c402dSHans Petter Selasky  * Copyright (c) 2013-2019 Mellanox Technologies, Ltd.
68d59ecb2SHans Petter Selasky  * All rights reserved.
7d1058958SBjoern A. Zeeb  * Copyright (c) 2020-2021 The FreeBSD Foundation
8ac07a3b8SBjoern A. Zeeb  * Copyright (c) 2020-2022 Bjoern A. Zeeb
9d1058958SBjoern A. Zeeb  *
10d1058958SBjoern A. Zeeb  * Portions of this software were developed by Björn Zeeb
11d1058958SBjoern A. Zeeb  * under sponsorship from the FreeBSD Foundation.
128d59ecb2SHans Petter Selasky  *
138d59ecb2SHans Petter Selasky  * Redistribution and use in source and binary forms, with or without
148d59ecb2SHans Petter Selasky  * modification, are permitted provided that the following conditions
158d59ecb2SHans Petter Selasky  * are met:
168d59ecb2SHans Petter Selasky  * 1. Redistributions of source code must retain the above copyright
178d59ecb2SHans Petter Selasky  *    notice unmodified, this list of conditions, and the following
188d59ecb2SHans Petter Selasky  *    disclaimer.
198d59ecb2SHans Petter Selasky  * 2. Redistributions in binary form must reproduce the above copyright
208d59ecb2SHans Petter Selasky  *    notice, this list of conditions and the following disclaimer in the
218d59ecb2SHans Petter Selasky  *    documentation and/or other materials provided with the distribution.
228d59ecb2SHans Petter Selasky  *
238d59ecb2SHans Petter Selasky  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
248d59ecb2SHans Petter Selasky  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
258d59ecb2SHans Petter Selasky  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
268d59ecb2SHans Petter Selasky  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
278d59ecb2SHans Petter Selasky  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
288d59ecb2SHans Petter Selasky  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
298d59ecb2SHans Petter Selasky  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
308d59ecb2SHans Petter Selasky  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
318d59ecb2SHans Petter Selasky  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
328d59ecb2SHans Petter Selasky  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
338d59ecb2SHans Petter Selasky  */
34d1058958SBjoern A. Zeeb #ifndef	_LINUXKPI_LINUX_NETDEVICE_H
35d1058958SBjoern A. Zeeb #define	_LINUXKPI_LINUX_NETDEVICE_H
368d59ecb2SHans Petter Selasky 
378d59ecb2SHans Petter Selasky #include <linux/types.h>
38d1058958SBjoern A. Zeeb #include <linux/netdev_features.h>
398d59ecb2SHans Petter Selasky 
40d1058958SBjoern A. Zeeb #include <sys/param.h>
41d1058958SBjoern A. Zeeb #include <sys/kernel.h>
42d1058958SBjoern A. Zeeb #include <sys/lock.h>
43d1058958SBjoern A. Zeeb #include <sys/mutex.h>
44d1058958SBjoern A. Zeeb #include <sys/malloc.h>
45d1058958SBjoern A. Zeeb #include <sys/queue.h>
468d59ecb2SHans Petter Selasky #include <sys/socket.h>
47d1058958SBjoern A. Zeeb #include <sys/taskqueue.h>
488d59ecb2SHans Petter Selasky 
498d59ecb2SHans Petter Selasky #include <net/if_types.h>
508d59ecb2SHans Petter Selasky #include <net/if.h>
518d59ecb2SHans Petter Selasky #include <net/if_var.h>
528d59ecb2SHans Petter Selasky #include <net/if_dl.h>
538d59ecb2SHans Petter Selasky 
5475388b9cSBjoern A. Zeeb #include <linux/kernel.h>
55d1058958SBjoern A. Zeeb #include <linux/bitops.h>
56d1058958SBjoern A. Zeeb #include <linux/list.h>
57d1058958SBjoern A. Zeeb #include <linux/device.h>
588d59ecb2SHans Petter Selasky #include <linux/net.h>
59d1058958SBjoern A. Zeeb #include <linux/if_ether.h>
608d59ecb2SHans Petter Selasky #include <linux/notifier.h>
61d1058958SBjoern A. Zeeb #include <linux/random.h>
62d1058958SBjoern A. Zeeb #include <linux/rcupdate.h>
638d59ecb2SHans Petter Selasky 
6440402727SHans Petter Selasky #ifdef VIMAGE
6540402727SHans Petter Selasky #define	init_net *vnet0
6640402727SHans Petter Selasky #else
6740402727SHans Petter Selasky #define	init_net *((struct vnet *)0)
6840402727SHans Petter Selasky #endif
698d59ecb2SHans Petter Selasky 
70d1058958SBjoern A. Zeeb struct sk_buff;
71d1058958SBjoern A. Zeeb struct net_device;
72d1058958SBjoern A. Zeeb struct wireless_dev;		/* net/cfg80211.h */
73d1058958SBjoern A. Zeeb 
748d59ecb2SHans Petter Selasky #define	MAX_ADDR_LEN		20
758d59ecb2SHans Petter Selasky 
76d1058958SBjoern A. Zeeb #define	NET_NAME_UNKNOWN	0
778d59ecb2SHans Petter Selasky 
786ed447b5SBjoern A. Zeeb enum net_addr_assign_type {
796ed447b5SBjoern A. Zeeb 	NET_ADDR_RANDOM,
806ed447b5SBjoern A. Zeeb };
816ed447b5SBjoern A. Zeeb 
82d1058958SBjoern A. Zeeb enum netdev_tx {
83d1058958SBjoern A. Zeeb 	NETDEV_TX_OK		= 0,
84d1058958SBjoern A. Zeeb };
85d1058958SBjoern A. Zeeb typedef	enum netdev_tx		netdev_tx_t;
868d59ecb2SHans Petter Selasky 
87d1058958SBjoern A. Zeeb struct netdev_hw_addr {
88d1058958SBjoern A. Zeeb 	struct list_head	addr_list;
89d1058958SBjoern A. Zeeb 	uint8_t			addr[MAX_ADDR_LEN];
90d1058958SBjoern A. Zeeb };
91d1058958SBjoern A. Zeeb 
92d1058958SBjoern A. Zeeb struct netdev_hw_addr_list {
93d1058958SBjoern A. Zeeb 	struct list_head	addr_list;
94d1058958SBjoern A. Zeeb 	int			count;
95d1058958SBjoern A. Zeeb };
96d1058958SBjoern A. Zeeb 
97d1058958SBjoern A. Zeeb enum net_device_reg_state {
98d1058958SBjoern A. Zeeb 	NETREG_DUMMY		= 1,
99d1058958SBjoern A. Zeeb 	NETREG_REGISTERED,
100d1058958SBjoern A. Zeeb };
101d1058958SBjoern A. Zeeb 
1026ed447b5SBjoern A. Zeeb enum tc_setup_type {
1036ed447b5SBjoern A. Zeeb 	TC_SETUP_MAX_DUMMY,
1046ed447b5SBjoern A. Zeeb };
1056ed447b5SBjoern A. Zeeb 
106d1058958SBjoern A. Zeeb struct net_device_ops {
107d1058958SBjoern A. Zeeb 	int (*ndo_open)(struct net_device *);
108d1058958SBjoern A. Zeeb 	int (*ndo_stop)(struct net_device *);
109d1058958SBjoern A. Zeeb 	int (*ndo_set_mac_address)(struct net_device *,  void *);
110d1058958SBjoern A. Zeeb 	netdev_tx_t (*ndo_start_xmit)(struct sk_buff *, struct net_device *);
111d1058958SBjoern A. Zeeb 	void (*ndo_set_rx_mode)(struct net_device *);
112d1058958SBjoern A. Zeeb };
113d1058958SBjoern A. Zeeb 
114d1058958SBjoern A. Zeeb struct net_device {
115d1058958SBjoern A. Zeeb 	/* net_device fields seen publicly. */
116d1058958SBjoern A. Zeeb 	/* XXX can we later make some aliases to ifnet? */
117d1058958SBjoern A. Zeeb 	char				name[IFNAMSIZ];
118d1058958SBjoern A. Zeeb 	struct wireless_dev		*ieee80211_ptr;
119d1058958SBjoern A. Zeeb 	uint8_t				dev_addr[ETH_ALEN];
120d1058958SBjoern A. Zeeb 	struct netdev_hw_addr_list	mc;
121d1058958SBjoern A. Zeeb 	netdev_features_t		features;
122d1058958SBjoern A. Zeeb 	struct {
123d1058958SBjoern A. Zeeb 		unsigned long		multicast;
124d1058958SBjoern A. Zeeb 
125d1058958SBjoern A. Zeeb 		unsigned long		rx_bytes;
126d1058958SBjoern A. Zeeb 		unsigned long		rx_errors;
127d1058958SBjoern A. Zeeb 		unsigned long		rx_packets;
128d1058958SBjoern A. Zeeb 		unsigned long		tx_bytes;
129d1058958SBjoern A. Zeeb 		unsigned long		tx_dropped;
130d1058958SBjoern A. Zeeb 		unsigned long		tx_errors;
131d1058958SBjoern A. Zeeb 		unsigned long		tx_packets;
132d1058958SBjoern A. Zeeb 	} stats;
1336ed447b5SBjoern A. Zeeb 	enum net_addr_assign_type	addr_assign_type;
134d1058958SBjoern A. Zeeb 	enum net_device_reg_state	reg_state;
135d1058958SBjoern A. Zeeb 	const struct ethtool_ops	*ethtool_ops;
136d1058958SBjoern A. Zeeb 	const struct net_device_ops	*netdev_ops;
137d1058958SBjoern A. Zeeb 
138d1058958SBjoern A. Zeeb 	bool				needs_free_netdev;
139d1058958SBjoern A. Zeeb 	/* Not properly typed as-of now. */
140d1058958SBjoern A. Zeeb 	int	flags, type;
141d1058958SBjoern A. Zeeb 	int	name_assign_type, needed_headroom;
14275388b9cSBjoern A. Zeeb 	int	threaded;
143d1058958SBjoern A. Zeeb 
144d1058958SBjoern A. Zeeb 	void (*priv_destructor)(struct net_device *);
145d1058958SBjoern A. Zeeb 
146d1058958SBjoern A. Zeeb 	/* net_device internal. */
147d1058958SBjoern A. Zeeb 	struct device			dev;
148d1058958SBjoern A. Zeeb 
149d1058958SBjoern A. Zeeb 	/*
150d1058958SBjoern A. Zeeb 	 * In case we delete the net_device we need to be able to clear all
151d1058958SBjoern A. Zeeb 	 * NAPI consumers.
152d1058958SBjoern A. Zeeb 	 */
153d1058958SBjoern A. Zeeb 	struct mtx			napi_mtx;
154d1058958SBjoern A. Zeeb 	TAILQ_HEAD(, napi_struct)	napi_head;
155d1058958SBjoern A. Zeeb 	struct taskqueue		*napi_tq;
156d1058958SBjoern A. Zeeb 
157d1058958SBjoern A. Zeeb 	/* Must stay last. */
158d1058958SBjoern A. Zeeb 	uint8_t				drv_priv[0] __aligned(CACHE_LINE_SIZE);
159d1058958SBjoern A. Zeeb };
160d1058958SBjoern A. Zeeb 
161d1058958SBjoern A. Zeeb #define	SET_NETDEV_DEV(_ndev, _dev)	(_ndev)->dev.parent = _dev;
162d1058958SBjoern A. Zeeb 
163d1058958SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
164fdcfe8a2SBjoern A. Zeeb /* According to linux::ipoib_main.c. */
165fdcfe8a2SBjoern A. Zeeb struct netdev_notifier_info {
166fdcfe8a2SBjoern A. Zeeb 	struct net_device	*dev;
167801cf532SBjoern A. Zeeb 	struct ifnet		*ifp;
168fdcfe8a2SBjoern A. Zeeb };
169fdcfe8a2SBjoern A. Zeeb 
170fdcfe8a2SBjoern A. Zeeb static inline struct net_device *
171fdcfe8a2SBjoern A. Zeeb netdev_notifier_info_to_dev(struct netdev_notifier_info *ni)
172fdcfe8a2SBjoern A. Zeeb {
173fdcfe8a2SBjoern A. Zeeb 	return (ni->dev);
174fdcfe8a2SBjoern A. Zeeb }
175fdcfe8a2SBjoern A. Zeeb 
176801cf532SBjoern A. Zeeb static inline struct ifnet *
177801cf532SBjoern A. Zeeb netdev_notifier_info_to_ifp(struct netdev_notifier_info *ni)
178801cf532SBjoern A. Zeeb {
179801cf532SBjoern A. Zeeb 	return (ni->ifp);
180801cf532SBjoern A. Zeeb }
181801cf532SBjoern A. Zeeb 
182fdcfe8a2SBjoern A. Zeeb int	register_netdevice_notifier(struct notifier_block *);
183fdcfe8a2SBjoern A. Zeeb int	register_inetaddr_notifier(struct notifier_block *);
184fdcfe8a2SBjoern A. Zeeb int	unregister_netdevice_notifier(struct notifier_block *);
185fdcfe8a2SBjoern A. Zeeb int	unregister_inetaddr_notifier(struct notifier_block *);
186fdcfe8a2SBjoern A. Zeeb 
187d1058958SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
188d1058958SBjoern A. Zeeb 
189d1058958SBjoern A. Zeeb #define	NAPI_POLL_WEIGHT			64	/* budget */
190d1058958SBjoern A. Zeeb 
191ac07a3b8SBjoern A. Zeeb /*
192ac07a3b8SBjoern A. Zeeb  * There are drivers directly testing napi state bits, so we need to publicly
193ac07a3b8SBjoern A. Zeeb  * expose them.  If you ask me, those accesses should be hid behind an
194ac07a3b8SBjoern A. Zeeb  * inline function and the bit flags not be directly exposed.
195ac07a3b8SBjoern A. Zeeb  */
196ac07a3b8SBjoern A. Zeeb enum napi_state_bits {
197ac07a3b8SBjoern A. Zeeb 	/*
198ac07a3b8SBjoern A. Zeeb 	 * Official Linux flags encountered.
199ac07a3b8SBjoern A. Zeeb 	 */
200ac07a3b8SBjoern A. Zeeb 	NAPI_STATE_SCHED = 1,
201ac07a3b8SBjoern A. Zeeb 
202ac07a3b8SBjoern A. Zeeb 	/*
203ac07a3b8SBjoern A. Zeeb 	 * Our internal versions (for now).
204ac07a3b8SBjoern A. Zeeb 	 */
205ac07a3b8SBjoern A. Zeeb 	/* Do not schedule new things while we are waiting to clear things. */
206ac07a3b8SBjoern A. Zeeb 	LKPI_NAPI_FLAG_DISABLE_PENDING = 0,
207ac07a3b8SBjoern A. Zeeb 	/* To synchronise that only one poll is ever running. */
208ac07a3b8SBjoern A. Zeeb 	LKPI_NAPI_FLAG_IS_SCHEDULED = 1,
209ac07a3b8SBjoern A. Zeeb 	/* If trying to schedule while poll is running. Need to re-schedule. */
210ac07a3b8SBjoern A. Zeeb 	LKPI_NAPI_FLAG_LOST_RACE_TRY_AGAIN = 2,
211ac07a3b8SBjoern A. Zeeb 	/* When shutting down forcefully prevent anything from running task/poll. */
212ac07a3b8SBjoern A. Zeeb 	LKPI_NAPI_FLAG_SHUTDOWN = 3,
213ac07a3b8SBjoern A. Zeeb };
214ac07a3b8SBjoern A. Zeeb 
215d1058958SBjoern A. Zeeb struct napi_struct {
216d1058958SBjoern A. Zeeb 	TAILQ_ENTRY(napi_struct)	entry;
217d1058958SBjoern A. Zeeb 
218d1058958SBjoern A. Zeeb 	struct list_head	rx_list;
219d1058958SBjoern A. Zeeb 	struct net_device	*dev;
220d1058958SBjoern A. Zeeb 	int			(*poll)(struct napi_struct *, int);
221d1058958SBjoern A. Zeeb 	int			budget;
222d1058958SBjoern A. Zeeb 	int			rx_count;
223d1058958SBjoern A. Zeeb 
224ac07a3b8SBjoern A. Zeeb 
225d1058958SBjoern A. Zeeb 	/*
226d1058958SBjoern A. Zeeb 	 * These flags mostly need to be checked/changed atomically
227d1058958SBjoern A. Zeeb 	 * (multiple together in some cases).
228d1058958SBjoern A. Zeeb 	 */
229ac07a3b8SBjoern A. Zeeb 	volatile unsigned long	state;
230d1058958SBjoern A. Zeeb 
231d1058958SBjoern A. Zeeb 	/* FreeBSD internal. */
232d1058958SBjoern A. Zeeb 	/* Use task for now, so we can easily switch between direct and task. */
233d1058958SBjoern A. Zeeb 	struct task		napi_task;
234d1058958SBjoern A. Zeeb };
235d1058958SBjoern A. Zeeb 
236d1058958SBjoern A. Zeeb void linuxkpi_init_dummy_netdev(struct net_device *);
237d1058958SBjoern A. Zeeb void linuxkpi_netif_napi_add(struct net_device *, struct napi_struct *,
23823c73dbaSBjoern A. Zeeb     int(*napi_poll)(struct napi_struct *, int));
239d1058958SBjoern A. Zeeb void linuxkpi_netif_napi_del(struct napi_struct *);
240d1058958SBjoern A. Zeeb bool linuxkpi_napi_schedule_prep(struct napi_struct *);
241d1058958SBjoern A. Zeeb void linuxkpi___napi_schedule(struct napi_struct *);
24221761f2eSBjoern A. Zeeb bool linuxkpi_napi_schedule(struct napi_struct *);
243d1058958SBjoern A. Zeeb void linuxkpi_napi_reschedule(struct napi_struct *);
244d1058958SBjoern A. Zeeb bool linuxkpi_napi_complete_done(struct napi_struct *, int);
245d1058958SBjoern A. Zeeb bool linuxkpi_napi_complete(struct napi_struct *);
246d1058958SBjoern A. Zeeb void linuxkpi_napi_disable(struct napi_struct *);
247d1058958SBjoern A. Zeeb void linuxkpi_napi_enable(struct napi_struct *);
248d1058958SBjoern A. Zeeb void linuxkpi_napi_synchronize(struct napi_struct *);
249d1058958SBjoern A. Zeeb 
250d1058958SBjoern A. Zeeb #define	init_dummy_netdev(_n)						\
251d1058958SBjoern A. Zeeb 	linuxkpi_init_dummy_netdev(_n)
25223c73dbaSBjoern A. Zeeb #define	netif_napi_add(_nd, _ns, _p)					\
25323c73dbaSBjoern A. Zeeb 	linuxkpi_netif_napi_add(_nd, _ns, _p)
254d1058958SBjoern A. Zeeb #define	netif_napi_del(_n)						\
255d1058958SBjoern A. Zeeb 	linuxkpi_netif_napi_del(_n)
256d1058958SBjoern A. Zeeb #define	napi_schedule_prep(_n)						\
257d1058958SBjoern A. Zeeb 	linuxkpi_napi_schedule_prep(_n)
258d1058958SBjoern A. Zeeb #define	__napi_schedule(_n)						\
259d1058958SBjoern A. Zeeb 	linuxkpi___napi_schedule(_n)
260d1058958SBjoern A. Zeeb #define	napi_schedule(_n)						\
261d1058958SBjoern A. Zeeb 	linuxkpi_napi_schedule(_n)
262d1058958SBjoern A. Zeeb #define	napi_reschedule(_n)						\
263d1058958SBjoern A. Zeeb 	linuxkpi_napi_reschedule(_n)
264d1058958SBjoern A. Zeeb #define	napi_complete_done(_n, _r)					\
265d1058958SBjoern A. Zeeb 	linuxkpi_napi_complete_done(_n, _r)
266d1058958SBjoern A. Zeeb #define	napi_complete(_n)						\
267d1058958SBjoern A. Zeeb 	linuxkpi_napi_complete(_n)
268d1058958SBjoern A. Zeeb #define	napi_disable(_n)						\
269d1058958SBjoern A. Zeeb 	linuxkpi_napi_disable(_n)
270d1058958SBjoern A. Zeeb #define	napi_enable(_n)							\
271d1058958SBjoern A. Zeeb 	linuxkpi_napi_enable(_n)
272d1058958SBjoern A. Zeeb #define	napi_synchronize(_n)						\
273d1058958SBjoern A. Zeeb 	linuxkpi_napi_synchronize(_n)
274d1058958SBjoern A. Zeeb 
27575388b9cSBjoern A. Zeeb 
27675388b9cSBjoern A. Zeeb static inline void
27775388b9cSBjoern A. Zeeb netif_napi_add_tx(struct net_device *dev, struct napi_struct *napi,
27875388b9cSBjoern A. Zeeb     int(*napi_poll)(struct napi_struct *, int))
27975388b9cSBjoern A. Zeeb {
28075388b9cSBjoern A. Zeeb 
28175388b9cSBjoern A. Zeeb 	netif_napi_add(dev, napi, napi_poll);
28275388b9cSBjoern A. Zeeb }
28375388b9cSBjoern A. Zeeb 
28421761f2eSBjoern A. Zeeb static inline bool
28521761f2eSBjoern A. Zeeb napi_is_scheduled(struct napi_struct *napi)
28621761f2eSBjoern A. Zeeb {
28721761f2eSBjoern A. Zeeb 
28821761f2eSBjoern A. Zeeb 	return (test_bit(LKPI_NAPI_FLAG_IS_SCHEDULED, &napi->state));
28921761f2eSBjoern A. Zeeb }
29021761f2eSBjoern A. Zeeb 
291d1058958SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
292d1058958SBjoern A. Zeeb 
293d1058958SBjoern A. Zeeb static inline void
294d1058958SBjoern A. Zeeb netdev_rss_key_fill(uint32_t *buf, size_t len)
295d1058958SBjoern A. Zeeb {
296d1058958SBjoern A. Zeeb 
297d1058958SBjoern A. Zeeb 	/*
298d1058958SBjoern A. Zeeb 	 * Remembering from a previous life there was discussions on what is
299d1058958SBjoern A. Zeeb 	 * a good RSS hash key.  See end of rss_init() in net/rss_config.c.
300d1058958SBjoern A. Zeeb 	 * iwlwifi is looking for a 10byte "secret" so stay with random for now.
301d1058958SBjoern A. Zeeb 	 */
302d1058958SBjoern A. Zeeb 	get_random_bytes(buf, len);
303d1058958SBjoern A. Zeeb }
304d1058958SBjoern A. Zeeb 
305d1058958SBjoern A. Zeeb static inline int
306d1058958SBjoern A. Zeeb netdev_hw_addr_list_count(struct netdev_hw_addr_list *list)
307d1058958SBjoern A. Zeeb {
308d1058958SBjoern A. Zeeb 
309d1058958SBjoern A. Zeeb 	return (list->count);
310d1058958SBjoern A. Zeeb }
311d1058958SBjoern A. Zeeb 
312d1058958SBjoern A. Zeeb static inline int
313d1058958SBjoern A. Zeeb netdev_mc_count(struct net_device *ndev)
314d1058958SBjoern A. Zeeb {
315d1058958SBjoern A. Zeeb 
316d1058958SBjoern A. Zeeb 	return (netdev_hw_addr_list_count(&ndev->mc));
317d1058958SBjoern A. Zeeb }
318d1058958SBjoern A. Zeeb 
319d1058958SBjoern A. Zeeb #define	netdev_hw_addr_list_for_each(_addr, _list)			\
320d1058958SBjoern A. Zeeb 	list_for_each_entry((_addr), &(_list)->addr_list, addr_list)
321d1058958SBjoern A. Zeeb 
322d1058958SBjoern A. Zeeb #define	netdev_for_each_mc_addr(na, ndev)				\
323d1058958SBjoern A. Zeeb 	netdev_hw_addr_list_for_each(na, &(ndev)->mc)
324d1058958SBjoern A. Zeeb 
325d1058958SBjoern A. Zeeb static __inline void
326d1058958SBjoern A. Zeeb synchronize_net(void)
327d1058958SBjoern A. Zeeb {
328d1058958SBjoern A. Zeeb 
329d1058958SBjoern A. Zeeb 	/* We probably cannot do that unconditionally at some point anymore. */
330d1058958SBjoern A. Zeeb 	synchronize_rcu();
331d1058958SBjoern A. Zeeb }
332d1058958SBjoern A. Zeeb 
33375388b9cSBjoern A. Zeeb static __inline void
33475388b9cSBjoern A. Zeeb netif_receive_skb_list(struct list_head *head)
33575388b9cSBjoern A. Zeeb {
33675388b9cSBjoern A. Zeeb 
33775388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
33875388b9cSBjoern A. Zeeb }
33975388b9cSBjoern A. Zeeb 
34075388b9cSBjoern A. Zeeb static __inline int
34175388b9cSBjoern A. Zeeb napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
34275388b9cSBjoern A. Zeeb {
34375388b9cSBjoern A. Zeeb 
34475388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
34575388b9cSBjoern A. Zeeb 	return (-1);
34675388b9cSBjoern A. Zeeb }
34775388b9cSBjoern A. Zeeb 
34875388b9cSBjoern A. Zeeb static __inline void
34975388b9cSBjoern A. Zeeb ether_setup(struct net_device *ndev)
35075388b9cSBjoern A. Zeeb {
35175388b9cSBjoern A. Zeeb 
35275388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
35375388b9cSBjoern A. Zeeb }
35475388b9cSBjoern A. Zeeb 
35575388b9cSBjoern A. Zeeb static __inline void
3566153bef9SBjoern A. Zeeb dev_net_set(struct net_device *ndev, void *p)
35775388b9cSBjoern A. Zeeb {
35875388b9cSBjoern A. Zeeb 
35975388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
36075388b9cSBjoern A. Zeeb }
36175388b9cSBjoern A. Zeeb 
3626153bef9SBjoern A. Zeeb static __inline int
3636153bef9SBjoern A. Zeeb dev_set_threaded(struct net_device *ndev, bool threaded)
3646153bef9SBjoern A. Zeeb {
3656153bef9SBjoern A. Zeeb 
3666153bef9SBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
3676153bef9SBjoern A. Zeeb 	return (-ENODEV);
3686153bef9SBjoern A. Zeeb }
3696153bef9SBjoern A. Zeeb 
37075388b9cSBjoern A. Zeeb /* -------------------------------------------------------------------------- */
37175388b9cSBjoern A. Zeeb 
37275388b9cSBjoern A. Zeeb static __inline bool
37375388b9cSBjoern A. Zeeb netif_carrier_ok(struct net_device *ndev)
37475388b9cSBjoern A. Zeeb {
37575388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
37675388b9cSBjoern A. Zeeb 	return (false);
37775388b9cSBjoern A. Zeeb }
37875388b9cSBjoern A. Zeeb 
37975388b9cSBjoern A. Zeeb static __inline void
38075388b9cSBjoern A. Zeeb netif_carrier_off(struct net_device *ndev)
38175388b9cSBjoern A. Zeeb {
38275388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
38375388b9cSBjoern A. Zeeb }
38475388b9cSBjoern A. Zeeb 
38575388b9cSBjoern A. Zeeb static __inline void
38675388b9cSBjoern A. Zeeb netif_carrier_on(struct net_device *ndev)
38775388b9cSBjoern A. Zeeb {
38875388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
38975388b9cSBjoern A. Zeeb }
39075388b9cSBjoern A. Zeeb 
39175388b9cSBjoern A. Zeeb /* -------------------------------------------------------------------------- */
39275388b9cSBjoern A. Zeeb 
39375388b9cSBjoern A. Zeeb static __inline bool
39475388b9cSBjoern A. Zeeb netif_queue_stopped(struct net_device *ndev)
39575388b9cSBjoern A. Zeeb {
39675388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
39775388b9cSBjoern A. Zeeb 	return (false);
39875388b9cSBjoern A. Zeeb }
39975388b9cSBjoern A. Zeeb 
40075388b9cSBjoern A. Zeeb static __inline void
40175388b9cSBjoern A. Zeeb netif_stop_queue(struct net_device *ndev)
40275388b9cSBjoern A. Zeeb {
40375388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
40475388b9cSBjoern A. Zeeb }
40575388b9cSBjoern A. Zeeb 
40675388b9cSBjoern A. Zeeb static __inline void
40775388b9cSBjoern A. Zeeb netif_wake_queue(struct net_device *ndev)
40875388b9cSBjoern A. Zeeb {
40975388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
41075388b9cSBjoern A. Zeeb }
41175388b9cSBjoern A. Zeeb 
41275388b9cSBjoern A. Zeeb /* -------------------------------------------------------------------------- */
41375388b9cSBjoern A. Zeeb 
41475388b9cSBjoern A. Zeeb static __inline int
41575388b9cSBjoern A. Zeeb register_netdevice(struct net_device *ndev)
41675388b9cSBjoern A. Zeeb {
41775388b9cSBjoern A. Zeeb 
41875388b9cSBjoern A. Zeeb 	/* assert rtnl_locked? */
41975388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
42075388b9cSBjoern A. Zeeb 	return (0);
42175388b9cSBjoern A. Zeeb }
42275388b9cSBjoern A. Zeeb 
42375388b9cSBjoern A. Zeeb static __inline int
42475388b9cSBjoern A. Zeeb register_netdev(struct net_device *ndev)
42575388b9cSBjoern A. Zeeb {
42675388b9cSBjoern A. Zeeb 	int error;
42775388b9cSBjoern A. Zeeb 
42875388b9cSBjoern A. Zeeb 	/* lock */
42975388b9cSBjoern A. Zeeb 	error = register_netdevice(ndev);
43075388b9cSBjoern A. Zeeb 	/* unlock */
43175388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
43275388b9cSBjoern A. Zeeb 	return (error);
43375388b9cSBjoern A. Zeeb }
43475388b9cSBjoern A. Zeeb 
43575388b9cSBjoern A. Zeeb static __inline void
43675388b9cSBjoern A. Zeeb unregister_netdev(struct net_device *ndev)
43775388b9cSBjoern A. Zeeb {
43875388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
43975388b9cSBjoern A. Zeeb }
44075388b9cSBjoern A. Zeeb 
44175388b9cSBjoern A. Zeeb static __inline void
44275388b9cSBjoern A. Zeeb unregister_netdevice(struct net_device *ndev)
44375388b9cSBjoern A. Zeeb {
44475388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
44575388b9cSBjoern A. Zeeb }
44675388b9cSBjoern A. Zeeb 
44775388b9cSBjoern A. Zeeb /* -------------------------------------------------------------------------- */
44875388b9cSBjoern A. Zeeb 
44975388b9cSBjoern A. Zeeb static __inline void
45075388b9cSBjoern A. Zeeb netif_rx(struct sk_buff *skb)
45175388b9cSBjoern A. Zeeb {
45275388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
45375388b9cSBjoern A. Zeeb }
45475388b9cSBjoern A. Zeeb 
45575388b9cSBjoern A. Zeeb static __inline void
45675388b9cSBjoern A. Zeeb netif_rx_ni(struct sk_buff *skb)
45775388b9cSBjoern A. Zeeb {
45875388b9cSBjoern A. Zeeb 	pr_debug("%s: TODO\n", __func__);
45975388b9cSBjoern A. Zeeb }
46075388b9cSBjoern A. Zeeb 
461d1058958SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
462d1058958SBjoern A. Zeeb 
463d1058958SBjoern A. Zeeb struct net_device *linuxkpi_alloc_netdev(size_t, const char *, uint32_t,
464d1058958SBjoern A. Zeeb     void(*)(struct net_device *));
465d1058958SBjoern A. Zeeb void linuxkpi_free_netdev(struct net_device *);
466d1058958SBjoern A. Zeeb 
467d1058958SBjoern A. Zeeb #define	alloc_netdev(_l, _n, _f, _func)						\
468d1058958SBjoern A. Zeeb 	linuxkpi_alloc_netdev(_l, _n, _f, _func)
469*105331f6SBjoern A. Zeeb #define	alloc_netdev_dummy(_l)							\
470*105331f6SBjoern A. Zeeb 	linuxkpi_alloc_netdev(_l, "dummy", NET_NAME_UNKNOWN, NULL)
471d1058958SBjoern A. Zeeb #define	free_netdev(_n)								\
472d1058958SBjoern A. Zeeb 	linuxkpi_free_netdev(_n)
473d1058958SBjoern A. Zeeb 
474d1058958SBjoern A. Zeeb static inline void *
475d1058958SBjoern A. Zeeb netdev_priv(const struct net_device *ndev)
476d1058958SBjoern A. Zeeb {
477d1058958SBjoern A. Zeeb 
478d1058958SBjoern A. Zeeb 	return (__DECONST(void *, ndev->drv_priv));
479d1058958SBjoern A. Zeeb }
480d1058958SBjoern A. Zeeb 
481d1058958SBjoern A. Zeeb /* -------------------------------------------------------------------------- */
482d1058958SBjoern A. Zeeb /* This is really rtnetlink and probably belongs elsewhere. */
483d1058958SBjoern A. Zeeb 
484d1058958SBjoern A. Zeeb #define	rtnl_lock()		do { } while(0)
485d1058958SBjoern A. Zeeb #define	rtnl_unlock()		do { } while(0)
48675388b9cSBjoern A. Zeeb #define	rcu_dereference_rtnl(x)	READ_ONCE(x)
487d1058958SBjoern A. Zeeb 
488d1058958SBjoern A. Zeeb #endif	/* _LINUXKPI_LINUX_NETDEVICE_H */
489