net_device网络设备结构
网络接口模块的核心数据结构为网络设备结构 struct net_device
,该结构与实际的物理网卡对应,用来记录和描述网卡的相关信息和动作。具体定义如
下。
struct net_device
{
char name[IFNAMSIZ]; /*网卡名称*/
int s; /*建立的 PACKET 套接字描述符*/
struct sockaddr_ll to; /*目的网卡地址结构*/
int index /*网络设备的索引*/
int mtu; /*网卡最大传输单元*/
__u8 hwaddr_len; /*硬件地址长度*/
__u8 hwaddr[ETH_ALEN]; /*硬件地址,MAC*/
sem_t recv_sem; /*接收信号量*/
sem_t send_sem; /*发送信号量*/
struct queue *recv_queue; /*接收队列*/
struct queue *send_queue; /*发送队列*/
__u8 (* input)(struct skbuff **skb,struct net_device *dev); /*从网络设备获取数据帧*/
__u8 (* output)(struct skbuff *skb,struct net_device *dev); /*从网络设备发送数据帧*/
__u8 (* filter)(unsigned char *frame, struct net_device *dev); /*用户注册的过滤函数*/
};
初始化阶段,网络接口模块为每一块参与转发的物理网卡申请一个该结构的
管理对象,并绑定PACKET
类型的套接字用于底层数据帧的收发。运行期间,网络接口模块为每一块网卡维护接收线程和发送线程,待发送和待处理的数据帧分别挂载在发送队列和接收队列,其中,接收线程和发送线程调用 input()
和output()
函数从网卡收发单个数据帧,input()
和 output()
函数内部通过读写PACKET
套接字实现。
sk_buff数据包管理结构
sk_buff
结构体的定义如下,其中,next
指针用于构造 sk_buff
结构的链表,
sdev
记录数据帧接收自哪个网卡设备,ddev
记录处理后数据帧从哪些网卡设备发出,nh
和 phy
分别是网络层和物理层首部指针的枚举变量,分别指向网络层和物理层数据的起始位置,tot_len
记录 sk_buff
结构中数据帧的总长度,len
记录当前协议层的数据长度。head
指针指向实际数据帧的首部,data
指向当前层网络数据的首部,tail
指向当前层网络数据的尾部,end
指向实际数据帧的尾部。
struct skbuff
{
struct skbuff *next; /*指向下一个 skbuff 结构*/
struct net_device *sdev; /*接收设备*/
struct net_device *ddev; /*发送设备*/
/*网络层枚举变量*/
union{
struct iphdr *iph;
struct arph *arph;
__u8 *raw;
} nh;
/*物理层枚举变量*/
union{
struct ethhdr *ethh;
__u8 *raw;
} phy;
__u32 tot_len; /*skbuff 中网络数据的总长度*/
__u32 len; /*skbuff 中当前协议层的数据长度*/
__u8 *head, /*实际网络数据的头部指针*/
*data, /*当前层网络数据的头部指针*/
*tail, /*当前层数据的尾部指针*/
*end; /*实际网络数据的尾部指针*/
};