内核源码: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 */

(10)、设备硬件功能特性

  1. unsigned long       features;
  2. // features的可能取值如下:
  3. #define NETIF_F_SG      1   /* Scatter/gather IO. */
  4. #define NETIF_F_IP_CSUM     2   /* Can checksum TCP/UDP over IPv4. */
  5. #define NETIF_F_NO_CSUM     4   /* Does not require checksum. F.e. loopack. */
  6. #define NETIF_F_HW_CSUM     8   /* Can checksum all the packets. */
  7. #define NETIF_F_IPV6_CSUM   16  /* Can checksum TCP/UDP over IPV6 */
  8. #define NETIF_F_HIGHDMA     32  /* Can DMA to high memory. */
  9. #define NETIF_F_FRAGLIST    64  /* Scatter/gather IO. */
  10. #define NETIF_F_HW_VLAN_TX  128 /* Transmit VLAN hw acceleration */
  11. #define NETIF_F_HW_VLAN_RX  256 /* Receive VLAN hw acceleration */
  12. #define NETIF_F_HW_VLAN_FILTER  512 /* Receive filtering on VLAN */
  13. #define NETIF_F_VLAN_CHALLENGED 1024    /* Device cannot handle VLAN packets */
  14. #define NETIF_F_GSO     2048    /* Enable software GSO. */
  15. #define NETIF_F_LLTX        4096    /* LockLess TX - deprecated. Please */
  16. /* do not use LLTX in new drivers */
  17. #define NETIF_F_NETNS_LOCAL 8192    /* Does not change network namespaces */
  18. #define NETIF_F_GRO     16384   /* Generic receive offload */
  19. #define NETIF_F_LRO     32768   /* large receive offload */
  20. #define NETIF_F_FCOE_CRC    (1 << 24) /* FCoE CRC32 */
  21. #define NETIF_F_SCTP_CSUM   (1 << 25) /* SCTP checksum offload */
  22. #define NETIF_F_FCOE_MTU    (1 << 26) /* Supports max FCoE MTU, 2158 bytes*/
  23. #define NETIF_F_NTUPLE      (1 << 27) /* N-tuple filters supported */
  24. #define NETIF_F_RXHASH      (1 << 28) /* Receive hashing offload */
  25. #define NETIF_F_GSO_SHIFT   16
  26. #define NETIF_F_GSO_MASK    0x00ff0000
  27. #define NETIF_F_TSO     (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
  28. #define NETIF_F_UFO     (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
  29. #define NETIF_F_GSO_ROBUST  (SKB_GSO_DODGY << NETIF_F_GSO_SHIFT)
  30. #define NETIF_F_TSO_ECN     (SKB_GSO_TCP_ECN << NETIF_F_GSO_SHIFT)
  31. #define NETIF_F_TSO6        (SKB_GSO_TCPV6 << NETIF_F_GSO_SHIFT)
  32. #define NETIF_F_FSO     (SKB_GSO_FCOE << NETIF_F_GSO_SHIFT)
  33. #define NETIF_F_GSO_SOFTWARE    (NETIF_F_TSO | NETIF_F_TSO_ECN | \
  34. NETIF_F_TSO6 | NETIF_F_UFO)
  35. #define NETIF_F_GEN_CSUM    (NETIF_F_NO_CSUM | NETIF_F_HW_CSUM)
  36. #define NETIF_F_V4_CSUM     (NETIF_F_GEN_CSUM | NETIF_F_IP_CSUM)
  37. #define NETIF_F_V6_CSUM     (NETIF_F_GEN_CSUM | NETIF_F_IPV6_CSUM)
  38. #define NETIF_F_ALL_CSUM    (NETIF_F_V4_CSUM | NETIF_F_V6_CSUM)
  39. #define NETIF_F_ONE_FOR_ALL (NETIF_F_GSO_SOFTWARE | NETIF_F_GSO_ROBUST | \
  40. NETIF_F_SG | NETIF_F_HIGHDMA |     \
  41. 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; /* loopback stats */
  9. struct pcpu_tstats __percpu *tstats; /* tunnel stats */
  10. struct pcpu_dstats __percpu *dstats; /* dummy stats */
  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. /* state的可能取值如下:
  3. enum netdev_state_t {
  4. __LINK_STATE_START,
  5. __LINK_STATE_PRESENT,
  6. __LINK_STATE_NOCARRIER,
  7. __LINK_STATE_LINKWATCH_PENDING,
  8. __LINK_STATE_DORMANT,
  9. };
  10. **/

