Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


SSL netdevice.h   Interaktion und
PortierbarkeitC

 
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * INET An implementation of the TCP/IP protocol suite for the LINUX
 * operating system.  INET is implemented using the  BSD Socket
 * interface as the means of communication with the user level.
 *
 * Definitions for the Interfaces handler.
 *
 * Version: @(#)dev.h 1.0.10 08/12/93
 *
 * Authors: Ross Biro
 * Fred N. van Kempen, <waltje@uWalt.NL.Mugnet.ORG>
 * Corey Minyard <wf-rch!minyard@relay.EU.net>
 * Donald J. Becker, <becker@cesdis.gsfc.nasa.gov>
 * Alan Cox, <alan@lxorguk.ukuu.org.uk>
 * Bjorn Ekwall. <bj0rn@blox.se>
 *              Pekka Riikonen <priikone@poseidon.pspt.fi>
 *
 * Moved to /usr/include/linux for NET3
 */

#ifndef _LINUX_NETDEVICE_H
#define _LINUX_NETDEVICE_H

#include <linux/timer.h>
#include <linux/bug.h>
#include <linux/delay.h>
#include <linux/atomic.h>
#include <linux/prefetch.h>
#include <asm/cache.h>
#include <asm/byteorder.h>
#include <asm/local.h>

#include <linux/percpu.h>
#include <linux/rculist.h>
#include <linux/workqueue.h>
#include <linux/dynamic_queue_limits.h>

#include <net/net_namespace.h>
#ifdef CONFIG_DCB
#include <net/dcbnl.h>
#endif
#include <net/netprio_cgroup.h>
#include <linux/netdev_features.h>
#include <linux/neighbour.h>
#include <linux/netdevice_xmit.h>
#include <uapi/linux/netdevice.h>
#include <uapi/linux/if_bonding.h>
#include <uapi/linux/pkt_cls.h>
#include <uapi/linux/netdev.h>
#include <linux/hashtable.h>
#include <linux/rbtree.h>
#include <net/net_trackers.h>
#include <net/net_debug.h>
#include <net/dropreason-core.h>
#include <net/neighbour_tables.h>

struct netpoll_info;
struct device;
struct ethtool_ops;
struct kernel_hwtstamp_config;
struct phy_device;
struct dsa_port;
struct ip_tunnel_parm_kern;
struct macsec_context;
struct macsec_ops;
struct netdev_config;
struct netdev_name_node;
struct sd_flow_limit;
struct sfp_bus;
/* 802.11 specific */
struct wireless_dev;
/* 802.15.4 specific */
struct wpan_dev;
struct mpls_dev;
/* UDP Tunnel offloads */
struct udp_tunnel_info;
struct udp_tunnel_nic_info;
struct udp_tunnel_nic;
struct bpf_prog;
struct xdp_buff;
struct xdp_frame;
struct xdp_metadata_ops;
struct xdp_md;
struct ethtool_netdev_state;
struct phy_link_topology;
struct hwtstamp_provider;

typedef u32 xdp_features_t;

void synchronize_net(void);
void netdev_set_default_ethtool_ops(struct net_device *dev,
        const struct ethtool_ops *ops);
void netdev_sw_irq_coalesce_default_on(struct net_device *dev);

/* Backlog congestion levels */
#define NET_RX_SUCCESS  0 /* keep 'em coming, baby */
#define NET_RX_DROP  1 /* packet dropped */

#define MAX_NEST_DEV 8

/*
 * Transmit return codes: transmit return codes originate from three different
 * namespaces:
 *
 * - qdisc return codes
 * - driver transmit return codes
 * - errno values
 *
 * Drivers are allowed to return any one of those in their hard_start_xmit()
 * function. Real network devices commonly used with qdiscs should only return
 * the driver transmit return codes though - when qdiscs are used, the actual
 * transmission happens asynchronously, so the value is not propagated to
 * higher layers. Virtual network devices transmit synchronously; in this case
 * the driver transmit return codes are consumed by dev_queue_xmit(), and all
 * others are propagated to higher layers.
 */


/* qdisc ->enqueue() return codes. */
#define NET_XMIT_SUCCESS 0x00
#define NET_XMIT_DROP  0x01 /* skb dropped */
#define NET_XMIT_CN  0x02 /* congestion notification */
#define NET_XMIT_MASK  0x0f /* qdisc flags in net/sch_generic.h */

/* NET_XMIT_CN is special. It does not guarantee that this packet is lost. It
 * indicates that the device will soon be dropping packets, or already drops
 * some packets of the same priority; prompting us to send less aggressively. */

#define net_xmit_eval(e) ((e) == NET_XMIT_CN ? 0 : (e))
#define net_xmit_errno(e) ((e) != NET_XMIT_CN ? -ENOBUFS : 0)

/* Driver transmit return codes */
#define NETDEV_TX_MASK  0xf0

enum netdev_tx {
 __NETDEV_TX_MIN  = INT_MIN, /* make sure enum is signed */
 NETDEV_TX_OK  = 0x00, /* driver took care of packet */
 NETDEV_TX_BUSY  = 0x10, /* driver tx path was busy*/
};
typedef enum netdev_tx netdev_tx_t;

/*
 * Current order: NETDEV_TX_MASK > NET_XMIT_MASK >= 0 is significant;
 * hard_start_xmit() return < NET_XMIT_MASK means skb was consumed.
 */

static inline bool dev_xmit_complete(int rc)
{
 /*
 * Positive cases with an skb consumed by a driver:
 * - successful transmission (rc == NETDEV_TX_OK)
 * - error while transmitting (rc < 0)
 * - error while queueing to a different device (rc & NET_XMIT_MASK)
 */

 if (likely(rc < NET_XMIT_MASK))
  return true;

 return false;
}

/*
 * Compute the worst-case header length according to the protocols
 * used.
 */


#if defined(CONFIG_HYPERV_NET)
define LL_MAX_HEADER 128
#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25)
if defined(CONFIG_MAC80211_MESH)
#  define LL_MAX_HEADER 128
else
#  define LL_MAX_HEADER 96
endif
#else
define LL_MAX_HEADER 32
#endif

#if !IS_ENABLED(CONFIG_NET_IPIP) && !IS_ENABLED(CONFIG_NET_IPGRE) && \
    !IS_ENABLED(CONFIG_IPV6_SIT) && !IS_ENABLED(CONFIG_IPV6_TUNNEL)
#define MAX_HEADER LL_MAX_HEADER
#else
#define MAX_HEADER (LL_MAX_HEADER + 48)
#endif

/*
 * Old network device statistics. Fields are native words
 * (unsigned long) so they can be read and written atomically.
 */


#define NET_DEV_STAT(FIELD)   \
 union {     \
  unsigned long FIELD;  \
  atomic_long_t __##FIELD; \
 }

struct net_device_stats {
 NET_DEV_STAT(rx_packets);
 NET_DEV_STAT(tx_packets);
 NET_DEV_STAT(rx_bytes);
 NET_DEV_STAT(tx_bytes);
 NET_DEV_STAT(rx_errors);
 NET_DEV_STAT(tx_errors);
 NET_DEV_STAT(rx_dropped);
 NET_DEV_STAT(tx_dropped);
 NET_DEV_STAT(multicast);
 NET_DEV_STAT(collisions);
 NET_DEV_STAT(rx_length_errors);
 NET_DEV_STAT(rx_over_errors);
 NET_DEV_STAT(rx_crc_errors);
 NET_DEV_STAT(rx_frame_errors);
 NET_DEV_STAT(rx_fifo_errors);
 NET_DEV_STAT(rx_missed_errors);
 NET_DEV_STAT(tx_aborted_errors);
 NET_DEV_STAT(tx_carrier_errors);
 NET_DEV_STAT(tx_fifo_errors);
 NET_DEV_STAT(tx_heartbeat_errors);
 NET_DEV_STAT(tx_window_errors);
 NET_DEV_STAT(rx_compressed);
 NET_DEV_STAT(tx_compressed);
};
#undef NET_DEV_STAT

/* per-cpu stats, allocated on demand.
 * Try to fit them in a single cache line, for dev_get_stats() sake.
 */

struct net_device_core_stats {
 unsigned long rx_dropped;
 unsigned long tx_dropped;
 unsigned long rx_nohandler;
 unsigned long rx_otherhost_dropped;
} __aligned(4 * sizeof(unsigned long));

#include <linux/cache.h>
#include <linux/skbuff.h>

struct neighbour;
struct neigh_parms;
struct sk_buff;

struct netdev_hw_addr {
 struct list_head list;
 struct rb_node  node;
 unsigned char  addr[MAX_ADDR_LEN];
 unsigned char  type;
#define NETDEV_HW_ADDR_T_LAN  1
#define NETDEV_HW_ADDR_T_SAN  2
#define NETDEV_HW_ADDR_T_UNICAST 3
#define NETDEV_HW_ADDR_T_MULTICAST 4
 bool   global_use;
 int   sync_cnt;
 int   refcount;
 int   synced;
 struct rcu_head  rcu_head;
};

struct netdev_hw_addr_list {
 struct list_head list;
 int   count;

 /* Auxiliary tree for faster lookup on addition and deletion */
 struct rb_root  tree;
};

#define netdev_hw_addr_list_count(l) ((l)->count)
#define netdev_hw_addr_list_empty(l) (netdev_hw_addr_list_count(l) == 0)
#define netdev_hw_addr_list_for_each(ha, l) \
 list_for_each_entry(ha, &(l)->list, list)

#define netdev_uc_count(dev) netdev_hw_addr_list_count(&(dev)->uc)
#define netdev_uc_empty(dev) netdev_hw_addr_list_empty(&(dev)->uc)
#define netdev_for_each_uc_addr(ha, dev) \
 netdev_hw_addr_list_for_each(ha, &(dev)->uc)
#define netdev_for_each_synced_uc_addr(_ha, _dev) \
 netdev_for_each_uc_addr((_ha), (_dev)) \
  if ((_ha)->sync_cnt)

#define netdev_mc_count(dev) netdev_hw_addr_list_count(&(dev)->mc)
#define netdev_mc_empty(dev) netdev_hw_addr_list_empty(&(dev)->mc)
#define netdev_for_each_mc_addr(ha, dev) \
 netdev_hw_addr_list_for_each(ha, &(dev)->mc)
#define netdev_for_each_synced_mc_addr(_ha, _dev) \
 netdev_for_each_mc_addr((_ha), (_dev)) \
  if ((_ha)->sync_cnt)

struct hh_cache {
 unsigned int hh_len;
 seqlock_t hh_lock;

 /* cached hardware header; allow for machine alignment needs.        */
#define HH_DATA_MOD 16
#define HH_DATA_OFF(__len) \
 (HH_DATA_MOD - (((__len - 1) & (HH_DATA_MOD - 1)) + 1))
#define HH_DATA_ALIGN(__len) \
 (((__len)+(HH_DATA_MOD-1))&~(HH_DATA_MOD - 1))
 unsigned long hh_data[HH_DATA_ALIGN(LL_MAX_HEADER) / sizeof(long)];
};

/* Reserve HH_DATA_MOD byte-aligned hard_header_len, but at least that much.
 * Alternative is:
 *   dev->hard_header_len ? (dev->hard_header_len +
 *                           (HH_DATA_MOD - 1)) & ~(HH_DATA_MOD - 1) : 0
 *
 * We could use other alignment values, but we must maintain the
 * relationship HH alignment <= LL alignment.
 */

#define LL_RESERVED_SPACE(dev) \
 ((((dev)->hard_header_len + READ_ONCE((dev)->needed_headroom)) \
   & ~(HH_DATA_MOD - 1)) + HH_DATA_MOD)
#define LL_RESERVED_SPACE_EXTRA(dev,extra) \
 ((((dev)->hard_header_len + READ_ONCE((dev)->needed_headroom) + (extra)) \
   & ~(HH_DATA_MOD - 1)) + HH_DATA_MOD)

struct header_ops {
 int (*create) (struct sk_buff *skb, struct net_device *dev,
      unsigned short type, const void *daddr,
      const void *saddr, unsigned int len);
 int (*parse)(const struct sk_buff *skb, unsigned char *haddr);
 int (*cache)(const struct neighbour *neigh, struct hh_cache *hh, __be16 type);
 void (*cache_update)(struct hh_cache *hh,
    const struct net_device *dev,
    const unsigned char *haddr);
 bool (*validate)(const char *ll_header, unsigned int len);
 __be16 (*parse_protocol)(const struct sk_buff *skb);
};

/* These flag bits are private to the generic network queueing
 * layer; they may not be explicitly referenced by any other
 * code.
 */


enum netdev_state_t {
 __LINK_STATE_START,
 __LINK_STATE_PRESENT,
 __LINK_STATE_NOCARRIER,
 __LINK_STATE_LINKWATCH_PENDING,
 __LINK_STATE_DORMANT,
 __LINK_STATE_TESTING,
};

struct gro_list {
 struct list_head list;
 int   count;
};

/*
 * size of gro hash buckets, must be <= the number of bits in
 * gro_node::bitmask
 */

#define GRO_HASH_BUCKETS 8

/**
 * struct gro_node - structure to support Generic Receive Offload
 * @bitmask: bitmask to indicate used buckets in @hash
 * @hash: hashtable of pending aggregated skbs, separated by flows
 * @rx_list: list of pending ``GRO_NORMAL`` skbs
 * @rx_count: cached current length of @rx_list
 * @cached_napi_id: napi_struct::napi_id cached for hotpath, 0 for standalone
 */

struct gro_node {
 unsigned long  bitmask;
 struct gro_list  hash[GRO_HASH_BUCKETS];
 struct list_head rx_list;
 u32   rx_count;
 u32   cached_napi_id;
};

/*
 * Structure for per-NAPI config
 */

struct napi_config {
 u64 gro_flush_timeout;
 u64 irq_suspend_timeout;
 u32 defer_hard_irqs;
 cpumask_t affinity_mask;
 u8 threaded;
 unsigned int napi_id;
};

/*
 * Structure for NAPI scheduling similar to tasklet but with weighting
 */

struct napi_struct {
 /* The poll_list must only be managed by the entity which
 * changes the state of the NAPI_STATE_SCHED bit.  This means
 * whoever atomically sets that bit can add this napi_struct
 * to the per-CPU poll_list, and whoever clears that bit
 * can remove from the list right before clearing the bit.
 */

 struct list_head poll_list;

 unsigned long  state;
 int   weight;
 u32   defer_hard_irqs_count;
 int   (*poll)(struct napi_struct *, int);
#ifdef CONFIG_NETPOLL
 /* CPU actively polling if netpoll is configured */
 int   poll_owner;
#endif
 /* CPU on which NAPI has been scheduled for processing */
 int   list_owner;
 struct net_device *dev;
 struct sk_buff  *skb;
 struct gro_node  gro;
 struct hrtimer  timer;
 /* all fields past this point are write-protected by netdev_lock */
 struct task_struct *thread;
 unsigned long  gro_flush_timeout;
 unsigned long  irq_suspend_timeout;
 u32   defer_hard_irqs;
 /* control-path-only fields follow */
 u32   napi_id;
 struct list_head dev_list;
 struct hlist_node napi_hash_node;
 int   irq;
 struct irq_affinity_notify notify;
 int   napi_rmap_idx;
 int   index;
 struct napi_config *config;
};

enum {
 NAPI_STATE_SCHED,  /* Poll is scheduled */
 NAPI_STATE_MISSED,  /* reschedule a napi */
 NAPI_STATE_DISABLE,  /* Disable pending */
 NAPI_STATE_NPSVC,  /* Netpoll - don't dequeue from poll_list */
 NAPI_STATE_LISTED,  /* NAPI added to system lists */
 NAPI_STATE_NO_BUSY_POLL, /* Do not add in napi_hash, no busy polling */
 NAPI_STATE_IN_BUSY_POLL, /* sk_busy_loop() owns this NAPI */
 NAPI_STATE_PREFER_BUSY_POLL, /* prefer busy-polling over softirq processing*/
 NAPI_STATE_THREADED,  /* The poll is performed inside its own thread*/
 NAPI_STATE_SCHED_THREADED, /* Napi is currently scheduled in threaded mode */
 NAPI_STATE_HAS_NOTIFIER, /* Napi has an IRQ notifier */
};

enum {
 NAPIF_STATE_SCHED  = BIT(NAPI_STATE_SCHED),
 NAPIF_STATE_MISSED  = BIT(NAPI_STATE_MISSED),
 NAPIF_STATE_DISABLE  = BIT(NAPI_STATE_DISABLE),
 NAPIF_STATE_NPSVC  = BIT(NAPI_STATE_NPSVC),
 NAPIF_STATE_LISTED  = BIT(NAPI_STATE_LISTED),
 NAPIF_STATE_NO_BUSY_POLL = BIT(NAPI_STATE_NO_BUSY_POLL),
 NAPIF_STATE_IN_BUSY_POLL = BIT(NAPI_STATE_IN_BUSY_POLL),
 NAPIF_STATE_PREFER_BUSY_POLL = BIT(NAPI_STATE_PREFER_BUSY_POLL),
 NAPIF_STATE_THREADED  = BIT(NAPI_STATE_THREADED),
 NAPIF_STATE_SCHED_THREADED = BIT(NAPI_STATE_SCHED_THREADED),
 NAPIF_STATE_HAS_NOTIFIER = BIT(NAPI_STATE_HAS_NOTIFIER),
};

enum gro_result {
 GRO_MERGED,
 GRO_MERGED_FREE,
 GRO_HELD,
 GRO_NORMAL,
 GRO_CONSUMED,
};
typedef enum gro_result gro_result_t;

/*
 * enum rx_handler_result - Possible return values for rx_handlers.
 * @RX_HANDLER_CONSUMED: skb was consumed by rx_handler, do not process it
 * further.
 * @RX_HANDLER_ANOTHER: Do another round in receive path. This is indicated in
 * case skb->dev was changed by rx_handler.
 * @RX_HANDLER_EXACT: Force exact delivery, no wildcard.
 * @RX_HANDLER_PASS: Do nothing, pass the skb as if no rx_handler was called.
 *
 * rx_handlers are functions called from inside __netif_receive_skb(), to do
 * special processing of the skb, prior to delivery to protocol handlers.
 *
 * Currently, a net_device can only have a single rx_handler registered. Trying
 * to register a second rx_handler will return -EBUSY.
 *
 * To register a rx_handler on a net_device, use netdev_rx_handler_register().
 * To unregister a rx_handler on a net_device, use
 * netdev_rx_handler_unregister().
 *
 * Upon return, rx_handler is expected to tell __netif_receive_skb() what to
 * do with the skb.
 *
 * If the rx_handler consumed the skb in some way, it should return
 * RX_HANDLER_CONSUMED. This is appropriate when the rx_handler arranged for
 * the skb to be delivered in some other way.
 *
 * If the rx_handler changed skb->dev, to divert the skb to another
 * net_device, it should return RX_HANDLER_ANOTHER. The rx_handler for the
 * new device will be called if it exists.
 *
 * If the rx_handler decides the skb should be ignored, it should return
 * RX_HANDLER_EXACT. The skb will only be delivered to protocol handlers that
 * are registered on exact device (ptype->dev == skb->dev).
 *
 * If the rx_handler didn't change skb->dev, but wants the skb to be normally
 * delivered, it should return RX_HANDLER_PASS.
 *
 * A device without a registered rx_handler will behave as if rx_handler
 * returned RX_HANDLER_PASS.
 */


enum rx_handler_result {
 RX_HANDLER_CONSUMED,
 RX_HANDLER_ANOTHER,
 RX_HANDLER_EXACT,
 RX_HANDLER_PASS,
};
typedef enum rx_handler_result rx_handler_result_t;
typedef rx_handler_result_t rx_handler_func_t(struct sk_buff **pskb);

void __napi_schedule(struct napi_struct *n);
void __napi_schedule_irqoff(struct napi_struct *n);

static inline bool napi_disable_pending(struct napi_struct *n)
{
 return test_bit(NAPI_STATE_DISABLE, &n->state);
}

static inline bool napi_prefer_busy_poll(struct napi_struct *n)
{
 return test_bit(NAPI_STATE_PREFER_BUSY_POLL, &n->state);
}

/**
 * napi_is_scheduled - test if NAPI is scheduled
 * @n: NAPI context
 *
 * This check is "best-effort". With no locking implemented,
 * a NAPI can be scheduled or terminate right after this check
 * and produce not precise results.
 *
 * NAPI_STATE_SCHED is an internal state, napi_is_scheduled
 * should not be used normally and napi_schedule should be
 * used instead.
 *
 * Use only if the driver really needs to check if a NAPI
 * is scheduled for example in the context of delayed timer
 * that can be skipped if a NAPI is already scheduled.
 *
 * Return: True if NAPI is scheduled, False otherwise.
 */

static inline bool napi_is_scheduled(struct napi_struct *n)
{
 return test_bit(NAPI_STATE_SCHED, &n->state);
}

bool napi_schedule_prep(struct napi_struct *n);

/**
 * napi_schedule - schedule NAPI poll
 * @n: NAPI context
 *
 * Schedule NAPI poll routine to be called if it is not already
 * running.
 * Return: true if we schedule a NAPI or false if not.
 * Refer to napi_schedule_prep() for additional reason on why
 * a NAPI might not be scheduled.
 */

static inline bool napi_schedule(struct napi_struct *n)
{
 if (napi_schedule_prep(n)) {
  __napi_schedule(n);
  return true;
 }

 return false;
}

/**
 * napi_schedule_irqoff - schedule NAPI poll
 * @n: NAPI context
 *
 * Variant of napi_schedule(), assuming hard irqs are masked.
 */

static inline void napi_schedule_irqoff(struct napi_struct *n)
{
 if (napi_schedule_prep(n))
  __napi_schedule_irqoff(n);
}

/**
 * napi_complete_done - NAPI processing complete
 * @n: NAPI context
 * @work_done: number of packets processed
 *
 * Mark NAPI processing as complete. Should only be called if poll budget
 * has not been completely consumed.
 * Prefer over napi_complete().
 * Return: false if device should avoid rearming interrupts.
 */

bool napi_complete_done(struct napi_struct *n, int work_done);

static inline bool napi_complete(struct napi_struct *n)
{
 return napi_complete_done(n, 0);
}

void netif_threaded_enable(struct net_device *dev);
int dev_set_threaded(struct net_device *dev,
       enum netdev_napi_threaded threaded);

void napi_disable(struct napi_struct *n);
void napi_disable_locked(struct napi_struct *n);

void napi_enable(struct napi_struct *n);
void napi_enable_locked(struct napi_struct *n);

/**
 * napi_synchronize - wait until NAPI is not running
 * @n: NAPI context
 *
 * Wait until NAPI is done being scheduled on this context.
 * Waits till any outstanding processing completes but
 * does not disable future activations.
 */

static inline void napi_synchronize(const struct napi_struct *n)
{
 if (IS_ENABLED(CONFIG_SMP))
  while (test_bit(NAPI_STATE_SCHED, &n->state))
   msleep(1);
 else
  barrier();
}

/**
 * napi_if_scheduled_mark_missed - if napi is running, set the
 * NAPIF_STATE_MISSED
 * @n: NAPI context
 *
 * If napi is running, set the NAPIF_STATE_MISSED, and return true if
 * NAPI is scheduled.
 **/

static inline bool napi_if_scheduled_mark_missed(struct napi_struct *n)
{
 unsigned long val, new;

 val = READ_ONCE(n->state);
 do {
  if (val & NAPIF_STATE_DISABLE)
   return true;

  if (!(val & NAPIF_STATE_SCHED))
   return false;

  new = val | NAPIF_STATE_MISSED;
 } while (!try_cmpxchg(&n->state, &val, new));

 return true;
}

enum netdev_queue_state_t {
 __QUEUE_STATE_DRV_XOFF,
 __QUEUE_STATE_STACK_XOFF,
 __QUEUE_STATE_FROZEN,
};

#define QUEUE_STATE_DRV_XOFF (1 << __QUEUE_STATE_DRV_XOFF)
#define QUEUE_STATE_STACK_XOFF (1 << __QUEUE_STATE_STACK_XOFF)
#define QUEUE_STATE_FROZEN (1 << __QUEUE_STATE_FROZEN)

#define QUEUE_STATE_ANY_XOFF (QUEUE_STATE_DRV_XOFF | QUEUE_STATE_STACK_XOFF)
#define QUEUE_STATE_ANY_XOFF_OR_FROZEN (QUEUE_STATE_ANY_XOFF | \
     QUEUE_STATE_FROZEN)
