注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

I choose

sailing with my heart ......

 
 
 

日志

 
 

NAPI收包机制  

2017-09-02 20:54:03|  分类: Linux协议栈 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1、收包中断触发后的中断处理程序
/* 检查napi状态(确保没有多个napi同时poll) */
napi_schedule_prep
/* 关闭网卡中断(一旦中断触发,则准备发起下半部函数进入poll模式,一次做多收取weight个报文)*/
/* 调度当前dev所绑定的napi,准备进入polling */
__napi_schedule
2、__napi_schedule执行过程
/* 将当前napi加入到当前cpu的softnet_data的poll列表。 */
list_add_tail(&napi->poll_list, &sd->poll_list);
/* 发起软中断,调用网卡驱动下半部处理。 */
__raise_softirq_irqoff(NET_RX_SOFTIRQ);
/* 此时中断服务程序处理结束 */
3、NET_RX_SOFTIRQ软中断处理(net_rx_action)
/* 遍历当前cpu的softnet_data的poll列表上的napi,调用各个napi的poll函数 */
(poll函数是在初始化napi时确定自定义poll函数)netif_napi_add接口初始化
4、自定义poll函数处理
从网卡收包,一次性收取所有报文,最多收取weight个报文。
在收取完当前网卡所有报文,或者收包个数达到weight之后,则结束收包。打开该网卡的收包中断。
/* 中断下半部处理完成 */

说明:
1、softnet_data,每个CPU保存一份,提高并发处理过程。

* Incoming packets are placed on per-cpu queues so that
* no locking is needed.
*/
struct softnet_data
{
        struct net_device        *output_queue;
        struct sk_buff_head        input_pkt_queue;
        struct list_head        poll_list;
        struct sk_buff                *completion_queue;

        struct net_device        backlog_dev;        /* Sorry.  */
#ifdef CONFIG_NET_DMA
        struct dma_chan                *net_dma;
#endif
};

这个数据结构同时用于接收与发送数据包,它为per_CPU结构,这样每个CPU有自己独立的信息,这样在SMP之间就避免了加锁操作,从而大大提高了信息处理的并行性。

struct net_device        *output_queue;         
struct sk_buff                *completion_queue;
这两个域用于发送数据,将在下一节中描述。

struct sk_buff_head         input_pkt_queue;
struct list_head        poll_list;
struct net_device        backlog_dev; 
这三个域用于接收数据,其中input_pkt_queue与backlog_dev仅用于non-NAPI的NIC,input_pkt_queue是接收到的数据队列头,它用于netif_rx()中,并最终由虚拟的poll函数process_backlog()处理这个SKB队列。
poll_list则是有数据包等待处理的NIC设备队列。对于non-NAPI驱动来说,它始终是backlog_dev。

接收过程:
   当一个数据包到来时,NIC会产生一个中断,这时,它会执行中断处理全程。

  评论这张
 
阅读(17)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017