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.
struct net_device { char name; struct hlist_node name_hlist; char * ifalias; unsigned long mem_end; unsigned long mem_start; unsigned long base_addr; int irq; atomic_t carrier_changes; unsigned long state; struct list_head dev_list; struct list_head napi_list; struct list_head unreg_list; struct list_head close_list; struct list_head ptype_all; struct list_head ptype_specific; struct {unnamed_struct}; #if IS_ENABLED(CONFIG_GARP struct garp_port __rcu * garp_port; #endif #if IS_ENABLED(CONFIG_MRP struct mrp_port __rcu * mrp_port; #endif struct device dev; const struct attribute_group * sysfs_groups; const struct attribute_group * sysfs_rx_queue_group; const struct rtnl_link_ops * rtnl_link_ops; #define GSO_MAX_SIZE 65536 unsigned int gso_max_size; #define GSO_MAX_SEGS 65535 u16 gso_max_segs; #ifdef CONFIG_DCB const struct dcbnl_rtnl_ops * dcbnl_ops; #endif u8 num_tc; struct netdev_tc_txq tc_to_txq; u8 prio_tc_map; #if IS_ENABLED(CONFIG_FCOE unsigned int fcoe_ddp_xid; #endif #if IS_ENABLED(CONFIG_CGROUP_NET_PRIO struct netprio_map __rcu * priomap; #endif struct phy_device * phydev; struct lock_class_key * qdisc_tx_busylock; struct lock_class_key * qdisc_running_key; bool proto_down; };
char 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.
struct hlist_node name_hlist
Device name hash chain, please keep it close to name[]
char * ifalias
SNMP alias
unsigned long mem_end
Shared memory end
unsigned long mem_start
Shared memory start
unsigned long base_addr
Device I/O address
int irq
Device IRQ number
atomic_t carrier_changes
Stats to monitor carrier on<->off transitions
unsigned long state
Generic network queuing layer state, see netdev_state_t
struct list_head dev_list
The global list of network devices
struct list_head napi_list
List entry used for polling NAPI devices
struct list_head unreg_list
List entry when we are unregistering the device; see the function unregister_netdev
struct list_head close_list
List entry used when we are closing the device
struct list_head ptype_all
Device-specific packet handlers for all protocols
struct list_head ptype_specific
Device-specific, protocol-specific packet handlers
struct {unnamed_struct}
anonymous
struct garp_port __rcu * garp_port
GARP
struct mrp_port __rcu * mrp_port
MRP
struct device dev
Class/net/name entry
const struct attribute_group * sysfs_groups
Space for optional device, statistics and wireless sysfs groups
const struct attribute_group * sysfs_rx_queue_group
Space for optional per-rx queue attributes
const struct rtnl_link_ops * rtnl_link_ops
Rtnl_link_ops
unsigned int gso_max_size
Maximum size of generic segmentation offload
u16 gso_max_segs
Maximum number of segments that can be passed to the NIC for GSO
const struct dcbnl_rtnl_ops * dcbnl_ops
Data Center Bridging netlink ops
u8 num_tc
Number of traffic classes in the net device
struct netdev_tc_txq tc_to_txq
XXX: need comments on this one
u8 prio_tc_map
XXX: need comments on this one
unsigned int fcoe_ddp_xid
Max exchange id for FCoE LRO by ddp
struct netprio_map __rcu * priomap
XXX: need comments on this one
struct phy_device * phydev
Physical device may attach itself for hardware timestamping
struct lock_class_key * qdisc_tx_busylock
lockdep class annotating Qdisc->busylock spinlock
struct lock_class_key * qdisc_running_key
lockdep class annotating Qdisc->running seqcount
bool proto_down
protocol port state information can be sent to the switch driver and used to set the phys state of the switch port.