#define QUEUE_STATE_DRV_XOFF_OR_FROZEN (QUEUE_STATE_DRV_XOFF | \
     QUEUE_STATE_FROZEN)

/*
 * __QUEUE_STATE_DRV_XOFF is used by drivers to stop the transmit queue.  The
 * netif_tx_* functions below are used to manipulate this flag.  The
 * __QUEUE_STATE_STACK_XOFF flag is used by the stack to stop the transmit
 * queue independently.  The netif_xmit_*stopped functions below are called
 * to check if the queue has been stopped by the driver or stack (either
 * of the XOFF bits are set in the state).  Drivers should not need to call
 * netif_xmit*stopped functions, they should only be using netif_tx_*.
 */


struct netdev_queue {
/*
 * read-mostly part
 */

 struct net_device *dev;
 netdevice_tracker dev_tracker;

 struct Qdisc __rcu *qdisc;
 struct Qdisc __rcu *qdisc_sleeping;
#ifdef CONFIG_SYSFS
 struct kobject  kobj;
 const struct attribute_group **groups;
#endif
 unsigned long  tx_maxrate;
 /*
 * Number of TX timeouts for this queue
 * (/sys/class/net/DEV/Q/trans_timeout)
 */

 atomic_long_t  trans_timeout;

 /* Subordinate device that the queue has been assigned to */
 struct net_device *sb_dev;
#ifdef CONFIG_XDP_SOCKETS
 /* "ops protected", see comment about net_device::lock */
 struct xsk_buff_pool    *pool;
#endif

/*
 * write-mostly part
 */

#ifdef CONFIG_BQL
 struct dql  dql;
#endif
 spinlock_t  _xmit_lock ____cacheline_aligned_in_smp;
 int   xmit_lock_owner;
 /*
 * Time (in jiffies) of last Tx
 */

