现在的位置: 首页 > 综合 > 正文

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

2013年10月09日 ⁄ 综合 ⁄ 共 7273字 ⁄ 字号 评论关闭

    内核源码: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)、设备名 

	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;

抱歉!评论已关闭.