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 */ 468