內核源碼: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 */