 unsigned long  trans_start;

 unsigned long  state;

/*
 * slow- / control-path part
 */

 /* NAPI instance for the queue
 * "ops protected", see comment about net_device::lock
 */

 struct napi_struct *napi;

#if defined(CONFIG_XPS) && defined(CONFIG_NUMA)
 int   numa_node;
#endif
} ____cacheline_aligned_in_smp;

extern int sysctl_fb_tunnels_only_for_init_net;
extern int sysctl_devconf_inherit_init_net;

/*
 * sysctl_fb_tunnels_only_for_init_net == 0 : For all netns
 *                                     == 1 : For initns only
 *                                     == 2 : For none.
 */

static inline bool net_has_fallback_tunnels(const struct net *net)
{
#if IS_ENABLED(CONFIG_SYSCTL)
 int fb_tunnels_only_for_init_net = READ_ONCE(sysctl_fb_tunnels_only_for_init_net);

 return !fb_tunnels_only_for_init_net ||
  (net_eq(net, &init_net) && fb_tunnels_only_for_init_net == 1);
#else
 return true;
#endif
}

static inline int net_inherit_devconf(void)
{
#if IS_ENABLED(CONFIG_SYSCTL)
 return READ_ONCE(sysctl_devconf_inherit_init_net);
#else
 return 0;
#endif
}

static inline int netdev_queue_numa_node_read(const struct netdev_queue *q)
{
#if defined(CONFIG_XPS) && defined(CONFIG_NUMA)
 return q->numa_node;
#else
 return NUMA_NO_NODE;
#endif
}

static inline void netdev_queue_numa_node_write(struct netdev_queue *q, int node)
{
#if defined(CONFIG_XPS) && defined(CONFIG_NUMA)
 q->numa_node = node;
#endif
}

#ifdef CONFIG_RFS_ACCEL
bool rps_may_expire_flow(struct net_device *dev, u16 rxq_index, u32 flow_id,
    u16 filter_id);
#endif

/* XPS map type and offset of the xps map within net_device->xps_maps[]. */
enum xps_map_type {
 XPS_CPUS = 0,
 XPS_RXQS,
 XPS_MAPS_MAX,
};

#ifdef CONFIG_XPS
/*
 * This structure holds an XPS map which can be of variable length.  The
 * map is an array of queues.
 */

struct xps_map {
 unsigned int len;
 unsigned int alloc_len;
 struct rcu_head rcu;
 u16 queues[];
};
#define XPS_MAP_SIZE(_num) (sizeof(struct xps_map) + ((_num) * sizeof(u16)))
#define XPS_MIN_MAP_ALLOC ((L1_CACHE_ALIGN(offsetof(struct xps_map, queues[1])) \
       - sizeof(struct xps_map)) / sizeof(u16))

