在Linux系统中,网络设备都被抽象为struct net_device结构体。它是网络设备硬件与上层协议之间联系的接口,了解它对编写网络驱动程序非常有益,所以本文将着手简要介绍linux-2.6.38.8/include/linux/netdevice.h文件中struct net_device结构体的所有成员(没有按照它们定义的顺序)。
- char
name[IFNAMSIZ]; - char
*ifalias; //用于SNMP协议
- struct
pm_qos_request_list pm_qos_req;
- //网络设备内存映射时在主机中的内存区域
- unsigned
long mem_end; - unsigned
long mem_start; - //网络设备I/O基地址
- unsigned
long base_addr; - //中断号
- unsigned
int irq; - //传输介质,如双绞线、同轴电缆等,在多端口设备中指定使用哪个端口
- unsigned
char if_port; -
- //
DMA通道 - unsigned
char dma; - //最大传输单元,以太网数据帧最大为1500字节
- unsigned
int mtu; - //网络设备硬件类型,如10Mbps以太网ARPHRD_ETHER
- unsigned
short type; - //硬件数据帧头的长度,以太网为14字节
- unsigned
short hard_header_len; - //广播地址
- unsigned
char broadcast[MAX_ADDR_LEN]; - //硬件(如MAC)地址长度以及设备的硬件地址
- unsigned
char addr_len; - unsigned
char *dev_addr; - unsigned
char perm_addr[MAX_ADDR_LEN]; - unsigned
char addr_assign_type;
- int
ifindex; //标识网络设备的唯一索引号 - int
iflink; //用于虚拟网络设备 - unsigned
short dev_id; //用于共享网络设备
- unsigned
short needed_headroom; - unsigned
short needed_tailroom;
- struct
device dev; - const
struct attribute_group *sysfs_groups[4];
- //以设备名为关键字的网络设备哈希链表
- struct
hlist_node name_hlist; - //网络设备链表
- struct
list_head dev_list; - //支持NAPI传输的网络设备链表
- struct
list_head napi_list; - //被注销的网络设备链表
- struct
list_head unreg_list; - //网络设备硬件地址组成的链表
- struct
netdev_hw_addr_list dev_addrs; -
- struct
ethtool_rx_ntuple_list ethtool_ntuple_list; - //单播地址链表
- struct
netdev_hw_addr_list uc; - //组播地址链表
- struct
netdev_hw_addr_list mc; - //防止单播地址链表和组播地址链表被并发访问的自旋锁
- spinlock_t
addr_list_lock; - //监听所有组播地址
- unsigned
int allmulti; - //延迟注册/注销的网络设备链表
- struct
list_head todo_list; - //以索引号为关键字的网络设备哈希链表
- struct
hlist_node index_hlist; - //链路查看机制链表
- struct
list_head link_watch_list;
- //混杂模式时的单播地址个数
- int
uc_promisc; - //混杂模式的计数器
- unsigned
int promiscuity;
- struct
vlan_group __rcu *vlgrp; - void
*dsa_ptr; - void
*atalk_ptr; - struct
in_device __rcu *ip_ptr; - struct
dn_dev __rcu *dn_ptr; - struct
inet6_dev __rcu *ip6_ptr; - void
*ec_ptr; - void
*ax25_ptr; - struct
wireless_dev *ieee80211_ptr;
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
#define
- unsigned
short padded;
- //NETPOLL相关信息
- struct
netpoll_info *npinfo; - //网络命名空间
- struct
net *nd_net; - //中间层的私有数据
- union
{ -
void *ml_priv; -
struct pcpu_lstats __percpu *lstats; -
struct pcpu_tstats __percpu *tstats; -
struct pcpu_dstats __percpu *dstats; - };
- //GARP协议相关
- struct
garp_port __rcu *garp_port; - //虚拟局域网相关
- unsigned
long vlan_features; - //GSO最大值
- unsigned
int gso_max_size; - //max
exchange id for FCoE LRO by ddp - unsigned
int fcoe_ddp_xid; - //PHY实例
- struct
phy_device *phydev;
- unsigned
long state; -
- //它们的可能取值定义在linux-2.6.38.8/include/linux/if.h文件中。
- unsigned
int flags; - unsigned
short gflags; - unsigned
int priv_flags; //类似flags,但对用户空间不可见
- struct
net_device_stats stats; - //在接收过程中丢弃的数据包数目(在网络驱动中不使用此项)
- atomic_long_t
rx_dropped;
- //RFC
2863操作状态 - unsigned
char operstate; -
- //映射到RFC2863兼容状态的策略
- unsigned
char link_mode; -
- //最后接收数据包的时间
- unsigned
long last_rx; - //最近传送数据包的时间
- unsigned
long trans_start; - //发生传输超时时,设置的标志
- int
watchdog_timeo; - //网络层设置的传送数据包超时的时钟
- struct
timer_list watchdog_timer;
- enum
{ NETREG_UNINITIALIZED=0, -
NETREG_REGISTERED, -
NETREG_UNREGISTERING, -
NETREG_UNREGISTERED, -
NETREG_RELEASED, -
NETREG_DUMMY, - }
reg_state:16;
- int
__percpu *pcpu_refcnt;
- struct
net_device *master;
- enum
{ -
RTNL_LINK_INITIALIZED, -
RTNL_LINK_INITIALIZING, - }
rtnl_link_state:16;
- //使用无线网络设备扩展功能的一组操作函数
- const
struct iw_handler_def * wireless_handlers; - //无线网络设备处理函数所使用的数据
- struct
iw_public_data * wireless_data; - //网络设备驱动程序需要实现的一组操作函数
- const
struct net_device_ops *netdev_ops; - //支持ethtool功能的一组操作函数
- const
struct ethtool_ops *ethtool_ops; - //数据链路层协议头相关的一组操作函数
- const
struct header_ops *header_ops; - //析构函数,注销网络设备时被调用
- void
(*destructor)(struct net_device *dev); - //rtnetlink操作函数
- const
struct rtnl_link_ops *rtnl_link_ops; - //DCB操作函数
- const
struct dcbnl_rtnl_ops *dcbnl_ops;
- //RPS(Receive
Packet Steering)特性 - struct
kset *queues_kset; - struct
netdev_rx_queue *_rx; - unsigned
int num_rx_queues; - unsigned
int real_num_rx_queues; - rx_handler_func_t
__rcu *rx_handler; - void
__rcu *rx_handler_data; - struct
netdev_queue __rcu *ingress_queue;
- struct
netdev_queue *_tx ____cacheline_aligned_in_smp; - unsigned
int num_tx_queues; - unsigned
int real_num_tx_queues; - struct
Qdisc *qdisc; - unsigned
long tx_queue_len; - spinlock_t
tx_global_lock; - //XPS(Transmit
Packet Steering)特性 - struct
xps_dev_maps __rcu *xps_maps;