仅仅做个记录,内核4.19
struct net_device {
charname[IFNAMSIZ]; //网络设备的名称
struct hlist_nodename_hlist;
char *ifalias;
/*
*I/O specific fields
*FIXME: Merge these and struct ifmap into one
*/
unsigned longmem_end; //设备所使用的共享内存的起始地址和结束地址
unsigned longmem_start;
unsigned longbase_addr; //网络设备的I/O基地址
intirq; //设备使用的中端号
atomic_tcarrier_changes;
/*
*Some hardware also needs these fields (state,dev_list,
*napi_list,unreg_list,close_list) but they are not
*part of the usual set specified in Space.c.
*/
unsigned longstate;
struct list_headdev_list;
struct list_headnapi_list;
struct list_headunreg_list;
struct list_headclose_list;
struct list_headptype_all;
struct list_headptype_specific;
struct {
struct list_head upper;
struct list_head lower;
} adj_list;
netdev_features_tfeatures;
netdev_features_thw_features;
netdev_features_twanted_features;
netdev_features_tvlan_features;
netdev_features_thw_enc_features;
netdev_features_tmpls_features;
netdev_features_tgso_partial_features;
intifindex;
intgroup;
struct net_device_statsstats;
atomic_long_trx_dropped;
atomic_long_ttx_dropped;
atomic_long_trx_nohandler;
#ifdef CONFIG_WIRELESS_EXT
const struct iw_handler_def *wireless_handlers;
struct iw_public_data*wireless_data;
#endif
const struct net_device_ops *netdev_ops; //类似于file_ops
const struct ethtool_ops *ethtool_ops; //用户控件ethtool工具的驱动层函数
#ifdef CONFIG_NET_SWITCHDEV
const struct switchdev_ops *switchdev_ops;
#endif
#ifdef CONFIG_HSR_PRP
const struct lredev_ops *lredev_ops;
#endif
#ifdef CONFIG_NET_L3_MASTER_DEV
const struct l3mdev_ops*l3mdev_ops;
#endif
#if IS_ENABLED(CONFIG_IPV6)
const struct ndisc_ops *ndisc_ops;
#endif
#ifdef CONFIG_XFRM
const struct xfrmdev_ops *xfrmdev_ops;
#endif
const struct header_ops *header_ops;
unsigned intflags; //网络接口标志
unsigned intpriv_flags;
unsigned shortgflags;
unsigned shortpadded;
unsigned charoperstate;
unsigned charlink_mode;
unsigned charif_port;
unsigned chardma;
unsigned intmtu; //最大的传输单元
unsigned intmin_mtu;
unsigned intmax_mtu;
unsigned shorttype; //接口的硬件类型
unsigned shorthard_header_len;//网络设备的硬件头长度
unsigned charmin_header_len;
unsigned shortneeded_headroom;
unsigned shortneeded_tailroom;
/* Interface address info. */
unsigned charperm_addr[MAX_ADDR_LEN];
unsigned charaddr_assign_type;
unsigned charaddr_len;
unsigned shortneigh_priv_len;
unsigned short dev_id;
unsigned short dev_port;
spinlock_taddr_list_lock;
unsigned charname_assign_type;
booluc_promisc;
struct netdev_hw_addr_listuc;
struct netdev_hw_addr_listmc;
struct netdev_hw_addr_listdev_addrs;
#ifdef CONFIG_SYSFS
struct kset*queues_kset;
#endif
unsigned intpromiscuity;
unsigned intallmulti;
/* Protocol-specific pointers */
#if IS_ENABLED(CONFIG_VLAN_8021Q)
struct vlan_info __rcu*vlan_info;
#endif
#if IS_ENABLED(CONFIG_NET_DSA)
struct dsa_switch_tree*dsa_ptr;
#endif
#if IS_ENABLED(CONFIG_TIPC)
struct tipc_bearer __rcu *tipc_ptr;
#endif
void *atalk_ptr;
struct in_device __rcu*ip_ptr;
struct dn_dev __rcu *dn_ptr;
struct inet6_dev __rcu*ip6_ptr;
void*ax25_ptr;
struct wireless_dev*ieee80211_ptr;
struct wpan_dev*ieee802154_ptr;
#if IS_ENABLED(CONFIG_MPLS_ROUTING)
struct mpls_dev __rcu*mpls_ptr;
#endif
/*
* Cache lines mostly used on receive path (including eth_type_trans())
*/
/* Interface address info used in eth_type_trans() */
unsigned char*dev_addr; //设备的硬件地址
#ifdef CONFIG_SYSFS
struct netdev_rx_queue*_rx;
unsigned intnum_rx_queues;
unsigned intreal_num_rx_queues;
#endif
struct bpf_prog __rcu*xdp_prog;
unsigned longgro_flush_timeout;
rx_handler_func_t __rcu*rx_handler;
void __rcu*rx_handler_data;
#ifdef CONFIG_NET_CLS_ACT
struct tcf_proto __rcu *ingress_cl_list;
#endif
struct netdev_queue __rcu *ingress_queue;
#ifdef CONFIG_NETFILTER_INGRESS
struct nf_hook_entries __rcu *nf_hooks_ingress;
#endif
unsigned charbroadcast[MAX_ADDR_LEN]; //广播地址
#ifdef CONFIG_RFS_ACCEL
struct cpu_rmap*rx_cpu_rmap;
#endif
struct hlist_nodeindex_hlist;
/*
* Cache lines mostly used on transmit path
*/
struct netdev_queue*_tx ____cacheline_aligned_in_smp;
unsigned intnum_tx_queues;
unsigned intreal_num_tx_queues;
struct Qdisc*qdisc;
#ifdef CONFIG_NET_SCHED
DECLARE_HASHTABLE(qdisc_hash, 4);
#endif
unsigned inttx_queue_len;
spinlock_ttx_global_lock;
intwatchdog_timeo;
#ifdef CONFIG_XPS
struct xps_dev_maps __rcu *xps_maps;
#endif
#ifdef CONFIG_NET_CLS_ACT
struct tcf_proto __rcu *egress_cl_list;
#endif
/* These may be needed for future network-power-down code. */
struct timer_listwatchdog_timer;
int __percpu*pcpu_refcnt;
struct list_headtodo_list;
struct list_headlink_watch_list;
enum { 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 */
} reg_state:8;
bool dismantle;
enum {
RTNL_LINK_INITIALIZED,
RTNL_LINK_INITIALIZING,
} rtnl_link_state:16;
bool needs_free_netdev;
void (*priv_destructor)(struct net_device *dev);
#ifdef CONFIG_NETPOLL
struct netpoll_info __rcu*npinfo;
#endif
possible_net_tnd_net;
/* mid-layer private */
union {
void*ml_priv;
struct pcpu_lstats __percpu*lstats;
struct pcpu_sw_netstats __percpu*tstats;
struct pcpu_dstats __percpu*dstats;
struct pcpu_vstats __percpu*vstats;
};
#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 devicedev;
const struct attribute_group *sysfs_groups[4];
const struct attribute_group *sysfs_rx_queue_group;
const struct rtnl_link_ops *rtnl_link_ops;
/* for setting kernel sock attribute on TCP connection setup */
#define GSO_MAX_SIZE65536
unsigned intgso_max_size;
#define GSO_MAX_SEGS65535
u16gso_max_segs;
#ifdef CONFIG_DCB
const struct dcbnl_rtnl_ops *dcbnl_ops;
#endif
u8num_tc;
struct netdev_tc_txqtc_to_txq[TC_MAX_QUEUE];
u8prio_tc_map[TC_BITMASK + 1];
#if IS_ENABLED(CONFIG_FCOE)
unsigned intfcoe_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;
boolproto_down;
};