相关文件:
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 *);
阅读(806) | 评论(0) | 转发(0) |