歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 網絡驅動移植之net_device結構體及其相關的操作函數

網絡驅動移植之net_device結構體及其相關的操作函數

日期:2017/3/1 10:46:19   编辑:Linux編程
內核源碼: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)、設備名

  1. char name[IFNAMSIZ];
  2. char *ifalias; //用於SNMP協議

在Linux系統中,每個網絡設備都有一個唯一的設備名(如eth0,字母部分代表網絡設備的類型,數字部分代表此類網絡設備的數量)。

(2)、電源管理服務質量( power managementQuality Of Service)

  1. struct pm_qos_request_list pm_qos_req;

用於Wi-Fi和千兆以太網,可以幫助控制網絡的延遲和帶寬的需求,以達到在可用的前提下省電的目的。

(3)、硬件信息

  1. //網絡設備內存映射時在主機中的內存區域
  2. unsigned long mem_end;
  3. unsigned long mem_start;
  4. //網絡設備I/O基地址
  5. unsigned long base_addr;
  6. //中斷號
  7. unsigned int irq;
  8. //傳輸介質,如雙絞線、同軸電纜等,在多端口設備中指定使用哪個端口
  9. unsigned char if_port;
  10. /* if_port可能的取值如下:
  11. enum {
  12. IF_PORT_UNKNOWN = 0,
  13. IF_PORT_10BASE2,
  14. IF_PORT_10BASET,
  15. IF_PORT_AUI,
  16. IF_PORT_100BASET,
  17. IF_PORT_100BASETX,
  18. IF_PORT_100BASEFX
  19. };
  20. **/
  21. // DMA通道
  22. unsigned char dma;
  23. //最大傳輸單元,以太網數據幀最大為1500字節
  24. unsigned int mtu;
  25. //網絡設備硬件類型,如10Mbps以太網ARPHRD_ETHER
  26. unsigned short type;
  27. //硬件數據幀頭的長度,以太網為14字節
  28. unsigned short hard_header_len;
  29. //廣播地址
  30. unsigned char broadcast[MAX_ADDR_LEN];
  31. //硬件(如MAC)地址長度以及設備的硬件地址
  32. unsigned char addr_len;
  33. unsigned char *dev_addr;
  34. unsigned char perm_addr[MAX_ADDR_LEN];
  35. unsigned char addr_assign_type;

(4)、標識符

  1. int ifindex; //標識網絡設備的唯一索引號
  2. int iflink; //用於虛擬網絡設備
  3. unsigned short dev_id; //用於共享網絡設備

(5)、分配套接字緩沖區時預留空間的長度

  1. unsigned short needed_headroom;
  2. unsigned short needed_tailroom;

(6)、在sysfs文件系統中輸出網絡設備信息

  1. struct device dev;
  2. const struct attribute_group *sysfs_groups[4];

(7)、網絡設備相關鏈表

  1. //以設備名為關鍵字的網絡設備哈希鏈表
  2. struct hlist_node name_hlist;
  3. //網絡設備鏈表
  4. struct list_head dev_list;
  5. //支持NAPI傳輸的網絡設備鏈表
  6. struct list_head napi_list;
  7. //被注銷的網絡設備鏈表
  8. struct list_head unreg_list;
  9. //網絡設備硬件地址組成的鏈表
  10. struct netdev_hw_addr_list dev_addrs;
  11. /* n-tuple filter list attached to this device */
  12. struct ethtool_rx_ntuple_list ethtool_ntuple_list;
  13. //單播地址鏈表
  14. struct netdev_hw_addr_list uc;
  15. //組播地址鏈表
  16. struct netdev_hw_addr_list mc;
  17. //防止單播地址鏈表和組播地址鏈表被並發訪問的自旋鎖
  18. spinlock_t addr_list_lock;
  19. //監聽所有組播地址
  20. unsigned int allmulti;
  21. //延遲注冊/注銷的網絡設備鏈表
  22. struct list_head todo_list;
  23. //以索引號為關鍵字的網絡設備哈希鏈表
  24. struct hlist_node index_hlist;
  25. //鏈路查看機制鏈表
  26. struct list_head link_watch_list;

(8)、混雜模式

  1. //混雜模式時的單播地址個數
  2. int uc_promisc;
  3. //混雜模式的計數器
  4. unsigned int promiscuity;

(9)、網絡層協議特定數據

  1. struct vlan_group __rcu *vlgrp; /* VLAN group */
  2. void *dsa_ptr; /* dsa specific data */
  3. void *atalk_ptr; /* AppleTalk link */
  4. struct in_device __rcu *ip_ptr; /* IPv4 specific data */
  5. struct dn_dev __rcu *dn_ptr; /* DECnet specific data */
  6. struct inet6_dev __rcu *ip6_ptr; /* IPv6 specific data */
  7. void *ec_ptr; /* Econet specific data */
  8. void *ax25_ptr; /* AX.25 specific data */
  9. struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data,
  10. assign before registering */
Copyright © Linux教程網 All Rights Reserved