net_device結構體及其相關的操作函式
在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
- //傳輸介質,如雙絞線、同軸電纜等,在多埠裝置中指定使用哪個埠
- 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;
(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;
- 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;
- 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;
// features的可能取值如下:
#define NETIF_F_SG 1
#define NETIF_F_IP_CSUM 2
#define NETIF_F_NO_CSUM 4
#define NETIF_F_HW_CSUM 8
#define NETIF_F_IPV6_CSUM 16
#define NETIF_F_HIGHDMA 32
#define NETIF_F_FRAGLIST 64
#define NETIF_F_HW_VLAN_TX 128
#define NETIF_F_HW_VLAN_RX 256
#define NETIF_F_HW_VLAN_FILTER 512
#define NETIF_F_VLAN_CHALLENGED 1024
#define NETIF_F_GSO 2048
#define NETIF_F_LLTX 4096
#define NETIF_F_NETNS_LOCAL 8192
#define NETIF_F_GRO 16384
#define NETIF_F_LRO 32768
#define NETIF_F_FCOE_CRC (1 << 24)
#define NETIF_F_SCTP_CSUM (1 << 25)
#define NETIF_F_FCOE_MTU (1 << 26)
#define NETIF_F_NTUPLE (1 << 27)
#define NETIF_F_RXHASH (1 << 28)
#define NETIF_F_GSO_SHIFT 16
#define NETIF_F_GSO_MASK 0x00ff0000
#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
#define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
#define NETIF_F_GSO_ROBUST (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
#define NETIF_F_TSO_ECN (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT)
#define NETIF_F_TSO6 (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT)
#define NETIF_F_FSO (SKB_GSO_FCOE << NETIF_F_GSO_SHIFT)
#define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | \
NETIF_F_TSO6 | NETIF_F_UFO)
#define NETIF_F_GEN_CSUM (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)
#define NETIF_F_V4_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IP_CSUM)
#define NETIF_F_V6_CSUM (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM)
#define NETIF_F_ALL_CSUM (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM)
#define NETIF_F_ONE_FOR_ALL (NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \
NETIF_F_SG | NETIF_F_HIGHDMA | \
NETIF_F_FRAGLIST)
(11)、分配net_device結構體及其私有資料時為對齊所需的填充位數目
- unsigned short padded;
(12)、其他資訊
- //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;
2、網路裝置的執行狀態
(1)、網路裝置物理上的工作狀態
- unsigned long state;
(2)、網路裝置通訊模式或狀態
- //它們的可能取值定義在linux-2.6.38.8/include/linux/if.h檔案中。
- unsigned int flags;
- unsigned short gflags;
- unsigned int priv_flags; //類似flags,但對使用者空間不可見
(3)、統計資訊
- struct net_device_stats stats;
- //在接收過程中丟棄的資料包數目(在網路驅動中不使用此項)
- atomic_long_t rx_dropped;
(4)、RFC2863協議相關
- //RFC 2863操作狀態
- unsigned char operstate;
- //對映到RFC2863相容狀態的策略
- unsigned char link_mode;
(5)、傳輸超時
- //最後接收資料包的時間
- unsigned long last_rx;
- //最近傳送資料包的時間
- unsigned long trans_start;
- //發生傳輸超時時,設定的標誌
- int watchdog_timeo;
- //網路層設定的傳送資料包超時的時鐘
- struct timer_list watchdog_timer;
(6)、設備註冊/登出狀態機
- enum { NETREG_UNINITIALIZED=0,
- NETREG_REGISTERED,
- NETREG_UNREGISTERING,
- NETREG_UNREGISTERED,
- NETREG_RELEASED,
- NETREG_DUMMY,
- } reg_state:16;
(7)、引用計數
- int __percpu *pcpu_refcnt;
(8)、分組狀態
- struct net_device *master;
(9)、RTNL初始化狀態
- enum {
- RTNL_LINK_INITIALIZED,
- RTNL_LINK_INITIALIZING,
- } rtnl_link_state:16;
3、網路裝置的操作函式
- //使用無線網路裝置擴充套件功能的一組操作函式
- 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;
4、資料包的收發佇列
(1)、接收佇列
- //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;
(2)、傳送佇列
- 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;