The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/compat/linuxkpi/common/include/linux/netdevice.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.