1. 程式人生 > >net_device結構體及其相關的操作函式

net_device結構體及其相關的操作函式

在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. // DMA通道   
  11. unsigned char   dma;  
  12. //最大傳輸單元,乙太網資料幀最大為1500字節   
  13. unsigned int    mtu;  
  14. //網路裝置硬體型別,如10Mbps乙太網ARPHRD_ETHER   
  15. unsigned short  type;  
  16. //硬體資料幀頭的長度,乙太網為14字節   
  17. unsigned short  hard_header_len;  
  18. //廣播地址   
  19. unsigned char   broadcast[MAX_ADDR_LEN];  
  20. //硬體(如MAC)地址長度以及裝置的硬體地址   
  21. unsigned char   addr_len;  
  22. unsigned char   *dev_addr;  
  23. unsigned char   perm_addr[MAX_ADDR_LEN];  
  24. 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. struct ethtool_rx_ntuple_list ethtool_ntuple_list;  
  12. //單播地址連結串列   
  13. struct netdev_hw_addr_list  uc;  
  14. //組播地址連結串列   
  15. struct netdev_hw_addr_list  mc;  
  16. //防止單播地址連結串列和組播地址連結串列被併發訪問的自旋鎖   
  17. spinlock_t      addr_list_lock;  
  18. //監聽所有組播地址   
  19. unsigned int        allmulti;  
  20. //延遲註冊/登出的網路裝置連結串列   
  21. struct list_head    todo_list;  
  22. //以索引號為關鍵字的網路裝置雜湊連結串列   
  23. struct hlist_node   index_hlist;  
  24. //鏈路檢視機制連結串列   
  25. struct list_head    link_watch_list;  

    (8)、混雜模式 

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

    (9)、網路層協議特定資料 

  1. struct vlan_group __rcu *vlgrp;       
  2. void            *dsa_ptr;     
  3. void            *atalk_ptr;   
  4. struct in_device __rcu  *ip_ptr;      
  5. struct dn_dev __rcu     *dn_ptr;          
  6. struct inet6_dev __rcu  *ip6_ptr;         
  7. void            *ec_ptr;      
  8. void            *ax25_ptr;    
  9. struct wireless_dev *ieee80211_ptr;   
(10)、裝置硬體功能特性  unsigned long       features;  
// 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結構體及其私有資料時為對齊所需的填充位數目

  1. unsigned short  padded;   

    (12)、其他資訊 

  1. //NETPOLL相關資訊   
  2. struct netpoll_info *npinfo;  
  3. //網路名稱空間   
  4. struct net      *nd_net;  
  5. //中間層的私有資料   
  6. union {  
  7.     void                *ml_priv;  
  8.     struct pcpu_lstats __percpu *lstats;   
  9.     struct pcpu_tstats __percpu *tstats;   
  10.     struct pcpu_dstats __percpu *dstats;   
  11. };  
  12. //GARP協議相關   
  13. struct garp_port __rcu  *garp_port;  
  14. //虛擬區域網相關   
  15. unsigned long vlan_features;  
  16. //GSO最大值   
  17. unsigned int        gso_max_size;  
  18. //max exchange id for FCoE LRO by ddp   
  19. unsigned int        fcoe_ddp_xid;  
  20. //PHY例項   
  21. struct phy_device *phydev;  

    2、網路裝置的執行狀態

    (1)、網路裝置物理上的工作狀態 

  1. unsigned long       state;  

    (2)、網路裝置通訊模式或狀態 

  1. //它們的可能取值定義在linux-2.6.38.8/include/linux/if.h檔案中。   
  2. unsigned int        flags;  
  3. unsigned short      gflags;  
  4. unsigned int            priv_flags; //類似flags,但對使用者空間不可見  

    (3)、統計資訊 

  1. struct net_device_stats stats;  
  2. //在接收過程中丟棄的資料包數目(在網路驅動中不使用此項)   
  3. atomic_long_t       rx_dropped;   

    (4)、RFC2863協議相關 

  1. //RFC 2863操作狀態   
  2. unsigned char       operstate;  
  3. //對映到RFC2863相容狀態的策略   
  4. unsigned char       link_mode;  

    (5)、傳輸超時 

  1. //最後接收資料包的時間   
  2. unsigned long       last_rx;  
  3. //最近傳送資料包的時間   
  4. unsigned long       trans_start;  
  5. //發生傳輸超時時,設定的標誌   
  6. int         watchdog_timeo;  
  7. //網路層設定的傳送資料包超時的時鐘     
  8. struct timer_list   watchdog_timer;  

    (6)、設備註冊/登出狀態機 

  1. enum { NETREG_UNINITIALIZED=0,  
  2.        NETREG_REGISTERED,     
  3.        NETREG_UNREGISTERING,      
  4.        NETREG_UNREGISTERED,   
  5.        NETREG_RELEASED,       
  6.        NETREG_DUMMY,          
  7. } reg_state:16;  

    (7)、引用計數 

  1. int __percpu        *pcpu_refcnt;  

    (8)、分組狀態 

  1. struct net_device   *master;  

   (9)、RTNL初始化狀態 

  1. enum {  
  2.     RTNL_LINK_INITIALIZED,  
  3.     RTNL_LINK_INITIALIZING,  
  4. } rtnl_link_state:16;  

    3、網路裝置的操作函式 

  1. //使用無線網路裝置擴充套件功能的一組操作函式   
  2. const struct iw_handler_def *   wireless_handlers;  
  3. //無線網路裝置處理函式所使用的資料   
  4. struct iw_public_data * wireless_data;  
  5. //網路裝置驅動程式需要實現的一組操作函式   
  6. const struct net_device_ops *netdev_ops;  
  7. //支援ethtool功能的一組操作函式   
  8. const struct ethtool_ops *ethtool_ops;  
  9. //資料鏈路層協議頭相關的一組操作函式   
  10. const struct header_ops *header_ops;  
  11. //解構函式,登出網路裝置時被呼叫   
  12. void (*destructor)(struct net_device *dev);  
  13. //rtnetlink操作函式   
  14. const struct rtnl_link_ops *rtnl_link_ops;  
  15. //DCB操作函式   
  16. const struct dcbnl_rtnl_ops *dcbnl_ops;  

    4、資料包的收發佇列

    (1)、接收佇列 

  1. //RPS(Receive Packet Steering)特性   
  2. struct kset     *queues_kset;  
  3. struct netdev_rx_queue  *_rx;  
  4. unsigned int        num_rx_queues;  
  5. unsigned int        real_num_rx_queues;  
  6. rx_handler_func_t __rcu *rx_handler;  
  7. void __rcu      *rx_handler_data;  
  8. struct netdev_queue __rcu *ingress_queue;  

    (2)、傳送佇列 

  1. struct netdev_queue *_tx ____cacheline_aligned_in_smp;  
  2. unsigned int        num_tx_queues;  
  3. unsigned int        real_num_tx_queues;  
  4. struct Qdisc        *qdisc;  
  5. unsigned long       tx_queue_len;  
  6. spinlock_t      tx_global_lock;  
  7. //XPS(Transmit Packet Steering)特性   
  8. struct xps_dev_maps __rcu *xps_maps;