(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. /* operstate的可能取值如下:
  4. enum {
  5. IF_OPER_UNKNOWN,
  6. IF_OPER_NOTPRESENT,
  7. IF_OPER_DOWN,
  8. IF_OPER_LOWERLAYERDOWN,
  9. IF_OPER_TESTING,
  10. IF_OPER_DORMANT,
  11. IF_OPER_UP,
  12. };
  13. **/
  14. //映射到RFC2863兼容状态的策略
  15. unsigned char       link_mode;
  16. /* link_mode的可能取值如下:
  17. enum {
  18. IF_LINK_MODE_DEFAULT,
  19. IF_LINK_MODE_DORMANT,
  20. };
  21. **/

(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,   /* completed register_netdevice */
  3. NETREG_UNREGISTERING,    /* called unregister_netdevice */
  4. NETREG_UNREGISTERED, /* completed unregister todo */
  5. NETREG_RELEASED,     /* called free_netdev */
  6. NETREG_DUMMY,        /* dummy device for NAPI poll */
  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;
 

网络驱动移植之net_device结构体及其相关的操作函数的更多相关文章

  1. 网络驱动之net_device结构体

    在Linux系统中,网络设备都被抽象为struct net_device结构体.它是网络设备硬件与上层协议之间联系的接口,了解它对编写网络驱动程序非常有益,所以本文将着手简要介绍linux-2.6.3 ...

  2. 网络驱动移植之解析Linux网络驱动的基本框架

    内核源码:linux-2.6.38.8.tar.bz2 概括而言,编写Linux网络驱动其实只要完成两件事即可,一是分配并初始化网络设备,二是注册网络设备. 1.分配并初始化网络设备 动态分配网络设备 ...

  3. 网络驱动移植之例解netdev_priv函数

    版权声明:本文为博主原创文章,未经博主允许不得转载. 开发平台:Ubuntu 11.04 编译器:gcc version 4.5.2 (Ubuntu/Linaro 4.5.2-8ubuntu4) 内核 ...

  4. go结构体的方法和普通函数

    package main import ( "fmt" "math" ) type vertex struct { X, Y float64 } //值接收者是 ...

  5. XmlRpc.net 入参结构体嵌套的转义操作

    项目使用C#开发,需要使用XmlRpc和Linux服务器端交互,用的是XmlRpc.net. 普通的程序调用入参和出差都没有问题,今天遇到入参结构体嵌套,结果 args 入参在服务器端不能解析.抓包数 ...

  6. x264中重要结构体参数解释,参数设置,函数说明 <转>

    x264中重要结构体参数解释http://www.usr.cc/thread-51995-1-3.htmlx264参数设置http://www.usr.cc/thread-51996-1-3.html ...

  7. 网络驱动移植之简述CS8900A网络芯片的基本原理

    CS8900A数据手册:http://www.cirrus.com/cn/products/cs8900a.html 1.概述 CS8900A是CIRRUS LOGIC公司生产的低功耗.性能优越的16 ...

  8. net_device 结构体分析

    /* * The DEVICE structure. * Actually, this whole structure is a big mistake. It mixes I/O * data wi ...

  9. Linux块设备驱动 --块驱动相关的结构体及相关操作

    http://blog.chinaunix.net/uid-23399063-id-70124.html

随机推荐

  1. CentOS 7中设置PHP7的Log文件日志

    对于服务器上面运行的php代码, 想要去查看对应的log,找到代码无法运行的原因 1.通过:phpinfo()去找 error_log 结果得到: 2.然后去编辑php.ini,修改三处地方 vi / ...

  2. hdu1059(背包dp二进制优化)

    Dividing Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...

  3. PatentTips - Solid State Memory Wear Leveling

    BACKGROUND OF THE INVENTION Solid-state memory devices encompass rewritable non-volatile memory devi ...

  4. msp430入门编程41

    msp430中C语言的软件工程--状态机建模

  5. phpstorm的破解

    按照PHPstorm进入如下页面: 然后继续单击License  server  输入:http://www.0-php.com:1017    PHPstorm完美运行!!!!!

  6. Codeforces 653C Bear and Up-Down【暴力】

    题目链接: http://codeforces.com/problemset/problem/653/C 题意: 给定序列,偶数位的数字比两边都大,则成为nice,只可以交换两个数字,问有多少种交换方 ...

  7. Drainage Ditches--hdu1532(网络流 模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1532 Drainage Ditches Time Limit: 2000/1000 MS (Java/Other ...

  8. java 读取数据库数据转化输出XML输出在jsp页面

    因为老师实验报告要求,搭建服务端解析XML 下面代码实现转化XML格式也是在网上找的转化代码 输出在jsp页面以便于客户端解析是自己写的 一个类就解决了Test package tests; //三只 ...

  9. linux命名详解及其软件安装实例

    始于cd,ls命令 好啦,步入正题,我使用的linux连接工具为xshell,mRemoteNG,对两款工具不做介绍啦,你可以百度一下,实在不会入左上方群. 进入之后,便是上面的界面黑乎乎一片,对于初 ...

  10. 百度统计的JS脚本原理解析

    一句话:在你的网站上加载百度统计的脚本,这个脚本会收集你的本地信息,然后发送给百度统计网站 https://blog.csdn.net/iqzq123/article/details/8877645 ...