/*
 * This structure holds all XPS maps for device.  Maps are indexed by CPU.
 *
 * We keep track of the number of cpus/rxqs used when the struct is allocated,
 * in nr_ids. This will help not accessing out-of-bound memory.
 *
 * We keep track of the number of traffic classes used when the struct is
 * allocated, in num_tc. This will be used to navigate the maps, to ensure we're
 * not crossing its upper bound, as the original dev->num_tc can be updated in
 * the meantime.
 */

struct xps_dev_maps {
 struct rcu_head rcu;
 unsigned int nr_ids;
 s16 num_tc;
 struct xps_map __rcu *attr_map[]; /* Either CPUs map or RXQs map */
};

#define XPS_CPU_DEV_MAPS_SIZE(_tcs) (sizeof(struct xps_dev_maps) + \
 (nr_cpu_ids * (_tcs) * sizeof(struct xps_map *)))

#define XPS_RXQ_DEV_MAPS_SIZE(_tcs, _rxqs) (sizeof(struct xps_dev_maps) +\
 (_rxqs * (_tcs) * sizeof(struct xps_map *)))

#endif /* CONFIG_XPS */

#define TC_MAX_QUEUE 16
#define TC_BITMASK 15
/* HW offloaded queuing disciplines txq count and offset maps */
struct netdev_tc_txq {
 u16 count;
 u16 offset;
};

#if defined(CONFIG_FCOE) || defined(CONFIG_FCOE_MODULE)
/*
 * This structure is to hold information about the device
 * configured to run FCoE protocol stack.
 */

struct netdev_fcoe_hbainfo {
 char manufacturer[64];
 char serial_number[64];
 char hardware_version[64];
 char driver_version[64];
 char optionrom_version[64];
 char firmware_version[64];
 char model[256];
 char model_description[256];
};
#endif

#define MAX_PHYS_ITEM_ID_LEN 32

/* This structure holds a unique identifier to identify some
 * physical item (port for example) used by a netdevice.
 */

struct netdev_phys_item_id {
 unsigned char id[MAX_PHYS_ITEM_ID_LEN];
 unsigned char id_len;
};

static inline bool netdev_phys_item_id_same(struct netdev_phys_item_id *a,
         struct netdev_phys_item_id *b)
{
 return a->id_len == b->id_len &&
        memcmp(a->id, b->id, a->id_len) == 0;
}

typedef u16 (*select_queue_fallback_t)(struct net_device *dev,
           struct sk_buff *skb,
           struct net_device *sb_dev);

enum net_device_path_type {
 DEV_PATH_ETHERNET = 0,
 DEV_PATH_VLAN,
 DEV_PATH_BRIDGE,
 DEV_PATH_PPPOE,
 DEV_PATH_DSA,
 DEV_PATH_MTK_WDMA,
};

struct net_device_path {
 enum net_device_path_type type;
 const struct net_device  *dev;
 union {
  struct {
   u16  id;
   __be16  proto;
   u8  h_dest[ETH_ALEN];
  } encap;
  struct {
   enum {
    DEV_PATH_BR_VLAN_KEEP,
    DEV_PATH_BR_VLAN_TAG,
    DEV_PATH_BR_VLAN_UNTAG,
    DEV_PATH_BR_VLAN_UNTAG_HW,
   }  vlan_mode;
   u16  vlan_id;
   __be16  vlan_proto;
  } bridge;
  struct {
   int port;
   u16 proto;
  } dsa;
  struct {
   u8 wdma_idx;
   u8 queue;
   u16 wcid;
   u8 bss;
   u8 amsdu;
  } mtk_wdma;
 };
};

#define NET_DEVICE_PATH_STACK_MAX 5
#define NET_DEVICE_PATH_VLAN_MAX 2

struct net_device_path_stack {
 int   num_paths;
 struct net_device_path path[NET_DEVICE_PATH_STACK_MAX];
};

struct net_device_path_ctx {
 const struct net_device *dev;
 u8   daddr[ETH_ALEN];

 int   num_vlans;
 struct {
  u16  id;
  __be16  proto;
 } vlan[NET_DEVICE_PATH_VLAN_MAX];
};

enum tc_setup_type {
 TC_QUERY_CAPS,
 TC_SETUP_QDISC_MQPRIO,
 TC_SETUP_CLSU32,
 TC_SETUP_CLSFLOWER,
 TC_SETUP_CLSMATCHALL,
 TC_SETUP_CLSBPF,
 TC_SETUP_BLOCK,
 TC_SETUP_QDISC_CBS,
 TC_SETUP_QDISC_RED,
 TC_SETUP_QDISC_PRIO,
 TC_SETUP_QDISC_MQ,
 TC_SETUP_QDISC_ETF,
 TC_SETUP_ROOT_QDISC,
 TC_SETUP_QDISC_GRED,
 TC_SETUP_QDISC_TAPRIO,
 TC_SETUP_FT,
 TC_SETUP_QDISC_ETS,
 TC_SETUP_QDISC_TBF,
 TC_SETUP_QDISC_FIFO,
 TC_SETUP_QDISC_HTB,
 TC_SETUP_ACT,
};

/* These structures hold the attributes of bpf state that are being passed
 * to the netdevice through the bpf op.
 */

enum bpf_netdev_command {
 /* Set or clear a bpf program used in the earliest stages of packet
 * rx. The prog will have been loaded as BPF_PROG_TYPE_XDP. The callee
 * is responsible for calling bpf_prog_put on any old progs that are
 * stored. In case of error, the callee need not release the new prog
 * reference, but on success it takes ownership and must bpf_prog_put
 * when it is no longer used.
 */

 XDP_SETUP_PROG,
 XDP_SETUP_PROG_HW,
 /* BPF program for offload callbacks, invoked at program load time. */
 BPF_OFFLOAD_MAP_ALLOC,
 BPF_OFFLOAD_MAP_FREE,
 XDP_SETUP_XSK_POOL,
};

struct bpf_prog_offload_ops;
struct netlink_ext_ack;
struct xdp_umem;
struct xdp_dev_bulk_queue;
struct bpf_xdp_link;

enum bpf_xdp_mode {
 XDP_MODE_SKB = 0,
 XDP_MODE_DRV = 1,
 XDP_MODE_HW = 2,
 __MAX_XDP_MODE
};

struct bpf_xdp_entity {
 struct bpf_prog *prog;
 struct bpf_xdp_link *link;
};

struct netdev_bpf {
 enum bpf_netdev_command command;
 union {
  /* XDP_SETUP_PROG */
  struct {
   u32 flags;
   struct bpf_prog *prog;
   struct netlink_ext_ack *extack;
  };
  /* BPF_OFFLOAD_MAP_ALLOC, BPF_OFFLOAD_MAP_FREE */
  struct {
   struct bpf_offloaded_map *offmap;
  };
  /* XDP_SETUP_XSK_POOL */
  struct {
   struct xsk_buff_pool *pool;
   u16 queue_id;
  } xsk;
 };
};

/* Flags for ndo_xsk_wakeup. */
#define XDP_WAKEUP_RX (1 << 0)
#define XDP_WAKEUP_TX (1 << 1)

#ifdef CONFIG_XFRM_OFFLOAD
struct xfrmdev_ops {
 int (*xdo_dev_state_add)(struct net_device *dev,
         struct xfrm_state *x,
         struct netlink_ext_ack *extack);
 void (*xdo_dev_state_delete)(struct net_device *dev,
     struct xfrm_state *x);
 void (*xdo_dev_state_free)(struct net_device *dev,
          struct xfrm_state *x);
 bool (*xdo_dev_offload_ok) (struct sk_buff *skb,
           struct xfrm_state *x);
 void (*xdo_dev_state_advance_esn) (struct xfrm_state *x);
 void (*xdo_dev_state_update_stats) (struct xfrm_state *x);
 int (*xdo_dev_policy_add) (struct xfrm_policy *x, struct netlink_ext_ack *extack);
 void (*xdo_dev_policy_delete) (struct xfrm_policy *x);
 void (*xdo_dev_policy_free) (struct xfrm_policy *x);
};
#endif

struct dev_ifalias {
 struct rcu_head rcuhead;
 char ifalias[];
};

struct devlink;
struct tlsdev_ops;

struct netdev_net_notifier {
 struct list_head list;
 struct notifier_block *nb;
};

