网络驱动移植之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 */  
  • 1
  • 2
  • 下一页

相关内容