《深入理解Linux网络技术内幕》阅读笔记(十)

中断处理函数会:
1.把帧拷贝到sk_buff数据结构。
2.对一些sk_buff参数做初始化,以便在稍后由上面的网络层使用。
3.更新其他一些该设备私用的参数。
4.为NET_RX_SOFTIRQ软IRQ调度以准备执行,借此通知内核新帧的事。
Netpoll:是一个通用的架构,可通过轮询网络适配卡(NIC)而传送及接收帧,把中断事件的需求删除掉。任何内核功能都可使用Netpoll,以受益于其功能。例如可以通过UDP把内核信息发送到远程主机。
这里写图片描述
这里写图片描述
这里写图片描述
backlog_dev:并不是一个实际上存在的网络设备,netif_rx_schedule()只是利用了其中的poll函数而已。在net_dev_init()中已经将其poll()初始化成process_backlog函数,故转入process_backlog()函数,再调用netif_receive_skb()根据包的类型送入上一层的协议栈。
netif_rx主要任务:
1.对sk_buff数据结构的一些字段做初始化(如接收帧的时间)。
2.把已接收的帧存储到CPU的私有输入队列,然后触发相关联的softirq(NET_RX_SOFTIRQ)以通知内核。
3.更新有关拥塞等级的统计数据。
这里写图片描述
这里写图片描述
这里写图片描述
拥塞等级的良好就是已接收的帧数目和正在等待处理的帧的数目。当设备驱动程序使用NAPI时,就是由驱动程序实现任何拥塞控制机制。这是因为入口帧会被放在NIC的内存内,或者放在驱动程序所管控的接收环内,因此内核无法追踪流量拥塞情况。相反,当设备驱动程序没使用NAPI时,帧会被添加到各个cpu队列,而内核就会追踪队列的拥塞等级。
在队列中当前帧的数目并不一定代表真实的拥塞等级。平均队列长度是队列状态的较好的导向。记录平均值可以使系统避免错误地把突发的流量归为拥塞。
平均队列长度以及拥塞等级计算:avg_log和cng_level的值总是会在get_sample_stats中更新。而get_sample_stats可以用两种不同方式启用:
1.每次接收一个新帧时。
2.通过周期性的定时器(必须定义OFFLINE_SAMPLE符号)。
帧可以在两个地方等待net_rx_action予以处理:
1.一个共享的CPU专用队列。非NAPI设备的中断处理例程,把帧放在本地cpu的softnet_data->input_pkt_queue。
2.设备内存。NAPI驱动程序所用的poll方法会直接从设备,或设备驱动程序的接收环中,取出帧。
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述这里写图片描述
这里写图片描述
netif_receive_skb的三个主要任务是:
1.把帧的副本传给每个协议分流器。
2.把帧的副本传给skb->protocol所关联的L3协议处理函数。
3.负责此层必须处理的一些功能,例如桥接。
如果没有协议处理例程和skb->protocol关联,并且netif_receive_skb中的处理功能,如桥接,都没有消化改帧,该帧就会被丢弃,因为内核不知道该如何处理。
这里写图片描述
这里写图片描述
这里写图片描述
L3协议处理函数对封包的处理:
1.传给接收工作站中正在执行的接收者。(应用程序)
2.丢弃
3.转发

展开阅读全文

没有更多推荐了,返回首页