Chinaunix首页 | 论坛 | 博客
  • 博客访问: 998390
  • 博文数量: 21
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 216
  • 用 户 组: 普通用户
  • 注册时间: 2018-11-27 17:55
文章分类
文章存档

2019年(21)

我的朋友

分类: C/C++

2019-02-05 10:43:24

Linux数据包NAPI处理流程
1. 概念
NAPI:linux新的网卡数据包处理API,采用新的数据包处理流程。
round-robin:轮询调度调度算法。
硬中断:由外设产生,主要是用来通知通过操作系统外设发生变化。比如当网卡收到数据包的时候,就会产生一个硬中断。
软中断:为了满足实时性需要,中断处理应该是越快越好,当中断发生时,硬中断处理那些用时间短的工作,而时间较长的任务放在硬中断之后处理,也就是有软中断完成。软中断是有系统调用中断指令产生的,不是硬件设备触发的。
2. 非NAPI与NAP处理流程的区别
非NAPI的数据包处理流程:采用的是中断方式,即网卡收到数据包就触发一个中断,然后交由中断处理程序进行处理。

非NAPI方式,数据包会从DMA缓冲区中复制到CPU的back_log队列,然后由下半段去处理back_log队列中的数据包;NAPI方式,poll程序直接处理DMA缓冲区的数据包,简单明了。

3. NAPI处理数据包流程图
网卡收包产生中断,调用驱动处理函数,驱动处理函数会根据网络设备是否支持NAPI调用不通的内核处理函数,netif_rx和napi_schedule为内核入口函数。


enqueue_to_backlog和__napi_schedule都通过____napi_schedule函数(通过调用__raise_softirq_irqoff(NET_RX_SOFTIRQ))激触发软中断,但是区别是加入poll_list的回调函数不同,enqueue_to_backlog的回调函数为process_backlog,而__napi_schedule的回调函数为napi_struct中的poll函数,该方法由驱动提供,在通过netif_napi_add加入napi_struct时制定。



NAPI 的使用至少要得到下面的保证:

A. 要使用 DMA 的环形输入队列(也就是 ring_dma,这个在 2.4 驱动中关于 Ethernet 的部分有详细的介绍),或者是有足够的内存空间缓存驱动获得的包。

B. 在发送/接收数据包产生中断的时候有能力关断 NIC 中断的事件处理,并且在关断 NIC 以后,并不影响数据包接收到网络设备的环形缓冲区(以下简称 rx-ring)处理队列中。


--------------------- 

参考:https://blog.csdn.net/yrx0619/article/details/80990005 

阅读(2981) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~