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.    
  11. // DMA通道   
  12. unsigned char   dma;  
  13. //最大传输单元,以太网数据帧最大为1500字节   
  14. unsigned int    mtu;  
  15. //网络设备硬件类型,如10Mbps以太网ARPHRD_ETHER   
  16. unsigned short  type;  
  17. //硬件数据帧头的长度,以太网为14字节   
  18. unsigned short  hard_header_len;  
  19. //广播地址   
  20. unsigned char   broadcast[MAX_ADDR_LEN];  
  21. //硬件(如MAC)地址长度以及设备的硬件地址   
  22. unsigned char   addr_len;  
  23. unsigned char   *dev_addr;  
  24. unsigned char   perm_addr[MAX_ADDR_LEN];  
  25. 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.   
  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;       
  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           
#define NETIF_F_IP_CSUM           

#define NETIF_F_NO_CSUM           
#define NETIF_F_HW_CSUM           
#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.   

            (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.    
        4. //映射到RFC2863兼容状态的策略   
        5. unsigned char       link_mode;  
        6.   

            (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;  
        • 1
          点赞
        • 5
          收藏
          觉得还不错? 一键收藏
        • 0
          评论
        评论
        添加红包

        请填写红包祝福语或标题

        红包个数最小为10个

        红包金额最低5元

        当前余额3.43前往充值 >
        需支付:10.00
        成就一亿技术人!
        领取后你会自动成为博主和红包主的粉丝 规则
        hope_wisdom
        发出的红包
        实付
        使用余额支付
        点击重新获取
        扫码支付
        钱包余额 0

        抵扣说明:

        1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
        2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

        余额充值