网络驱动移植之net_device结构体及其相关的操作函数
网络驱动移植之net_device结构体及其相关的操作函数
内核源码:linux-2.6.38.8.tar.bz2在Linux系统中,网络设备都被抽象为struct net_device结构体。它是网络设备硬件与上层协议之间联系的接口,了解它对编写网络驱动程序非常有益,所以本文将着手简要介绍linux-2.6.38.8/include/linux/netdevice.h文件中struct net_device结构体的所有成员(没有按照它们定义的顺序)。
1、网络设备相关信息
(1)、设备名
- char name[IFNAMSIZ];
- char *ifalias; //用于SNMP协议
在Linux系统中,每个网络设备都有一个唯一的设备名(如eth0,字母部分代表网络设备的类型,数字部分代表此类网络设备的数量)。
(2)、电源管理服务质量( power managementQuality Of Service)
- struct pm_qos_request_list pm_qos_req;
用于Wi-Fi和千兆以太网,可以帮助控制网络的延迟和带宽的需求,以达到在可用的前提下省电的目的。
(3)、硬件信息
- //网络设备内存映射时在主机中的内存区域
- unsigned long mem_end;
- unsigned long mem_start;
- //网络设备I/O基地址
- unsigned long base_addr;
- //中断号
- unsigned int irq;
- //传输介质,如双绞线、同轴电缆等,在多端口设备中指定使用哪个端口
- unsigned char if_port;
- /* if_port可能的取值如下:
- enum {
- IF_PORT_UNKNOWN = 0,
- IF_PORT_10BASE2,
- IF_PORT_10BASET,
- IF_PORT_AUI,
- IF_PORT_100BASET,
- IF_PORT_100BASETX,
- IF_PORT_100BASEFX
- };
- **/
- // 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;
(4)、标识符
- int ifindex; //标识网络设备的唯一索引号
- int iflink; //用于虚拟网络设备
- unsigned short dev_id; //用于共享网络设备
(5)、分配套接字缓冲区时预留空间的长度
- unsigned short needed_headroom;
- unsigned short needed_tailroom;
(6)、在sysfs文件系统中输出网络设备信息
- struct device dev;
- const struct attribute_group *sysfs_groups[4];
(7)、网络设备相关链表
- //以设备名为关键字的网络设备哈希链表
- 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;
- /* n-tuple filter list attached to this device */
- 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;
(8)、混杂模式
- //混杂模式时的单播地址个数
- int uc_promisc;
- //混杂模式的计数器
- unsigned int promiscuity;
(9)、网络层协议特定数据
- struct vlan_group __rcu *vlgrp; /* VLAN group */
- void *dsa_ptr; /* dsa specific data */
- void *atalk_ptr; /* AppleTalk link */
- struct in_device __rcu *ip_ptr; /* IPv4 specific data */
- struct dn_dev __rcu *dn_ptr; /* DECnet specific data */
- struct inet6_dev __rcu *ip6_ptr; /* IPv6 specific data */
- void *ec_ptr; /* Econet specific data */
- void *ax25_ptr; /* AX.25 specific data */
- struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data,
- assign before registering */
|
评论暂时关闭