1 /*-
2 * Copyright (c) 2010 Isilon Systems, Inc.
3 * Copyright (c) 2010 iX Systems, Inc.
4 * Copyright (c) 2010 Panasas, Inc.
5 * Copyright (c) 2013-2019 Mellanox Technologies, Ltd.
6 * All rights reserved.
7 * Copyright (c) 2020-2021 The FreeBSD Foundation
8 * Copyright (c) 2020-2022 Bjoern A. Zeeb
9 *
10 * Portions of this software were developed by Björn Zeeb
11 * under sponsorship from the FreeBSD Foundation.
12 *
13 * Redistribution and use in source and binary forms, with or without
14 * modification, are permitted provided that the following conditions
15 * are met:
16 * 1. Redistributions of source code must retain the above copyright
17 * notice unmodified, this list of conditions, and the following
18 * disclaimer.
19 * 2. Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in the
21 * documentation and/or other materials provided with the distribution.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
24 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
25 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
27 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
28 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
32 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 *
34 * $FreeBSD$
35 */
36 #ifndef _LINUXKPI_LINUX_NETDEVICE_H
37 #define _LINUXKPI_LINUX_NETDEVICE_H
38
39 #include <linux/types.h>
40 #include <linux/netdev_features.h>
41
42 #include <sys/param.h>
43 #include <sys/kernel.h>
44 #include <sys/lock.h>
45 #include <sys/mutex.h>
46 #include <sys/malloc.h>
47 #include <sys/queue.h>
48 #include <sys/socket.h>
49 #include <sys/taskqueue.h>
50
51 #include <net/if_types.h>
52 #include <net/if.h>
53 #include <net/if_var.h>
54 #include <net/if_dl.h>
55
56 #include <linux/kernel.h>
57 #include <linux/bitops.h>
58 #include <linux/list.h>
59 #include <linux/device.h>
60 #include <linux/net.h>
61 #include <linux/if_ether.h>
62 #include <linux/notifier.h>
63 #include <linux/random.h>
64 #include <linux/rcupdate.h>
65
66 #ifdef VIMAGE
67 #define init_net *vnet0
68 #else
69 #define init_net *((struct vnet *)0)
70 #endif
71
72 struct sk_buff;
73 struct net_device;
74 struct wireless_dev; /* net/cfg80211.h */
75
76 #define MAX_ADDR_LEN 20
77
78 #define NET_NAME_UNKNOWN 0
79
80 enum netdev_tx {
81 NETDEV_TX_OK = 0,
82 };
83 typedef enum netdev_tx netdev_tx_t;
84
85 struct netdev_hw_addr {
86 struct list_head addr_list;
87 uint8_t addr[MAX_ADDR_LEN];
88 };
89
90 struct netdev_hw_addr_list {
91 struct list_head addr_list;
92 int count;
93 };
94
95 enum net_device_reg_state {
96 NETREG_DUMMY = 1,
97 NETREG_REGISTERED,
98 };
99
100 struct net_device_ops {
101 int (*ndo_open)(struct net_device *);
102 int (*ndo_stop)(struct net_device *);
103 int (*ndo_set_mac_address)(struct net_device *, void *);
104 netdev_tx_t (*ndo_start_xmit)(struct sk_buff *, struct net_device *);
105 void (*ndo_set_rx_mode)(struct net_device *);
106 };
107
108 struct net_device {
109 /* BSD specific for compat. */
110 struct ifnet bsdifp;
111
112 /* net_device fields seen publicly. */
113 /* XXX can we later make some aliases to ifnet? */
114 char name[IFNAMSIZ];
115 struct wireless_dev *ieee80211_ptr;
116 uint8_t dev_addr[ETH_ALEN];
117 struct netdev_hw_addr_list mc;
118 netdev_features_t features;
119 struct {
120 unsigned long multicast;
121
122 unsigned long rx_bytes;
123 unsigned long rx_errors;
124 unsigned long rx_packets;
125 unsigned long tx_bytes;
126 unsigned long tx_dropped;
127 unsigned long tx_errors;
128 unsigned long tx_packets;
129 } stats;
130 enum net_device_reg_state reg_state;
131 const struct ethtool_ops *ethtool_ops;
132 const struct net_device_ops *netdev_ops;
133
134 bool needs_free_netdev;
135 /* Not properly typed as-of now. */
136 int flags, type;
137 int name_assign_type, needed_headroom;
138 int threaded;
139
140 void (*priv_destructor)(struct net_device *);
141
142 /* net_device internal. */
143 struct device dev;
144
145 /*
146 * In case we delete the net_device we need to be able to clear all
147 * NAPI consumers.
148 */
149 struct mtx napi_mtx;
150 TAILQ_HEAD(, napi_struct) napi_head;
151 struct taskqueue *napi_tq;
152
153 /* Must stay last. */
154 uint8_t drv_priv[0] __aligned(CACHE_LINE_SIZE);
155 };
156
157 #define SET_NETDEV_DEV(_ndev, _dev) (_ndev)->dev.parent = _dev;
158
159 /* -------------------------------------------------------------------------- */
160 /* According to linux::ipoib_main.c. */
161 struct netdev_notifier_info {
162 struct net_device *dev;
163 struct ifnet *ifp;
164 };
165
166 static inline struct net_device *
167 netdev_notifier_info_to_dev(struct netdev_notifier_info *ni)
168 {
169 return (ni->dev);
170 }
171
172 static inline struct ifnet *
173 netdev_notifier_info_to_ifp(struct netdev_notifier_info *ni)
174 {
175 return (ni->ifp);
176 }
177
178 int register_netdevice_notifier(struct notifier_block *);
179 int register_inetaddr_notifier(struct notifier_block *);
180 int unregister_netdevice_notifier(struct notifier_block *);
181 int unregister_inetaddr_notifier(struct notifier_block *);
182
183 /* -------------------------------------------------------------------------- */
184
185 #define NAPI_POLL_WEIGHT 64 /* budget */
186
187 /*
188 * There are drivers directly testing napi state bits, so we need to publicly
189 * expose them. If you ask me, those accesses should be hid behind an
190 * inline function and the bit flags not be directly exposed.
191 */
192 enum napi_state_bits {
193 /*
194 * Official Linux flags encountered.
195 */
196 NAPI_STATE_SCHED = 1,
197
198 /*
199 * Our internal versions (for now).
200 */
201 /* Do not schedule new things while we are waiting to clear things. */
202 LKPI_NAPI_FLAG_DISABLE_PENDING = 0,
203 /* To synchronise that only one poll is ever running. */
204 LKPI_NAPI_FLAG_IS_SCHEDULED = 1,
205 /* If trying to schedule while poll is running. Need to re-schedule. */
206 LKPI_NAPI_FLAG_LOST_RACE_TRY_AGAIN = 2,
207 /* When shutting down forcefully prevent anything from running task/poll. */
208 LKPI_NAPI_FLAG_SHUTDOWN = 3,
209 };
210
211 struct napi_struct {
212 TAILQ_ENTRY(napi_struct) entry;
213
214 struct list_head rx_list;
215 struct net_device *dev;
216 int (*poll)(struct napi_struct *, int);
217 int budget;
218 int rx_count;
219
220
221 /*
222 * These flags mostly need to be checked/changed atomically
223 * (multiple together in some cases).
224 */
225 volatile unsigned long state;
226
227 /* FreeBSD internal. */
228 /* Use task for now, so we can easily switch between direct and task. */
229 struct task napi_task;
230 };
231
232 void linuxkpi_init_dummy_netdev(struct net_device *);
233 void linuxkpi_netif_napi_add(struct net_device *, struct napi_struct *,
234 int(*napi_poll)(struct napi_struct *, int));
235 void linuxkpi_netif_napi_del(struct napi_struct *);
236 bool linuxkpi_napi_schedule_prep(struct napi_struct *);
237 void linuxkpi___napi_schedule(struct napi_struct *);
238 void linuxkpi_napi_schedule(struct napi_struct *);
239 void linuxkpi_napi_reschedule(struct napi_struct *);
240 bool linuxkpi_napi_complete_done(struct napi_struct *, int);
241 bool linuxkpi_napi_complete(struct napi_struct *);
242 void linuxkpi_napi_disable(struct napi_struct *);
243 void linuxkpi_napi_enable(struct napi_struct *);
244 void linuxkpi_napi_synchronize(struct napi_struct *);
245
246 #define init_dummy_netdev(_n) \
247 linuxkpi_init_dummy_netdev(_n)
248 #define netif_napi_add(_nd, _ns, _p) \
249 linuxkpi_netif_napi_add(_nd, _ns, _p)
250 #define netif_napi_del(_n) \
251 linuxkpi_netif_napi_del(_n)
252 #define napi_schedule_prep(_n) \
253 linuxkpi_napi_schedule_prep(_n)
254 #define __napi_schedule(_n) \
255 linuxkpi___napi_schedule(_n)
256 #define napi_schedule(_n) \
257 linuxkpi_napi_schedule(_n)
258 #define napi_reschedule(_n) \
259 linuxkpi_napi_reschedule(_n)
260 #define napi_complete_done(_n, _r) \
261 linuxkpi_napi_complete_done(_n, _r)
262 #define napi_complete(_n) \
263 linuxkpi_napi_complete(_n)
264 #define napi_disable(_n) \
265 linuxkpi_napi_disable(_n)
266 #define napi_enable(_n) \
267 linuxkpi_napi_enable(_n)
268 #define napi_synchronize(_n) \
269 linuxkpi_napi_synchronize(_n)
270
271
272 static inline void
273 netif_napi_add_tx(struct net_device *dev, struct napi_struct *napi,
274 int(*napi_poll)(struct napi_struct *, int))
275 {
276
277 netif_napi_add(dev, napi, napi_poll);
278 }
279
280 /* -------------------------------------------------------------------------- */
281
282 static inline void
283 netdev_rss_key_fill(uint32_t *buf, size_t len)
284 {
285
286 /*
287 * Remembering from a previous life there was discussions on what is
288 * a good RSS hash key. See end of rss_init() in net/rss_config.c.
289 * iwlwifi is looking for a 10byte "secret" so stay with random for now.
290 */
291 get_random_bytes(buf, len);
292 }
293
294 static inline int
295 netdev_hw_addr_list_count(struct netdev_hw_addr_list *list)
296 {
297
298 return (list->count);
299 }
300
301 static inline int
302 netdev_mc_count(struct net_device *ndev)
303 {
304
305 return (netdev_hw_addr_list_count(&ndev->mc));
306 }
307
308 #define netdev_hw_addr_list_for_each(_addr, _list) \
309 list_for_each_entry((_addr), &(_list)->addr_list, addr_list)
310
311 #define netdev_for_each_mc_addr(na, ndev) \
312 netdev_hw_addr_list_for_each(na, &(ndev)->mc)
313
314 static __inline void
315 synchronize_net(void)
316 {
317
318 /* We probably cannot do that unconditionally at some point anymore. */
319 synchronize_rcu();
320 }
321
322 static __inline void
323 netif_receive_skb_list(struct list_head *head)
324 {
325
326 pr_debug("%s: TODO\n", __func__);
327 }
328
329 static __inline int
330 napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
331 {
332
333 pr_debug("%s: TODO\n", __func__);
334 return (-1);
335 }
336
337 static __inline void
338 ether_setup(struct net_device *ndev)
339 {
340
341 pr_debug("%s: TODO\n", __func__);
342 }
343
344 static __inline void
345 dev_net_set(struct net_device *dev, void *p)
346 {
347
348 pr_debug("%s: TODO\n", __func__);
349 }
350
351 /* -------------------------------------------------------------------------- */
352
353 static __inline bool
354 netif_carrier_ok(struct net_device *ndev)
355 {
356 pr_debug("%s: TODO\n", __func__);
357 return (false);
358 }
359
360 static __inline void
361 netif_carrier_off(struct net_device *ndev)
362 {
363 pr_debug("%s: TODO\n", __func__);
364 }
365
366 static __inline void
367 netif_carrier_on(struct net_device *ndev)
368 {
369 pr_debug("%s: TODO\n", __func__);
370 }
371
372 /* -------------------------------------------------------------------------- */
373
374 static __inline bool
375 netif_queue_stopped(struct net_device *ndev)
376 {
377 pr_debug("%s: TODO\n", __func__);
378 return (false);
379 }
380
381 static __inline void
382 netif_stop_queue(struct net_device *ndev)
383 {
384 pr_debug("%s: TODO\n", __func__);
385 }
386
387 static __inline void
388 netif_wake_queue(struct net_device *ndev)
389 {
390 pr_debug("%s: TODO\n", __func__);
391 }
392
393 /* -------------------------------------------------------------------------- */
394
395 static __inline int
396 register_netdevice(struct net_device *ndev)
397 {
398
399 /* assert rtnl_locked? */
400 pr_debug("%s: TODO\n", __func__);
401 return (0);
402 }
403
404 static __inline int
405 register_netdev(struct net_device *ndev)
406 {
407 int error;
408
409 /* lock */
410 error = register_netdevice(ndev);
411 /* unlock */
412 pr_debug("%s: TODO\n", __func__);
413 return (error);
414 }
415
416 static __inline void
417 unregister_netdev(struct net_device *ndev)
418 {
419 pr_debug("%s: TODO\n", __func__);
420 }
421
422 static __inline void
423 unregister_netdevice(struct net_device *ndev)
424 {
425 pr_debug("%s: TODO\n", __func__);
426 }
427
428 /* -------------------------------------------------------------------------- */
429
430 static __inline void
431 netif_rx(struct sk_buff *skb)
432 {
433 pr_debug("%s: TODO\n", __func__);
434 }
435
436 static __inline void
437 netif_rx_ni(struct sk_buff *skb)
438 {
439 pr_debug("%s: TODO\n", __func__);
440 }
441
442 /* -------------------------------------------------------------------------- */
443
444 struct net_device *linuxkpi_alloc_netdev(size_t, const char *, uint32_t,
445 void(*)(struct net_device *));
446 void linuxkpi_free_netdev(struct net_device *);
447
448 #define alloc_netdev(_l, _n, _f, _func) \
449 linuxkpi_alloc_netdev(_l, _n, _f, _func)
450 #define free_netdev(_n) \
451 linuxkpi_free_netdev(_n)
452
453 static inline void *
454 netdev_priv(const struct net_device *ndev)
455 {
456
457 return (__DECONST(void *, ndev->drv_priv));
458 }
459
460 /* -------------------------------------------------------------------------- */
461 /* This is really rtnetlink and probably belongs elsewhere. */
462
463 #define rtnl_lock() do { } while(0)
464 #define rtnl_unlock() do { } while(0)
465 #define rcu_dereference_rtnl(x) READ_ONCE(x)
466
467 #endif /* _LINUXKPI_LINUX_NETDEVICE_H */
Cache object: 25f3e6b338256cf9f6d5855b363770e2
|