/*
 * This structure defines the management hooks for network devices.
 * The following hooks can be defined; unless noted otherwise, they are
 * optional and can be filled with a null pointer.
 *
 * int (*ndo_init)(struct net_device *dev);
 *     This function is called once when a network device is registered.
 *     The network device can use this for any late stage initialization
 *     or semantic validation. It can fail with an error code which will
 *     be propagated back to register_netdev.
 *
 * void (*ndo_uninit)(struct net_device *dev);
 *     This function is called when device is unregistered or when registration
 *     fails. It is not called if init fails.
 *
 * int (*ndo_open)(struct net_device *dev);
 *     This function is called when a network device transitions to the up
 *     state.
 *
 * int (*ndo_stop)(struct net_device *dev);
 *     This function is called when a network device transitions to the down
 *     state.
 *
 * netdev_tx_t (*ndo_start_xmit)(struct sk_buff *skb,
 *                               struct net_device *dev);
 * Called when a packet needs to be transmitted.
 * Returns NETDEV_TX_OK.  Can return NETDEV_TX_BUSY, but you should stop
 * the queue before that can happen; it's for obsolete devices and weird
 * corner cases, but the stack really does a non-trivial amount
 * of useless work if you return NETDEV_TX_BUSY.
 * Required; cannot be NULL.
 *
 * netdev_features_t (*ndo_features_check)(struct sk_buff *skb,
 *    struct net_device *dev
 *    netdev_features_t features);
 * Called by core transmit path to determine if device is capable of
 * performing offload operations on a given packet. This is to give
 * the device an opportunity to implement any restrictions that cannot
 * be otherwise expressed by feature flags. The check is called with
 * the set of features that the stack has calculated and it returns
 * those the driver believes to be appropriate.
 *
 * u16 (*ndo_select_queue)(struct net_device *dev, struct sk_buff *skb,
 *                         struct net_device *sb_dev);
 * Called to decide which queue to use when device supports multiple
 * transmit queues.
 *
 * void (*ndo_change_rx_flags)(struct net_device *dev, int flags);
 * This function is called to allow device receiver to make
 * changes to configuration when multicast or promiscuous is enabled.
 *
 * void (*ndo_set_rx_mode)(struct net_device *dev);
 * This function is called device changes address list filtering.
 * If driver handles unicast address filtering, it should set
 * IFF_UNICAST_FLT in its priv_flags.
 *
 * int (*ndo_set_mac_address)(struct net_device *dev, void *addr);
 * This function  is called when the Media Access Control address
 * needs to be changed. If this interface is not defined, the
 * MAC address can not be changed.
 *
 * int (*ndo_validate_addr)(struct net_device *dev);
 * Test if Media Access Control address is valid for the device.
 *
 * int (*ndo_do_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd);
 * Old-style ioctl entry point. This is used internally by the
 * ieee802154 subsystem but is no longer called by the device
 * ioctl handler.
 *
 * int (*ndo_siocbond)(struct net_device *dev, struct ifreq *ifr, int cmd);
 * Used by the bonding driver for its device specific ioctls:
 * SIOCBONDENSLAVE, SIOCBONDRELEASE, SIOCBONDSETHWADDR, SIOCBONDCHANGEACTIVE,
 * SIOCBONDSLAVEINFOQUERY, and SIOCBONDINFOQUERY
 *
 * * int (*ndo_eth_ioctl)(struct net_device *dev, struct ifreq *ifr, int cmd);
 * Called for ethernet specific ioctls: SIOCGMIIPHY, SIOCGMIIREG,
 * SIOCSMIIREG, SIOCSHWTSTAMP and SIOCGHWTSTAMP.
 *
 * int (*ndo_set_config)(struct net_device *dev, struct ifmap *map);
 * Used to set network devices bus interface parameters. This interface
 * is retained for legacy reasons; new devices should use the bus
 * interface (PCI) for low level management.
 *
 * int (*ndo_change_mtu)(struct net_device *dev, int new_mtu);
 * Called when a user wants to change the Maximum Transfer Unit
 * of a device.
 *
 * void (*ndo_tx_timeout)(struct net_device *dev, unsigned int txqueue);
 * Callback used when the transmitter has not made any progress
 * for dev->watchdog ticks.
 *
 * void (*ndo_get_stats64)(struct net_device *dev,
 *                         struct rtnl_link_stats64 *storage);
 * struct net_device_stats* (*ndo_get_stats)(struct net_device *dev);
 * Called when a user wants to get the network device usage
 * statistics. Drivers must do one of the following:
 * 1. Define @ndo_get_stats64 to fill in a zero-initialised
 *    rtnl_link_stats64 structure passed by the caller.
 * 2. Define @ndo_get_stats to update a net_device_stats structure
 *    (which should normally be dev->stats) and return a pointer to
 *    it. The structure may be changed asynchronously only if each
 *    field is written atomically.
 * 3. Update dev->stats asynchronously and atomically, and define
 *    neither operation.
 *
 * bool (*ndo_has_offload_stats)(const struct net_device *dev, int attr_id)
 * Return true if this device supports offload stats of this attr_id.
 *
 * int (*ndo_get_offload_stats)(int attr_id, const struct net_device *dev,
 * void *attr_data)
 * Get statistics for offload operations by attr_id. Write it into the
 * attr_data pointer.
 *
 * int (*ndo_vlan_rx_add_vid)(struct net_device *dev, __be16 proto, u16 vid);
 * If device supports VLAN filtering this function is called when a
 * VLAN id is registered.
 *
 * int (*ndo_vlan_rx_kill_vid)(struct net_device *dev, __be16 proto, u16 vid);
 * If device supports VLAN filtering this function is called when a
 * VLAN id is unregistered.
 *
 * void (*ndo_poll_controller)(struct net_device *dev);
 *
 * SR-IOV management functions.
 * int (*ndo_set_vf_mac)(struct net_device *dev, int vf, u8* mac);
 * int (*ndo_set_vf_vlan)(struct net_device *dev, int vf, u16 vlan,
 *   u8 qos, __be16 proto);
 * int (*ndo_set_vf_rate)(struct net_device *dev, int vf, int min_tx_rate,
 *   int max_tx_rate);
 * int (*ndo_set_vf_spoofchk)(struct net_device *dev, int vf, bool setting);
 * int (*ndo_set_vf_trust)(struct net_device *dev, int vf, bool setting);
 * int (*ndo_get_vf_config)(struct net_device *dev,
 *     int vf, struct ifla_vf_info *ivf);
 * int (*ndo_set_vf_link_state)(struct net_device *dev, int vf, int link_state);
 * int (*ndo_set_vf_port)(struct net_device *dev, int vf,
 *   struct nlattr *port[]);
 *
 *      Enable or disable the VF ability to query its RSS Redirection Table and
 *      Hash Key. This is needed since on some devices VF share this information
 *      with PF and querying it may introduce a theoretical security risk.
 * int (*ndo_set_vf_rss_query_en)(struct net_device *dev, int vf, bool setting);
 * int (*ndo_get_vf_port)(struct net_device *dev, int vf, struct sk_buff *skb);
 * int (*ndo_setup_tc)(struct net_device *dev, enum tc_setup_type type,
 *        void *type_data);
 * Called to setup any 'tc' scheduler, classifier or action on @dev.
 * This is always called from the stack with the rtnl lock held and netif
 * tx queues stopped. This allows the netdevice to perform queue
 * management safely.
 *
 * Fiber Channel over Ethernet (FCoE) offload functions.
 * int (*ndo_fcoe_enable)(struct net_device *dev);
 * Called when the FCoE protocol stack wants to start using LLD for FCoE
 * so the underlying device can perform whatever needed configuration or
 * initialization to support acceleration of FCoE traffic.
 *
 * int (*ndo_fcoe_disable)(struct net_device *dev);
 * Called when the FCoE protocol stack wants to stop using LLD for FCoE
 * so the underlying device can perform whatever needed clean-ups to
 * stop supporting acceleration of FCoE traffic.
 *
 * int (*ndo_fcoe_ddp_setup)(struct net_device *dev, u16 xid,
 *      struct scatterlist *sgl, unsigned int sgc);
 * Called when the FCoE Initiator wants to initialize an I/O that
 * is a possible candidate for Direct Data Placement (DDP). The LLD can
 * perform necessary setup and returns 1 to indicate the device is set up
 * successfully to perform DDP on this I/O, otherwise this returns 0.
 *
 * int (*ndo_fcoe_ddp_done)(struct net_device *dev,  u16 xid);
 * Called when the FCoE Initiator/Target is done with the DDPed I/O as
 * indicated by the FC exchange id 'xid', so the underlying device can
 * clean up and reuse resources for later DDP requests.
 *
 * int (*ndo_fcoe_ddp_target)(struct net_device *dev, u16 xid,
 *       struct scatterlist *sgl, unsigned int sgc);
 * Called when the FCoE Target wants to initialize an I/O that
 * is a possible candidate for Direct Data Placement (DDP). The LLD can
 * perform necessary setup and returns 1 to indicate the device is set up
 * successfully to perform DDP on this I/O, otherwise this returns 0.
 *
 * int (*ndo_fcoe_get_hbainfo)(struct net_device *dev,
 *        struct netdev_fcoe_hbainfo *hbainfo);
 * Called when the FCoE Protocol stack wants information on the underlying
 * device. This information is utilized by the FCoE protocol stack to
 * register attributes with Fiber Channel management service as per the
 * FC-GS Fabric Device Management Information(FDMI) specification.
 *
 * int (*ndo_fcoe_get_wwn)(struct net_device *dev, u64 *wwn, int type);
 * Called when the underlying device wants to override default World Wide
 * Name (WWN) generation mechanism in FCoE protocol stack to pass its own
 * World Wide Port Name (WWPN) or World Wide Node Name (WWNN) to the FCoE
 * protocol stack to use.
 *
 * RFS acceleration.
 * int (*ndo_rx_flow_steer)(struct net_device *dev, const struct sk_buff *skb,
 *     u16 rxq_index, u32 flow_id);
 * Set hardware filter for RFS.  rxq_index is the target queue index;
 * flow_id is a flow ID to be passed to rps_may_expire_flow() later.
 * Return the filter ID on success, or a negative error code.
 *
 * Slave management functions (for bridge, bonding, etc).
 * int (*ndo_add_slave)(struct net_device *dev, struct net_device *slave_dev);
 * Called to make another netdev an underling.
 *
 * int (*ndo_del_slave)(struct net_device *dev, struct net_device *slave_dev);
 * Called to release previously enslaved netdev.
 *
 * struct net_device *(*ndo_get_xmit_slave)(struct net_device *dev,
 *     struct sk_buff *skb,
 *     bool all_slaves);
 * Get the xmit slave of master device. If all_slaves is true, function
 * assume all the slaves can transmit.
 *
 *      Feature/offload setting functions.
 * netdev_features_t (*ndo_fix_features)(struct net_device *dev,
 * netdev_features_t features);
 * Adjusts the requested feature flags according to device-specific
 * constraints, and returns the resulting flags. Must not modify
 * the device state.
 *
 * int (*ndo_set_features)(struct net_device *dev, netdev_features_t features);
 * Called to update device configuration to new features. Passed
 * feature set might be less than what was returned by ndo_fix_features()).
 * Must return >0 or -errno if it changed dev->features itself.
 *
 * int (*ndo_fdb_add)(struct ndmsg *ndm, struct nlattr *tb[],
 *       struct net_device *dev,
 *       const unsigned char *addr, u16 vid, u16 flags,
 *       bool *notified, struct netlink_ext_ack *extack);
 * Adds an FDB entry to dev for addr.
 * Callee shall set *notified to true if it sent any appropriate
 * notification(s). Otherwise core will send a generic one.
 * int (*ndo_fdb_del)(struct ndmsg *ndm, struct nlattr *tb[],
 *       struct net_device *dev,
 *       const unsigned char *addr, u16 vid
 *       bool *notified, struct netlink_ext_ack *extack);
 * Deletes the FDB entry from dev corresponding to addr.
 * Callee shall set *notified to true if it sent any appropriate
 * notification(s). Otherwise core will send a generic one.
 * int (*ndo_fdb_del_bulk)(struct nlmsghdr *nlh, struct net_device *dev,
 *    struct netlink_ext_ack *extack);
 * int (*ndo_fdb_dump)(struct sk_buff *skb, struct netlink_callback *cb,
 *        struct net_device *dev, struct net_device *filter_dev,
 *        int *idx)
 * Used to add FDB entries to dump requests. Implementers should add
 * entries to skb and update idx with the number of entries.
 *
 * int (*ndo_mdb_add)(struct net_device *dev, struct nlattr *tb[],
 *       u16 nlmsg_flags, struct netlink_ext_ack *extack);
 * Adds an MDB entry to dev.
 * int (*ndo_mdb_del)(struct net_device *dev, struct nlattr *tb[],
 *       struct netlink_ext_ack *extack);
 * Deletes the MDB entry from dev.
 * int (*ndo_mdb_del_bulk)(struct net_device *dev, struct nlattr *tb[],
 *    struct netlink_ext_ack *extack);
 * Bulk deletes MDB entries from dev.
 * int (*ndo_mdb_dump)(struct net_device *dev, struct sk_buff *skb,
 *        struct netlink_callback *cb);
 * Dumps MDB entries from dev. The first argument (marker) in the netlink
 * callback is used by core rtnetlink code.
 *
 * int (*ndo_bridge_setlink)(struct net_device *dev, struct nlmsghdr *nlh,
 *      u16 flags, struct netlink_ext_ack *extack)
 * int (*ndo_bridge_getlink)(struct sk_buff *skb, u32 pid, u32 seq,
 *      struct net_device *dev, u32 filter_mask,
 *      int nlflags)
 * int (*ndo_bridge_dellink)(struct net_device *dev, struct nlmsghdr *nlh,
 *      u16 flags);
 *
 * int (*ndo_change_carrier)(struct net_device *dev, bool new_carrier);
 * Called to change device carrier. Soft-devices (like dummy, team, etc)
 * which do not represent real hardware may define this to allow their
 * userspace components to manage their virtual carrier state. Devices
 * that determine carrier state from physical hardware properties (eg
 * network cables) or protocol-dependent mechanisms (eg
 * USB_CDC_NOTIFY_NETWORK_CONNECTION) should NOT implement this function.
 *
 * int (*ndo_get_phys_port_id)(struct net_device *dev,
 *        struct netdev_phys_item_id *ppid);
 * Called to get ID of physical port of this device. If driver does
 * not implement this, it is assumed that the hw is not able to have
 * multiple net devices on single physical port.
 *
 * int (*ndo_get_port_parent_id)(struct net_device *dev,
 *  struct netdev_phys_item_id *ppid)
 * Called to get the parent ID of the physical port of this device.
 *
 * void* (*ndo_dfwd_add_station)(struct net_device *pdev,
 *  struct net_device *dev)
 * Called by upper layer devices to accelerate switching or other
 * station functionality into hardware. 'pdev is the lowerdev
 * to use for the offload and 'dev' is the net device that will
 * back the offload. Returns a pointer to the private structure
 * the upper layer will maintain.
 * void (*ndo_dfwd_del_station)(struct net_device *pdev, void *priv)
 * Called by upper layer device to delete the station created
 * by 'ndo_dfwd_add_station'. 'pdev' is the net device backing
 * the station and priv is the structure returned by the add
 * operation.
 * int (*ndo_set_tx_maxrate)(struct net_device *dev,
 *      int queue_index, u32 maxrate);
 * Called when a user wants to set a max-rate limitation of specific
 * TX queue.
 * int (*ndo_get_iflink)(const struct net_device *dev);
 * Called to get the iflink value of this device.
 * int (*ndo_fill_metadata_dst)(struct net_device *dev, struct sk_buff *skb);
 * This function is used to get egress tunnel information for given skb.
 * This is useful for retrieving outer tunnel header parameters while
 * sampling packet.
 * void (*ndo_set_rx_headroom)(struct net_device *dev, int needed_headroom);
 * This function is used to specify the headroom that the skb must
 * consider when allocation skb during packet reception. Setting
 * appropriate rx headroom value allows avoiding skb head copy on
 * forward. Setting a negative value resets the rx headroom to the
 * default value.
 * int (*ndo_bpf)(struct net_device *dev, struct netdev_bpf *bpf);
 * This function is used to set or query state related to XDP on the
 * netdevice and manage BPF offload. See definition of
 * enum bpf_netdev_command for details.
 * int (*ndo_xdp_xmit)(struct net_device *dev, int n, struct xdp_frame **xdp,
 * u32 flags);
 * This function is used to submit @n XDP packets for transmit on a
 * netdevice. Returns number of frames successfully transmitted, frames
 * that got dropped are freed/returned via xdp_return_frame().
 * Returns negative number, means general error invoking ndo, meaning
 * no frames were xmit'ed and core-caller will free all frames.
 * struct net_device *(*ndo_xdp_get_xmit_slave)(struct net_device *dev,
 *         struct xdp_buff *xdp);
 *      Get the xmit slave of master device based on the xdp_buff.
 * int (*ndo_xsk_wakeup)(struct net_device *dev, u32 queue_id, u32 flags);
 *      This function is used to wake up the softirq, ksoftirqd or kthread
 * responsible for sending and/or receiving packets on a specific
 * queue id bound to an AF_XDP socket. The flags field specifies if
 * only RX, only Tx, or both should be woken up using the flags
 * XDP_WAKEUP_RX and XDP_WAKEUP_TX.
 * int (*ndo_tunnel_ctl)(struct net_device *dev, struct ip_tunnel_parm_kern *p,
 *  int cmd);
 * Add, change, delete or get information on an IPv4 tunnel.
 * struct net_device *(*ndo_get_peer_dev)(struct net_device *dev);
 * If a device is paired with a peer device, return the peer instance.
 * The caller must be under RCU read context.
 * int (*ndo_fill_forward_path)(struct net_device_path_ctx *ctx, struct net_device_path *path);
 *     Get the forwarding path to reach the real device from the HW destination address
 * ktime_t (*ndo_get_tstamp)(struct net_device *dev,
 *      const struct skb_shared_hwtstamps *hwtstamps,
 *      bool cycles);
 * Get hardware timestamp based on normal/adjustable time or free running
 * cycle counter. This function is required if physical clock supports a
 * free running cycle counter.
 *
 * int (*ndo_hwtstamp_get)(struct net_device *dev,
 *    struct kernel_hwtstamp_config *kernel_config);
 * Get the currently configured hardware timestamping parameters for the
 * NIC device.
 *
 * int (*ndo_hwtstamp_set)(struct net_device *dev,
 *    struct kernel_hwtstamp_config *kernel_config,
 *    struct netlink_ext_ack *extack);
 * Change the hardware timestamping parameters for NIC device.
 */

