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