网络代码之接收下半部:
net_dev_init() //网络设备层初始化,流控、CPU输入队列、注册proc/sys文件系统、网络处理函数数组、注册net_rx_action
net_rx_action() //接收数据帧的软中断处理函数
{
关闭中断;
遍历设备;
开中断;
对设备调用poll方法(默认process_backlog);
}
process_backlog()
{
关中断;
循环取出待处理的包(struck sk_buff *skb);所有设备共享sk_buff队列,如果sk_buff队列空了,则从poll_list中删除设备
开中断;
调netif_receive_skb()处理帧;
}
netif_receive_skb() //软中断处理报文的主函数,NAPI/非NAPI
{
percpu帧计数++;
用skb->data初始化skb中的L2、L3、L4层协议地址;(union)
调用所有协议处理func,将包交给他们处理;
(流控;)
调用L3协议处理func,将包交给L3;
net_dev_init() //网络设备层初始化,流控、CPU输入队列、注册proc/sys文件系统、网络处理函数数组、注册net_rx_action
net_rx_action() //接收数据帧的软中断处理函数
{
关闭中断;
遍历设备;
开中断;
对设备调用poll方法(默认process_backlog);
}
process_backlog()
{
关中断;
循环取出待处理的包(struck sk_buff *skb);所有设备共享sk_buff队列,如果sk_buff队列空了,则从poll_list中删除设备
开中断;
调netif_receive_skb()处理帧;
}
netif_receive_skb() //软中断处理报文的主函数,NAPI/非NAPI
{
percpu帧计数++;
用skb->data初始化skb中的L2、L3、L4层协议地址;(union)
调用所有协议处理func,将包交给他们处理;
(流控;)
调用L3协议处理func,将包交给L3;
}
待续