process_backlog() -- 处理从网卡上读取的sk_buff队列
来源:互联网 发布:中小型软件构架实践 编辑:程序博客网 时间:2024/05/17 04:41
net_rx_action() --> process_backlog()
static int process_backlog(struct net_device *backlog_dev, int *budget)
{
int work = 0;
int quota = min(backlog_dev->quota, *budget);
struct softnet_data *queue = &__get_cpu_var(softnet_data);
unsigned long start_time = jiffies;
backlog_dev->weight = weight_p;
for (;;) {
struct sk_buff *skb;
struct net_device *dev;
local_irq_disable();
skb = __skb_dequeue(&queue->input_pkt_queue);
if (!skb)
goto job_done;
local_irq_enable();
dev = skb->dev;
netif_receive_skb(skb);
dev_put(dev);
work++;
if (work >= quota || jiffies - start_time > 1)
break;
}
backlog_dev->quota -= work;
*budget -= work;
return -1;
job_done:
backlog_dev->quota -= work;
*budget -= work;
list_del(&backlog_dev->poll_list);
smp_mb__before_clear_bit();
netif_poll_enable(backlog_dev);
local_irq_enable();
return 0;
}
前面已经说过,软中断处理函数net_rx_action调用设备的poll方法(默认为process_backlog),而process_backlog函数将进一步调用netif_receive_skb()将数据包传上协议栈,如果设备自身注册了poll函数,也将调用netif_receive_skb()函数
/usr/src/linux-2.6.19/net/core/dev.c
static int process_backlog(struct net_device *backlog_dev, int *budget)
{
int work = 0;
int quota = min(backlog_dev->quota, *budget);
struct softnet_data *queue = &__get_cpu_var(softnet_data);
unsigned long start_time = jiffies;
backlog_dev->weight = weight_p;
for (;;) {
struct sk_buff *skb;
struct net_device *dev;
local_irq_disable();
skb = __skb_dequeue(&queue->input_pkt_queue);
if (!skb)
goto job_done;
local_irq_enable();
dev = skb->dev;
netif_receive_skb(skb);
dev_put(dev);
work++;
if (work >= quota || jiffies - start_time > 1)
break;
}
backlog_dev->quota -= work;
*budget -= work;
return -1;
job_done:
backlog_dev->quota -= work;
*budget -= work;
list_del(&backlog_dev->poll_list);
smp_mb__before_clear_bit();
netif_poll_enable(backlog_dev);
local_irq_enable();
return 0;
}
- process_backlog() -- 处理从网卡上读取的sk_buff队列
- 从网站上读取数据的方法
- 从网站上读取数据的方法
- Linux内核-从sk_buff{}结构学习“双循环双链表”的实现
- 四.读取网卡的网卡地址
- Linux内核IP层的报文处理流程--从网卡接收的报文处理流程
- Linux内核IP层的报文处理流程--从网卡接收的报文处理流程
- 读取网卡的MAC地址
- sk_buff的操作函数
- sk_buff的操作函数
- 3.18内核的sk_buff
- 从网络上读取图片
- 无线网卡 无线上网卡 的介绍
- SQL Server 从硬盘上读取指定文件的方法
- java中从键盘上读取数的example
- 从 Windows Phone 8 上的 SD 卡读取
- 从HDFS上读取带lzo压缩的SequenceFile文件
- 一种处理从文件读取整数的方式
- oracle忘记用户名密码怎样办?
- stanford parser中文句法分析时注意的问题
- android 编译mp4v2 2.0.0生成动态库
- ORACLE多行合并为一行
- 开发自己的编译器和虚拟机
- process_backlog() -- 处理从网卡上读取的sk_buff队列
- mysql语句之begin end 多重嵌套
- C语言基础-数据类型提升的层次结构
- 什么是Windows服务
- Android ADT Templates Android常用模版
- net_rx_action() -- 软中断处理函数
- propertyGrid动态(runtime)改变item的readonly 和browsable
- struts1.x+ibatis+spring配置整合
- SAP与FTP之间数据交互后台出现异常