歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

網絡驅動移植之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)、設備名 

  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