首页 > 其他 > 详细

深入理解linux网络技术内幕读书笔记(十)--帧的接收

时间:2014-02-23 07:36:50      阅读:407      评论:0      收藏:0      [点我收藏+]

概述

帧接收的中断处理

  1. 把帧拷贝到sk_buff数据结构。
  2. 对一些sk_buff参数做初始化,以便稍后由上面的网络层使用。
  3. 更新其他一些该设备私用函数。


设备的开启与关闭

设备的开启与关闭是由net_device->state成员进行标识的。

  • 当设备打开(dev_open()),该标识置为__LINK_STATE_START.


    1:  set_bit(__LINK_STATE_START, &dev->state);
    

  • 当设备关闭(dev_close()),该标识清位__LINK_STATE_START.


    1:  clear_bit(__LINK_STATE_START, &dev->state);
    

[注] net/core/dev.c


队列

帧接收时有入口队列,帧传输时有出口队列。
每个队列都有一个指针指向其相关的设备,以及一个指针指向存储输入/输出缓冲区的sk_buff数据接口。
只有少数专用设备不需要队列,例如回环设备。


通知内核帧已接收:NAPI和netif_rx

NAPI: New API(新型API)

  • 通过旧函数netif_rx
    多数设备依然使用。
  • 通过NAPI机制

NAPI简介

NAPI优点

  • 异步事件 —如帧的接收—是由中断事件指出,如果设备的入口队列为空,内核就不用去查了。
  • 如果内核知道设备的入口队列中有数据存在,就没必要去处理中断事件的通知信息。用简单轮询就够了。
  • 减轻了CPU负载(因为中断事件变少了)
  • 设备的处理更为公平
    一些设备的入口队列中若有数据,就会以相当公平的循环方式予以访问。

NAPI所用之net_device字段

为了处理驱动程序使用NAPI接口的设备,有四个新字段添加到此结构中,以供NET_RX_SOFTIRQ软IRQ使用。其它设备(非NAPI的设备)不会用到这些字段,
但是它们可共享嵌入在softnet_data结构中作为backlog_dev字段的net_device结构的字段。(backlog_dev是积压设备,主要是为了处理非NAPI的驱动程序来满足NAPI的架构的一个对象)
poll
这个虚拟函数可用于把缓冲区从设备的输入队列中退出。此队列是使用NAPI设备的私有队列,而softnet_data->input_pkt_queu供其它设备使用
poll_list
这是设备列表,其中的设备就是在入口队列中有新帧等待被处理的设备。这些设备就是所谓的处于轮询状态。此列表的头为softnet_data->poll_list。
此列表中的设备都处于中断功能关闭状态,而内核当前正在予以轮询。
由于Linux现在已经将NAPI的架构整合进了内核,并取代了老式的架构,所以当不支持NAPI的设备接受到来的新帧时,这个设备列表中的当前设备就是刚才说的积压设备——backlog_dev。
积压设备有自己的方法来模拟NAPI的机制。这个之后会说明。
quota
weight
quota(配额)是一个整数,代表的是poll虚拟函数一次可以从队列退出的缓冲区的最大数目。其值的增加以weight为单位,用于在不同设备间施加某种公平性。
配额越低, 表示潜在的延时愈低,因此让其他设备饿死的风险就愈低,另方面,低配额会增加设备间的切换量,因此整体的耗费会增加。
对配有非NAPI驱动程序的设备而言,weight的默认值为64。存储在net/core/dev.c顶端的weight_p变量。weight_p之值可通过/proc修改。
对配有NAPI程序的设备而言,默认值是由驱动程序所选。最常见的值是64,但是也有使用16和32的,其值可能过sysfs调整。





深入理解linux网络技术内幕读书笔记(十)--帧的接收

原文:http://www.cnblogs.com/mosp/p/3561237.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!