struct net_device_ops {
 int   (*ndo_init)(struct net_device *dev);
 void   (*ndo_uninit)(struct net_device *dev);
 int   (*ndo_open)(struct net_device *dev);
 int   (*ndo_stop)(struct net_device *dev);
 netdev_tx_t  (*ndo_start_xmit)(struct sk_buff *skb,
        struct net_device *dev);
 netdev_features_t (*ndo_features_check)(struct sk_buff *skb,
            struct net_device *dev,
            netdev_features_t features);
 u16   (*ndo_select_queue)(struct net_device *dev,
          struct sk_buff *skb,
          struct net_device *sb_dev);
 void   (*ndo_change_rx_flags)(struct net_device *dev,
             int flags);
 void   (*ndo_set_rx_mode)(struct net_device *dev);
 int   (*ndo_set_mac_address)(struct net_device *dev,
             void *addr);
 int   (*ndo_validate_addr)(struct net_device *dev);
 int   (*ndo_do_ioctl)(struct net_device *dev,
             struct ifreq *ifr, int cmd);
 int   (*ndo_eth_ioctl)(struct net_device *dev,
       struct ifreq *ifr, int cmd);
 int   (*ndo_siocbond)(struct net_device *dev,
      struct ifreq *ifr, int cmd);
 int   (*ndo_siocwandev)(struct net_device *dev,
        struct if_settings *ifs);
 int   (*ndo_siocdevprivate)(struct net_device *dev,
            struct ifreq *ifr,
            void __user *data, int cmd);
 int   (*ndo_set_config)(struct net_device *dev,
               struct ifmap *map);
 int   (*ndo_change_mtu)(struct net_device *dev,
        int new_mtu);
 int   (*ndo_neigh_setup)(struct net_device *dev,
         struct neigh_parms *);
 void   (*ndo_tx_timeout) (struct net_device *dev,
         unsigned int txqueue);

 void   (*ndo_get_stats64)(struct net_device *dev,
         struct rtnl_link_stats64 *storage);
 bool   (*ndo_has_offload_stats)(const struct net_device *dev, int attr_id);
 int   (*ndo_get_offload_stats)(int attr_id,
        const struct net_device *dev,
        void *attr_data);
 struct net_device_stats* (*ndo_get_stats)(struct net_device *dev);

