在Linux系统中,网络设备都被抽象为struct net_device结构体。它是网络设备硬件与上层协议之间联系的接口,了解它对编写网络驱动程序非常有益,所以本文将着手简要介绍linux-2.6.38.8/include/linux/netdevice.h文件中struct net_device结构体的所有成员(没有按照它们定义的顺序)。

1、网络设备相关信息

(1)、设备名

char    name[IFNAMSIZ];
char *ifalias; //用于SNMP协议

在Linux系统中,每个网络设备都有一个唯一的设备名(如eth0,字母部分代表网络设备的类型,数字部分代表此类网络设备的数量)。

(2)、电源管理服务质量( power managementQuality Of Service)

struct pm_qos_request_list pm_qos_req;  

用于Wi-Fi和千兆以太网,可以帮助控制网络的延迟和带宽的需求,以达到在可用的前提下省电的目的。

(3)、硬件信息

//网络设备内存映射时在主机中的内存区域
unsigned long mem_end;
unsigned long mem_start;
//网络设备I/O基地址
unsigned long base_addr;
//中断号
unsigned int irq;
//传输介质,如双绞线、同轴电缆等,在多端口设备中指定使用哪个端口
unsigned char if_port;
/* if_port可能的取值如下:
enum {
IF_PORT_UNKNOWN = 0,
IF_PORT_10BASE2,
IF_PORT_10BASET,
IF_PORT_AUI,
IF_PORT_100BASET,
IF_PORT_100BASETX,
IF_PORT_100BASEFX
};
**/
// DMA通道
unsigned char dma;
//最大传输单元,以太网数据帧最大为1500字节
unsigned int mtu;
//网络设备硬件类型,如10Mbps以太网ARPHRD_ETHER
unsigned short type;
//硬件数据帧头的长度,以太网为14字节
unsigned short hard_header_len;
//广播地址
unsigned char broadcast[MAX_ADDR_LEN];
//硬件(如MAC)地址长度以及设备的硬件地址
unsigned char addr_len;
unsigned char *dev_addr;
unsigned char perm_addr[MAX_ADDR_LEN];
unsigned char addr_assign_type;

(4)、标识符

int ifindex; //标识网络设备的唯一索引号
int iflink; //用于虚拟网络设备
unsigned short dev_id; //用于共享网络设备

(5)、分配套接字缓冲区时预留空间的长度

unsigned short  needed_headroom;
unsigned short needed_tailroom;

(6)、在sysfs文件系统中输出网络设备信息

struct device   dev;
const struct attribute_group *sysfs_groups[4];

(7)、网络设备相关链表

//以设备名为关键字的网络设备哈希链表
struct hlist_node name_hlist;
//网络设备链表
struct list_head dev_list;
//支持NAPI传输的网络设备链表
struct list_head napi_list;
//被注销的网络设备链表
struct list_head unreg_list;
//网络设备硬件地址组成的链表
struct netdev_hw_addr_list dev_addrs;
/* n-tuple filter list attached to this device */
struct ethtool_rx_ntuple_list ethtool_ntuple_list;
//单播地址链表
struct netdev_hw_addr_list uc;
//组播地址链表
struct netdev_hw_addr_list mc;
//防止单播地址链表和组播地址链表被并发访问的自旋锁
spinlock_t addr_list_lock;
//监听所有组播地址
unsigned int allmulti;
//延迟注册/注销的网络设备链表
struct list_head todo_list;
//以索引号为关键字的网络设备哈希链表
struct hlist_node index_hlist;
//链路查看机制链表
struct list_head link_watch_list;

(8)、混杂模式

//混杂模式时的单播地址个数
int uc_promisc;
//混杂模式的计数器
unsigned int promiscuity;

(9)、网络层协议特定数据

struct vlan_group __rcu *vlgrp;     /* VLAN group */
void *dsa_ptr; /* dsa specific data */
void *atalk_ptr; /* AppleTalk link */
struct in_device __rcu *ip_ptr; /* IPv4 specific data */
struct dn_dev __rcu *dn_ptr; /* DECnet specific data */
struct inet6_dev __rcu *ip6_ptr; /* IPv6 specific data */
void *ec_ptr; /* Econet specific data */
void *ax25_ptr; /* AX.25 specific data */
struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data,
assign before registering */

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

 unsigned long       features;
