分析struct net_device
相关文件:
linux/include/linux/netdevice.h
linux/drivers/net/Space.c
linux/include/net/iw_handler.h
char name[IFNAMSIZ];
在space.c文件中初始化。
unsigned long mem_end;
unsigned long mem_start;
设备相关的共享内存区
unsigned long base_addr;
设备io地址,用于内存映射前的io
unsigned int irq;
中断号
unsigned char if_port;
unsigned char dma;
这两个变量不是每个设备都有用,但是都被space.c初始化
unsigned long state;
设备状态
__LINK_STATE_XOFF 0 Device queue turned off.
__LINK_STATE_START 1 Device queue turned on.
__LINK_STATE_PRESENT 2 Device ready to be scheduled.
__LINK_STATE_SCHED 3
__LINK_STATE_NOCARRIER 4
__LINK_STATE_RX_SCHED 5 Device placed on poll list.
__LINK_STATE_LINKWATCH_PENDING 6
/* The device initialization function. Called only once. */
int (*init)(struct net_device *dev);
这是最后一个被space.c中的probe函数预先初始化的数据。
/* Interface index. Unique device identifier */
int ifindex;
int iflink;
设备的次序,和唯一的设备标识符。
struct net_device_stats* (*get_stats)(struct net_device *dev);
返回网络接口状态
struct iw_statistics* (*get_wireless_stats)(struct net_device *dev);
这个函数我并没有在最新的内核中看到,可能是修改了挺多;但是看到了配置选项。
struct iw_handler_def * wireless_handlers;
struct ethtool_ops *ethtool_ops;
这是无线设备使用的扩展功能。
在linux/include/net/iw_handler.h中可以看到更多关于。
我们开始在用户看不到的区域了,驱动的编写者不应该涉及到这部分,这是系统内部的。
unsigned long trans_start;
最后一次传输的开始时间。
unsigned long last_rx;
最后收到数据包的时间。
unsigned short flags; /* interface flags (a la BSD)*/
unsigned short gflags;
BSD风格的标识。
unsigned short priv_flags;
和flags相同,但是不可见在用户空间。
unsigned short unused_alignment_fixer;
unsigned mtu;
最大传输单元
unsigned short type;
网络硬件的类型
unsigned short hard_header_len; /* hardware hdr length */
数据链路层的头大小。
void *priv;
指向似有数据
struct net_device *master;
指向设备群中主设备
unsigned char broadcast[MAX_ADDR_LEN];
广播地址
unsigned char dev_addr[MAX_ADDR_LEN];
硬件地址
在内核代码中有这么一句话:Interface address info used in eth_type_trans()
unsigned char addr_len;
硬件地址长度
struct dev_mc_list *mc_list;
网络设备的链路层或者是MAC多播地址,
关于多播和单播
int mc_count
多播地址数
int promiscuity;
是否为混杂模式
int allmulti;
int watchdog_timeo;
struct timer_list watchdog_timer;
看门狗
void *atalk_ptr;
用于AppleTalk
void *ip_ptr;
用于ipv4
void *dn_ptr;
用于DECnet
void *ip6_ptr;
用于ipv6
void *ec_ptr;
用于Econet
void *ax25_ptr;
用于AX.25协议
struct wireless_dev *ieee80211_ptr;
/* IEEE 802.11 specific data, assign before registering */
struct list_head poll_list;
排序数据包的链表
int quota;
用于backlog device,输入的队列
int weight;
struct Qdisc *qdisc;
队列原则
struct Qdisc *qdisc_sleeping;??struct Qdisc *qdisc_list;
指向了注册了的队列原则用于网络接口设备
struct Qdisc *qdisc_ingress;
输入队列的原则
unsigned long tx_queue_len;
最大的输出数目
spinlock_t xmit_lock;
用于同步hard_start_xmit函数
int xmit_lock_owner;
spinlock_t queue_lock;
队列互斥锁
atomic_t refcnt;
指向该设备的引用
struct list_head todo_list;
用于没有注册和注册了的延迟设备
/*register/unregister state machine */
enum { NETREG_UNINITIALIZED=0,
NETREG_REGISTERED, /* completed register_netdevice */
NETREG_UNREGISTERING, /* called unregister_netdevice */
NETREG_UNREGISTERED, /* completed unregister todo */
NETREG_RELEASED, /* called free_netdev */
} reg_state;
/* Net device features */
unsigned long 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 */
#define NETIF_F_MULTI_QUEUE 16384 /* Has multiple TX/RX queues */
/* Segmentation offload features */
#define NETIF_F_GSO_SHIFT 16
#define NETIF_F_GSO_MASK 0xffff0000
#define NETIF_F_TSO (SKB_GSO_TCPV4 << NETIF_F_GSO_SHIFT)
#define NETIF_F_UFO (SKB_GSO_UDP << NETIF_F_GSO_SHIFT)
350 #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)
/* List of features with software fallbacks. */
355 #define NETIF_F_GSO_SOFTWARE (NETIF_F_TSO | NETIF_F_TSO_ECN | NETIF_F_TSO6)
#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)
360 #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)
void (*uninit)(struct net_device *dev);
在设备和网络连接时候被调用。
void (*destructor)(struct net_device *dev);
当最后一个用户撤销了引用时。
接下来的一些函数是真正的执行函数,在后面将介绍。
struct net_bridge_port *br_port;
用于实现第二层的桥接。
#ifdef CONFIG_NET_FASTROUTE
#define NETDEV_FASTROUTE_HMASK 0xF
如果定义了快速路由,那么这将生效
rwlock_t fastpath_lock;
struct dst_entry *fastpath[NETDEV_FASTROUTE_HMASK+1];
struct divert_blk *divert;
将会被每一个接口类型的初始化函数初始化。
struct class_device class_dev;
struct net_device_stats* (*last_stats)(struct net_device *);