新闻资讯
Group news
青岛广盛源肥业有限公司    您的位置: 首页  >  新闻资讯  >  正文

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

2019年10月12日 文章来源:网络整理 热度:170℃ 作者:刘英

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

1、网络设备相关信息

(1)、设备名 

[cpp] view plain copy

char    name[IFNAMSIZ];  

char    *ifalias;  //用于SNMP协议  

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

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

[cpp] view plain copy

struct pm_qos_request_list pm_qos_req;  

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

(3)、硬件信息 

[cpp] view plain copy

//网络设备内存映射时在主机中的内存区域  

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)、标识符 

[cpp] view plain copy

int ifindex; //标识网络设备的唯一索引号  

int iflink;  //用于虚拟网络设备  

unsigned short  dev_id; //用于共享网络设备  

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

[cpp] view plain copy

unsigned short  needed_headroom;  

unsigned short  needed_tailroom;  

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

[cpp] view plain copy

struct device   dev;  

const struct attribute_group *sysfs_groups[4];  

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

[cpp] view plain copy

//以设备名为关键字的网络设备哈希链表  

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)、混杂模式 

[cpp] view plain copy

//混杂模式时的单播地址个数  

int     uc_promisc;  

//混杂模式的计数器  

unsigned int    promiscuity;  

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

[cpp] view plain copy

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)、设备硬件功能特性 

[cpp] view plain copy

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 

上一篇:详细了解Linux设备模型中的input子系统


下一篇:对Linux的进程内核栈的认识

友情链接
Links