// features的可能取值如下:
#define NETIF_F_SG 1 /* Scatter/gather IO. */
#define NETIF_F_IP_CSUM 2 /* Can checksum TCP/UDP over IPv4. */
#define NETIF_F_NO_CSUM 4 /* Does not require checksum. F.e. loopack. */
#define NETIF_F_HW_CSUM 8 /* Can checksum all the packets. */
#define NETIF_F_IPV6_CSUM 16 /* Can checksum TCP/UDP over IPV6 */
#define NETIF_F_HIGHDMA 32 /* Can DMA to high memory. */
#define NETIF_F_FRAGLIST 64 /* Scatter/gather IO. */
#define NETIF_F_HW_VLAN_TX 128 /* Transmit VLAN hw acceleration */
#define NETIF_F_HW_VLAN_RX 256 /* Receive VLAN hw acceleration */
#define NETIF_F_HW_VLAN_FILTER 512 /* Receive filtering on VLAN */
#define NETIF_F_VLAN_CHALLENGED 1024 /* Device cannot handle VLAN packets */
#define NETIF_F_GSO 2048 /* Enable software GSO. */
#define NETIF_F_LLTX 4096 /* LockLess TX - deprecated. Please */
/* do not use LLTX in new drivers */
#define NETIF_F_NETNS_LOCAL 8192 /* Does not change network namespaces */
#define NETIF_F_GRO 16384 /* Generic receive offload */
#define NETIF_F_LRO 32768 /* large receive offload */
#define NETIF_F_FCOE_CRC (1 << 24) /* FCoE CRC32 */
#define NETIF_F_SCTP_CSUM (1 << 25) /* SCTP checksum offload */
#define NETIF_F_FCOE_MTU (1 << 26) /* Supports max FCoE MTU, 2158 bytes*/
#define NETIF_F_NTUPLE (1 << 27) /* N-tuple filters supported */
#define NETIF_F_RXHASH (1 << 28) /* Receive hashing offload */
#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结构体及其私有数据时为对齐所需的填充位数目

unsigned short  padded;   

(12)、其他信息

//NETPOLL相关信息
struct netpoll_info *npinfo;
//网络命名空间
struct net *nd_net;
//中间层的私有数据
union {
void *ml_priv;
struct pcpu_lstats __percpu *lstats; /* loopback stats */
struct pcpu_tstats __percpu *tstats; /* tunnel stats */
struct pcpu_dstats __percpu *dstats; /* dummy stats */
};
//GARP协议相关
struct garp_port __rcu *garp_port;
//虚拟局域网相关
unsigned long vlan_features;
//GSO最大值
unsigned int gso_max_size;
//max exchange id for FCoE LRO by ddp
unsigned int fcoe_ddp_xid;
//PHY实例
struct phy_device *phydev;

2、网络设备的运行状态

(1)、网络设备物理上的工作状态

unsigned long       state;
/* state的可能取值如下:
enum netdev_state_t {
__LINK_STATE_START,
__LINK_STATE_PRESENT,
__LINK_STATE_NOCARRIER,
__LINK_STATE_LINKWATCH_PENDING,
__LINK_STATE_DORMANT,
};
**/

(2)、网络设备通信模式或状态

//它们的可能取值定义在linux-2.6.38.8/include/linux/if.h文件中。
unsigned int flags;
unsigned short gflags;
unsigned int priv_flags; //类似flags,但对用户空间不可见

(3)、统计信息

struct net_device_stats stats;
//在接收过程中丢弃的数据包数目(在网络驱动中不使用此项)
atomic_long_t rx_dropped;

(4)、RFC2863协议相关

//RFC 2863操作状态
unsigned char operstate;
/* operstate的可能取值如下:
enum {
IF_OPER_UNKNOWN,
IF_OPER_NOTPRESENT,
IF_OPER_DOWN,
IF_OPER_LOWERLAYERDOWN,
IF_OPER_TESTING,
IF_OPER_DORMANT,
IF_OPER_UP,
};
**/
//映射到RFC2863兼容状态的策略
unsigned char link_mode;
/* link_mode的可能取值如下:
enum {
IF_LINK_MODE_DEFAULT,
IF_LINK_MODE_DORMANT,
};
**/

(5)、传输超时

//最后接收数据包的时间
unsigned long last_rx;
//最近传送数据包的时间
unsigned long trans_start;
//发生传输超时时,设置的标志
int watchdog_timeo;
//网络层设置的传送数据包超时的时钟
struct timer_list watchdog_timer;

(6)、设备注册/注销状态机

enum { NETREG_UNINITIALIZED=0,
NETREG_REGISTERED, /* completed register_netdevice */
NETREG_UNREGISTERING, /* called unregister_netdevice */
NETREG_UNREGISTERED, /* completed unregister todo */
NETREG_RELEASED, /* called free_netdev */
NETREG_DUMMY, /* dummy device for NAPI poll */
} reg_state:16;

(7)、引用计数

int __percpu        *pcpu_refcnt;  

(8)、分组状态

struct net_device   *master;  

(9)、RTNL初始化状态

enum {
RTNL_LINK_INITIALIZED,
RTNL_LINK_INITIALIZING,
} rtnl_link_state:16;

3、网络设备的操作函数

//使用无线网络设备扩展功能的一组操作函数
const struct iw_handler_def * wireless_handlers;
//无线网络设备处理函数所使用的数据
struct iw_public_data * wireless_data;
//网络设备驱动程序需要实现的一组操作函数
const struct net_device_ops *netdev_ops;
//支持ethtool功能的一组操作函数
const struct ethtool_ops *ethtool_ops;
//数据链路层协议头相关的一组操作函数
const struct header_ops *header_ops;
//析构函数,注销网络设备时被调用
void (*destructor)(struct net_device *dev);
//rtnetlink操作函数
const struct rtnl_link_ops *rtnl_link_ops;
//DCB操作函数
const struct dcbnl_rtnl_ops *dcbnl_ops;

