文档库

最新最全的文档下载
当前位置:文档库 > linux报文的接收与发送

linux报文的接收与发送

对于linux内核来说,网络报文由网络设备来进行接收。设备驱动程序从网络设备中读取报文,通过内核提供的网络接口函数,将报文传递到内核中的网络协议栈。报文经过协议栈的处理,或转发、或丢弃、或被传送给某个进程。

网络报文的发送与之相反,进程通过系统调用将数据送入网络协议栈,或者由网络协议栈自己发起报文的发送,然后协议栈通过调用网络接口函数来调度驱动程序,使其将报文传送给网络设备,从而发送出去。

本文讨论的是网络接口层,它是网络设备驱动程序与网络协议栈交互的纽带。见下图中红色部分的netif。

linux报文的接收与发送

关键数据结构

//接收报文的每CPU队列

struct softnet_data

struct softnet_data

{

struct sk_buff_head input_pkt_queue; //旧接口的输入队列

struct list_head poll_list; //有需要处理报文的NAPI设备

struct napi_struct backlog;//虚拟的NAPI设备 backlog

};

DEFINE_PER_CPU_ALIGNED(struct softnet_data, softnet_data);

struct napi_struct

{

struct list_head poll_list;//挂到softnet_data的pool_list上

unsigned long state;//NAPI的调度状态

int weight;//一次轮询的最大处理报文数

int (*poll)(struct napi_struct *, int);//轮询函数

struct net_device *dev;//指向关联的网络设备