在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;