 int   (*ndo_vlan_rx_add_vid)(struct net_device *dev,
             __be16 proto, u16 vid);
 int   (*ndo_vlan_rx_kill_vid)(struct net_device *dev,
              __be16 proto, u16 vid);
#ifdef CONFIG_NET_POLL_CONTROLLER
 void                    (*ndo_poll_controller)(struct net_device *dev);
 int   (*ndo_netpoll_setup)(struct net_device *dev);
 void   (*ndo_netpoll_cleanup)(struct net_device *dev);
#endif
 int   (*ndo_set_vf_mac)(struct net_device *dev,
        int queue, u8 *mac);
 int   (*ndo_set_vf_vlan)(struct net_device *dev,
         int queue, u16 vlan,
         u8 qos, __be16 proto);
 int   (*ndo_set_vf_rate)(struct net_device *dev,
         int vf, int min_tx_rate,
         int max_tx_rate);
 int   (*ndo_set_vf_spoofchk)(struct net_device *dev,
             int vf, bool setting);
 int   (*ndo_set_vf_trust)(struct net_device *dev,
          int vf, bool setting);
 int   (*ndo_get_vf_config)(struct net_device *dev,
           int vf,
           struct ifla_vf_info *ivf);
 int   (*ndo_set_vf_link_state)(struct net_device *dev,
        int vf, int link_state);
 int   (*ndo_get_vf_stats)(struct net_device *dev,
          int vf,
          struct ifla_vf_stats
          *vf_stats);
 int   (*ndo_set_vf_port)(struct net_device *dev,
         int vf,
         struct nlattr *port[]);
 int   (*ndo_get_vf_port)(struct net_device *dev,
         int vf, struct sk_buff *skb);
 int   (*ndo_get_vf_guid)(struct net_device *dev,
         int vf,
         struct ifla_vf_guid *node_guid,
         struct ifla_vf_guid *port_guid);
 int   (*ndo_set_vf_guid)(struct net_device *dev,
         int vf, u64 guid,
         int guid_type);
 int   (*ndo_set_vf_rss_query_en)(
         struct net_device *dev,
         int vf, bool setting);
 int   (*ndo_setup_tc)(struct net_device *dev,
      enum tc_setup_type type,
      void *type_data);
#if IS_ENABLED(CONFIG_FCOE)
 int   (*ndo_fcoe_enable)(struct net_device *dev);
 int   (*ndo_fcoe_disable)(struct net_device *dev);
 int   (*ndo_fcoe_ddp_setup)(struct net_device *dev,
            u16 xid,
            struct scatterlist *sgl,
            unsigned int sgc);
 int   (*ndo_fcoe_ddp_done)(struct net_device *dev,
           u16 xid);
 int   (*ndo_fcoe_ddp_target)(struct net_device *dev,
             u16 xid,
             struct scatterlist *sgl,
             unsigned int sgc);
 int   (*ndo_fcoe_get_hbainfo)(struct net_device *dev,
       struct netdev_fcoe_hbainfo *hbainfo);
#endif

#if IS_ENABLED(CONFIG_LIBFCOE)
#define NETDEV_FCOE_WWNN 0
#define NETDEV_FCOE_WWPN 1
 int   (*ndo_fcoe_get_wwn)(struct net_device *dev,
          u64 *wwn, int type);
#endif

#ifdef CONFIG_RFS_ACCEL
 int   (*ndo_rx_flow_steer)(struct net_device *dev,
           const struct sk_buff *skb,
           u16 rxq_index,
           u32 flow_id);
#endif
 int   (*ndo_add_slave)(struct net_device *dev,
       struct net_device *slave_dev,
       struct netlink_ext_ack *extack);
 int   (*ndo_del_slave)(struct net_device *dev,
       struct net_device *slave_dev);
 struct net_device* (*ndo_get_xmit_slave)(struct net_device *dev,
            struct sk_buff *skb,
            bool all_slaves);
 struct net_device* (*ndo_sk_get_lower_dev)(struct net_device *dev,
       struct sock *sk);
 netdev_features_t (*ndo_fix_features)(struct net_device *dev,
          netdev_features_t features);
 int   (*ndo_set_features)(struct net_device *dev,
          netdev_features_t features);
 int   (*ndo_neigh_construct)(struct net_device *dev,
             struct neighbour *n);
 void   (*ndo_neigh_destroy)(struct net_device *dev,
           struct neighbour *n);

 int   (*ndo_fdb_add)(struct ndmsg *ndm,
            struct nlattr *tb[],
            struct net_device *dev,
            const unsigned char *addr,
            u16 vid,
            u16 flags,
            bool *notified,
            struct netlink_ext_ack *extack);
 int   (*ndo_fdb_del)(struct ndmsg *ndm,
            struct nlattr *tb[],
            struct net_device *dev,
            const unsigned char *addr,
            u16 vid,
            bool *notified,
            struct netlink_ext_ack *extack);
 int   (*ndo_fdb_del_bulk)(struct nlmsghdr *nlh,
          struct net_device *dev,
          struct netlink_ext_ack *extack);
 int   (*ndo_fdb_dump)(struct sk_buff *skb,
      struct netlink_callback *cb,
      struct net_device *dev,
      struct net_device *filter_dev,
      int *idx);
 int   (*ndo_fdb_get)(struct sk_buff *skb,
            struct nlattr *tb[],
            struct net_device *dev,
            const unsigned char *addr,
            u16 vid, u32 portid, u32 seq,
            struct netlink_ext_ack *extack);
 int   (*ndo_mdb_add)(struct net_device *dev,
            struct nlattr *tb[],
            u16 nlmsg_flags,
            struct netlink_ext_ack *extack);
 int   (*ndo_mdb_del)(struct net_device *dev,
            struct nlattr *tb[],
            struct netlink_ext_ack *extack);
 int   (*ndo_mdb_del_bulk)(struct net_device *dev,
          struct nlattr *tb[],
          struct netlink_ext_ack *extack);
 int   (*ndo_mdb_dump)(struct net_device *dev,
      struct sk_buff *skb,
      struct netlink_callback *cb);
 int   (*ndo_mdb_get)(struct net_device *dev,
            struct nlattr *tb[], u32 portid,
            u32 seq,
            struct netlink_ext_ack *extack);
 int   (*ndo_bridge_setlink)(struct net_device *dev,
            struct nlmsghdr *nlh,
            u16 flags,
            struct netlink_ext_ack *extack);
 int   (*ndo_bridge_getlink)(struct sk_buff *skb,
            u32 pid, u32 seq,
            struct net_device *dev,
            u32 filter_mask,
            int nlflags);
 int   (*ndo_bridge_dellink)(struct net_device *dev,
            struct nlmsghdr *nlh,
            u16 flags);
 int   (*ndo_change_carrier)(struct net_device *dev,
            bool new_carrier);
 int   (*ndo_get_phys_port_id)(struct net_device *dev,
       struct netdev_phys_item_id *ppid);
 int   (*ndo_get_port_parent_id)(struct net_device *dev,
         struct netdev_phys_item_id *ppid);
 int   (*ndo_get_phys_port_name)(struct net_device *dev,
         char *name, size_t len);
 void*   (*ndo_dfwd_add_station)(struct net_device *pdev,
       struct net_device *dev);
 void   (*ndo_dfwd_del_station)(struct net_device *pdev,
       void *priv);

 int   (*ndo_set_tx_maxrate)(struct net_device *dev,
            int queue_index,
            u32 maxrate);
 int   (*ndo_get_iflink)(const struct net_device *dev);
 int   (*ndo_fill_metadata_dst)(struct net_device *dev,
             struct sk_buff *skb);
 void   (*ndo_set_rx_headroom)(struct net_device *dev,
             int needed_headroom);
 int   (*ndo_bpf)(struct net_device *dev,
        struct netdev_bpf *bpf);
 int   (*ndo_xdp_xmit)(struct net_device *dev, int n,
      struct xdp_frame **xdp,
      u32 flags);
 struct net_device * (*ndo_xdp_get_xmit_slave)(struct net_device *dev,
         struct xdp_buff *xdp);
 int   (*ndo_xsk_wakeup)(struct net_device *dev,
        u32 queue_id, u32 flags);
 int   (*ndo_tunnel_ctl)(struct net_device *dev,
        struct ip_tunnel_parm_kern *p,
        int cmd);
 struct net_device * (*ndo_get_peer_dev)(struct net_device *dev);
 int                     (*ndo_fill_forward_path)(struct net_device_path_ctx *ctx,
                                                         struct net_device_path *path);
 ktime_t   (*ndo_get_tstamp)(struct net_device *dev,
        const struct skb_shared_hwtstamps *hwtstamps,
        bool cycles);
 int   (*ndo_hwtstamp_get)(struct net_device *dev,
          struct kernel_hwtstamp_config *kernel_config);
 int   (*ndo_hwtstamp_set)(struct net_device *dev,
          struct kernel_hwtstamp_config *kernel_config,
          struct netlink_ext_ack *extack);

#if IS_ENABLED(CONFIG_NET_SHAPER)
 /**
 * @net_shaper_ops: Device shaping offload operations
 * see include/net/net_shapers.h
 */

 const struct net_shaper_ops *net_shaper_ops;
#endif
};