4、数据包的收发队列

(1)、接收队列

//RPS(Receive Packet Steering)特性
struct kset *queues_kset;
struct netdev_rx_queue *_rx;
unsigned int num_rx_queues;
unsigned int real_num_rx_queues;
rx_handler_func_t __rcu *rx_handler;
void __rcu *rx_handler_data;
struct netdev_queue __rcu *ingress_queue;

(2)、发送队列

struct netdev_queue *_tx ____cacheline_aligned_in_smp;
unsigned int num_tx_queues;
unsigned int real_num_tx_queues;
struct Qdisc *qdisc;
unsigned long tx_queue_len;
spinlock_t tx_global_lock;
//XPS(Transmit Packet Steering)特性
struct xps_dev_maps __rcu *xps_maps;

网络驱动之net_device结构体的更多相关文章

  1. 网络驱动移植之net_device结构体及其相关的操作函数

    内核源码:Linux-2.6.38.8.tar.bz2 在Linux系统中,网络设备都被抽象为struct net_device结构体.它是网络设备硬件与上层协议之间联系的接口,了解它对编写网络驱动程 ...

  2. Windows驱动开发-Device结构体

    每个驱动程序会创建一个或多个设备对象,每个设备对象都会有一个指针指向下一个设备对象 Device结构体源码 typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATIO ...

  3. Windows驱动开发-_DRIVER_OBJECT结构体

    每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载的时候,被内核中的对象管理程序所创建的,内核对一个驱动只加载一个实例,是由内核中的I/O管理器负责加载的,驱动程序需要在Driver ...

  4. Windows驱动开发-IRP结构体

    IRP的全名是I/O Request Package,即输入输出请求包,它是Windows内核中的一种非常重要的数据结构. 上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求,操作系统将相应的 ...

  5. net_device 结构体分析

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

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

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

  7. struct net_device网络设备结构体详解

    转自:http://blog.csdn.net/viewsky11/article/details/53046787 在linux中使用struct net_device结构体来描述每一个网络设备.同 ...

  8. 二十四、V4L2框架主要结构体分析和虚拟摄像头驱动编写

    一.V4L2框架主要结构体分析 V4L2(video for linux version 2),是内核中视频设备的驱动框架,为上层访问视频设备提供统一接口. V4L2整体框架如下图: 图中主要包括两层 ...

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

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

随机推荐

  1. odoo12从零开始:一、安装odoo运行环境(windows10)

    前言 鉴于好多朋友说没有mac电脑,windows开发其实也差不了多远,只是个人习惯问题,而且吧,windows的电脑其实配环境也挺快的其实,我在这里再稍微补一个比较简单的windows环境部署,希望 ...

  2. 【Offer】[8] 【中序遍历的下一个结点】

    题目描述 思路分析 Java代码 代码链接 题目描述 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? 树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针. ...

  3. Kubernetes pod 状态

    CrashLoopBackOff: 容器退出,kubelet正在将它重启 InvalidImageName: 无法解析镜像名称 ImageInspectError: 无法校验镜像 ErrImageNe ...

  4. 降低 80% 的读写响应延迟!我们测评了 etcd 3.4 新特性(内含读写发展史)

    作者 | 陈洁(墨封)  阿里云开发工程师 导读:etcd 作为 K8s 集群中的存储组件,读写性能方面会受到很多压力,而 etcd 3.4 中的新特性将有效缓解压力,本文将从 etcd 数据读写机制 ...

  5. 多线程——Runnable接口

    以实现Runable接口的方式创建线程比继承Thread类有很大的优越性,因为类不能多重继承,即一个类只能继承一个类,那么如果该类已经继承了一个类,就不能实现多线程了,但是可以通过实现Runable接 ...

  6. Java第三次作业第二题

    2. [请复制本程序,作为java程序代码,进行编译,补充填写缺失代码部分,并实现题目要求功能,从而获得空白填写所需的内容.] 定义3个线程,模拟红绿灯的效果 一个线程控制画一个实心红圆 一个线程控制 ...

  7. BAT资深工程师 由浅入深分析 Tp5&Tp6底层源码 - 分享

    BAT资深工程师由浅入深分析Tp5&Tp6底层源码 第1章 课程简介 本章主要让大家知道本套课程的主线, 导学内容,如何学习源码等,看完本章要让小伙伴觉得这个是必须要掌握的,并且对加薪有很大的 ...

  8. Spring——面向切面编程(AOP)详解

    声明:本博客仅仅是一个初学者的学习记录.心得总结,其中肯定有许多错误,不具有参考价值,欢迎大佬指正,谢谢!想和我交流.一起学习.一起进步的朋友可以加我微信Liu__66666666 这是简单学习一遍之 ...

  9. JS中如何防止表单重复提交问题

    在登录页面html中写如下代码 <script type="text/javascript"> var issubmit=false; function dosubmi ...

  10. Linux中安装传输的命令行工具

    创建lrzsz目录: mkdir /usr/local/lrzsz 进入lrzsz目录: cd /usr/local/lrzsz 下载lrzsz压缩包: wget http://www.ohse.de ...