/**
 * enum netdev_priv_flags - &struct net_device priv_flags
 *
 * These are the &struct net_device, they are only set internally
 * by drivers and used in the kernel. These flags are invisible to
 * userspace; this means that the order of these flags can change
 * during any kernel release.
 *
 * You should add bitfield booleans after either net_device::priv_flags
 * (hotpath) or ::threaded (slowpath) instead of extending these flags.
 *
 * @IFF_802_1Q_VLAN: 802.1Q VLAN device
 * @IFF_EBRIDGE: Ethernet bridging device
 * @IFF_BONDING: bonding master or slave
 * @IFF_ISATAP: ISATAP interface (RFC4214)
 * @IFF_WAN_HDLC: WAN HDLC device
 * @IFF_XMIT_DST_RELEASE: dev_hard_start_xmit() is allowed to
 * release skb->dst
 * @IFF_DONT_BRIDGE: disallow bridging this ether dev
 * @IFF_DISABLE_NETPOLL: disable netpoll at run-time
 * @IFF_MACVLAN_PORT: device used as macvlan port
 * @IFF_BRIDGE_PORT: device used as bridge port
 * @IFF_OVS_DATAPATH: device used as Open vSwitch datapath port
 * @IFF_TX_SKB_SHARING: The interface supports sharing skbs on transmit
 * @IFF_UNICAST_FLT: Supports unicast filtering
 * @IFF_TEAM_PORT: device used as team port
 * @IFF_SUPP_NOFCS: device supports sending custom FCS
 * @IFF_LIVE_ADDR_CHANGE: device supports hardware address
 * change when it's running
 * @IFF_MACVLAN: Macvlan device
 * @IFF_XMIT_DST_RELEASE_PERM: IFF_XMIT_DST_RELEASE not taking into account
 * underlying stacked devices
 * @IFF_L3MDEV_MASTER: device is an L3 master device
 * @IFF_NO_QUEUE: device can run without qdisc attached
 * @IFF_OPENVSWITCH: device is a Open vSwitch master
 * @IFF_L3MDEV_SLAVE: device is enslaved to an L3 master device
 * @IFF_TEAM: device is a team device
 * @IFF_RXFH_CONFIGURED: device has had Rx Flow indirection table configured
 * @IFF_PHONY_HEADROOM: the headroom value is controlled by an external
 * entity (i.e. the master device for bridged veth)
 * @IFF_MACSEC: device is a MACsec device
 * @IFF_NO_RX_HANDLER: device doesn't support the rx_handler hook
 * @IFF_FAILOVER: device is a failover master device
 * @IFF_FAILOVER_SLAVE: device is lower dev of a failover master device
 * @IFF_L3MDEV_RX_HANDLER: only invoke the rx handler of L3 master device
 * @IFF_NO_ADDRCONF: prevent ipv6 addrconf
 * @IFF_TX_SKB_NO_LINEAR: device/driver is capable of xmitting frames with
 * skb_headlen(skb) == 0 (data starts from frag0)
 */

enum netdev_priv_flags {
 IFF_802_1Q_VLAN   = 1<<0,
 IFF_EBRIDGE   = 1<<1,
 IFF_BONDING   = 1<<2,
 IFF_ISATAP   = 1<<3,
 IFF_WAN_HDLC   = 1<<4,
 IFF_XMIT_DST_RELEASE  = 1<<5,
 IFF_DONT_BRIDGE   = 1<<6,
 IFF_DISABLE_NETPOLL  = 1<<7,
 IFF_MACVLAN_PORT  = 1<<8,
 IFF_BRIDGE_PORT   = 1<<9,
 IFF_OVS_DATAPATH  = 1<<10,
 IFF_TX_SKB_SHARING  = 1<<11,
 IFF_UNICAST_FLT   = 1<<12,
 IFF_TEAM_PORT   = 1<<13,
 IFF_SUPP_NOFCS   = 1<<14,
 IFF_LIVE_ADDR_CHANGE  = 1<<15,
 IFF_MACVLAN   = 1<<16,
 IFF_XMIT_DST_RELEASE_PERM = 1<<17,
 IFF_L3MDEV_MASTER  = 1<<18,
 IFF_NO_QUEUE   = 1<<19,
 IFF_OPENVSWITCH   = 1<<20,
 IFF_L3MDEV_SLAVE  = 1<<21,
 IFF_TEAM   = 1<<22,
 IFF_RXFH_CONFIGURED  = 1<<23,
 IFF_PHONY_HEADROOM  = 1<<24,
 IFF_MACSEC   = 1<<25,
 IFF_NO_RX_HANDLER  = 1<<26,
 IFF_FAILOVER   = 1<<27,
 IFF_FAILOVER_SLAVE  = 1<<28,
 IFF_L3MDEV_RX_HANDLER  = 1<<29,
 IFF_NO_ADDRCONF   = BIT_ULL(30),
 IFF_TX_SKB_NO_LINEAR  = BIT_ULL(31),
};

/* Specifies the type of the struct net_device::ml_priv pointer */
enum netdev_ml_priv_type {
 ML_PRIV_NONE,
 ML_PRIV_CAN,
};

enum netdev_stat_type {
 NETDEV_PCPU_STAT_NONE,
 NETDEV_PCPU_STAT_LSTATS, /* struct pcpu_lstats */
 NETDEV_PCPU_STAT_TSTATS, /* struct pcpu_sw_netstats */
 NETDEV_PCPU_STAT_DSTATS, /* struct pcpu_dstats */
};

enum netdev_reg_state {
 NETREG_UNINITIALIZED = 0,
 NETREG_REGISTERED, /* completed register_netdevice */
 NETREG_UNREGISTERING, /* called unregister_netdevice */
 NETREG_UNREGISTERED, /* completed unregister todo */
 NETREG_RELEASED, /* called free_netdev */
 NETREG_DUMMY,  /* dummy device for NAPI poll */
};

/**
 * struct net_device - The DEVICE structure.
 *
 * Actually, this whole structure is a big mistake.  It mixes I/O
 * data with strictly "high-level" data, and it has to know about
 * almost every data structure used in the INET module.
 *
 * @priv_flags: flags invisible to userspace defined as bits, see
 * enum netdev_priv_flags for the definitions
 * @lltx: device supports lockless Tx. Deprecated for real HW
 * drivers. Mainly used by logical interfaces, such as
 * bonding and tunnels
 * @netmem_tx: device support netmem_tx.
 *
 * @name: This is the first field of the "visible" part of this structure
 * (i.e. as seen by users in the "Space.c" file).  It is the name
 * of the interface.
 *
 * @name_node: Name hashlist node
 * @ifalias: SNMP alias
 * @mem_end: Shared memory end
 * @mem_start: Shared memory start
 * @base_addr: Device I/O address
 * @irq: Device IRQ number
 *
 * @state: Generic network queuing layer state, see netdev_state_t
 * @dev_list: The global list of network devices
 * @napi_list: List entry used for polling NAPI devices
 * @unreg_list: List entry  when we are unregistering the
 * device; see the function unregister_netdev
 * @close_list: List entry used when we are closing the device
 * @ptype_all:     Device-specific packet handlers for all protocols
 * @ptype_specific: Device-specific, protocol-specific packet handlers
 *
 * @adj_list: Directly linked devices, like slaves for bonding
 * @features: Currently active device features
 * @hw_features: User-changeable features
 *
 * @wanted_features: User-requested features
 * @vlan_features: Mask of features inheritable by VLAN devices
 *
 * @hw_enc_features: Mask of features inherited by encapsulating devices
 * This field indicates what encapsulation
 * offloads the hardware is capable of doing,
 * and drivers will need to set them appropriately.
 *
 * @mpls_features: Mask of features inheritable by MPLS
 * @gso_partial_features: value(s) from NETIF_F_GSO\*
 *
 * @ifindex: interface index
 * @group: The group the device belongs to
 *
 * @stats: Statistics struct, which was left as a legacy, use
 * rtnl_link_stats64 instead
 *
 * @core_stats: core networking counters,
 * do not use this in drivers
 * @carrier_up_count: Number of times the carrier has been up
 * @carrier_down_count: Number of times the carrier has been down
 *
 * @wireless_handlers: List of functions to handle Wireless Extensions,
 * instead of ioctl,
 * see <net/iw_handler.h> for details.
 *
 * @netdev_ops: Includes several pointers to callbacks,
 * if one wants to override the ndo_*() functions
 * @xdp_metadata_ops: Includes pointers to XDP metadata callbacks.
 * @xsk_tx_metadata_ops: Includes pointers to AF_XDP TX metadata callbacks.
 * @ethtool_ops: Management operations
 * @l3mdev_ops: Layer 3 master device operations
 * @ndisc_ops: Includes callbacks for different IPv6 neighbour
 * discovery handling. Necessary for e.g. 6LoWPAN.
 * @xfrmdev_ops: Transformation offload operations
 * @tlsdev_ops: Transport Layer Security offload operations
 * @header_ops: Includes callbacks for creating,parsing,caching,etc
 * of Layer 2 headers.
 *
 * @flags: Interface flags (a la BSD)
 * @xdp_features: XDP capability supported by the device
 * @gflags: Global flags ( kept as legacy )
 * @priv_len: Size of the ->priv flexible array
 * @priv: Flexible array containing private data
 * @operstate: RFC2863 operstate
 * @link_mode: Mapping policy to operstate
 * @if_port: Selectable AUI, TP, ...
 * @dma: DMA channel
 * @mtu: Interface MTU value
 * @min_mtu: Interface Minimum MTU value
 * @max_mtu: Interface Maximum MTU value
 * @type: Interface hardware type
 * @hard_header_len: Maximum hardware header length.
 * @min_header_len:  Minimum hardware header length
 *
 * @needed_headroom: Extra headroom the hardware may need, but not in all
 *   cases can this be guaranteed
 * @needed_tailroom: Extra tailroom the hardware may need, but not in all
 *   cases can this be guaranteed. Some cases also use
 *   LL_MAX_HEADER instead to allocate the skb
 *
 * interface address info:
 *
 *  @perm_addr: Permanent hw address
 *  @addr_assign_type: Hw address assignment type
 *  @addr_len: Hardware address length
 * @upper_level: Maximum depth level of upper devices.
 * @lower_level: Maximum depth level of lower devices.
 * @threaded: napi threaded state.
 * @neigh_priv_len: Used in neigh_alloc()
--> --------------------

--> maximum size reached

--> --------------------

99%


¤ Dauer der Verarbeitung: 0.53 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung ist noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge