77范文网 - 专业文章范例文档资料分享平台

网络数据包收发流程(一):从驱动到协议栈(3)

来源:网络收集 时间:2019-01-05 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

以太网的FCS会在网卡中断(如gfar_clean_rx_ring)中忽略掉 /* Remove the FCS from the packet length */ pkt_len = bdp->length - 4;

至于填充数据,是在协议栈中被忽略掉的,比如ip协议ip_rcv()

/* Our transport medium may have padded the buffer out. Now we know it * is IP we can trim to the true length of the frame. * Note this now means skb->len holds ntohs(iph->tot_len). */

if (pskb_trim_rcsum(skb, len)) {

IP_INC_STATS_BH(IPSTATS_MIB_INDISCARDS); goto drop; }

网络数据包收发流程(二):不配置NAPI的情况 2011-06-28 10:46:09

分类: LINUX

上一篇讲的是内核配置成NAPI的情况,那也是绝大多数内核使用的配置 现在讲讲内核不配置成NAPI时的情况

一、no NAPI 数据结构

不配置NAPI的时候,网络设备不使用自己的napi_struct结构,

所有网络设备驱动都使用同一个napi_struct,即cpu私有变量__get_cpu_var(softnet_data).backlog

每当收到数据包时,网络设备驱动会把__get_cpu_var(softnet_data).backlog__get_cpu_var(softnet_data).poll_list上面。

挂到

所以软中断里net_rx_action遍历cpu私有变量__get_cpu_var(softnet_data).poll_list时, 上面挂的napi_struct只有一个

二、内核启动时的准备工作

也是在net_dev_init中,初始化了cpu私有变量的napi_struct,即所有网络设备驱动使用的napi_struct

__init net_dev_init() {

//每个CPU都有一个私有变量 _get_cpu_var(softnet_data)

//_get_cpu_var(softnet_data).poll_list很重要,软中断中需要遍历它的 for_each_possible_cpu(i) { struct softnet_data *queue; queue = &per_cpu(softnet_data, i);

skb_queue_head_init(&queue->input_pkt_queue); // 不配置NAPI时,才使用这个接收队列 queue->completion_queue = NULL; INIT_LIST_HEAD(&queue->poll_list);

queue->backlog.poll = process_backlog; // poll钩子函数初始化 queue->backlog.weight = weight_p; // }

open_softirq(NET_TX_SOFTIRQ, net_tx_action, NULL); //在软中断上挂网络接收handler open_softirq(NET_RX_SOFTIRQ, net_rx_action, NULL); //在软中断上挂网络发送handler }

三、中断里接受以太网包

TSEC的接收中断处理函数

gfar_receive {

gfar_write(&priv->regs->ievent, IEVENT_RX_MASK); #ifdef CONFIG_GFAR_NAPI

// test_and_set当前net_device的napi_struct.state 为 NAPI_STATE_SCHED // 在软中断里调用 net_rx_action 会检查状态 napi_struct.state

if (netif_rx_schedule_prep(dev, &priv->napi)) { tempval = gfar_read(&priv->regs->imask); tempval &= IMASK_RX_DISABLED; gfar_write(&priv->regs->imask, tempval); // 将当前net_device的 napi_struct.poll_list 挂到

// CPU私有变量&__get_cpu_var(softnet_data).poll_list 上,并触发软中断 // 所以,在软中断中调用 net_rx_action 的时候,就会执行当前net_device的 // napi_struct.poll()钩子函数,即 gfar_poll() __netif_rx_schedule(dev, &priv->napi); } #else

gfar_clean_rx_ring(dev, priv->rx_ring_size); #endif }

gfar_clean_rx_ring -->gfar_process_frame

-->初始化了skb->dev,这样在软中断里才能判断这个数据包来自哪里 -->RECEIVE(skb) // 调用netif_rx(skb)

#ifdef CONFIG_GFAR_NAPI

#define RECEIVE(x) netif_receive_skb(x) #else

#define RECEIVE(x) netif_rx(x) #endif

netif_rx(skb) {

queue = &__get_cpu_var(softnet_data);

__skb_queue_tail(&queue->input_pkt_queue, skb); //将skb放到接收队列(在net_dev_init初始化)中 napi_schedule(&queue->backlog); //将cpu私有变量的的napi_struct挂到cpu私有变量的poll_list上 //test_and_set napi_struct.state为 NAPI_STATE_SCHED //触发网络接收软中断 }

软中断net_rx_action中调用poll钩子函数

虽说软中断里也遍历cpu私有变量的poll_list,事实上poll_list现在只挂一个napi_struct结构

即cpu私有变量的backlog成员(它在net_dev_init中初始化),所以现在调用的poll钩子函数就是process_backlog了

static int process_backlog(struct napi_struct *napi, int quota) {

struct softnet_data *queue = &__get_cpu_var(softnet_data); napi->weight = weight_p; do {

struct sk_buff *skb; struct net_device *dev;

local_irq_disable();

skb = __skb_dequeue(&queue->input_pkt_queue); //从接收队列中取出skb, if (!skb) { //这些skb是在netif_rx中进入队列的 __napi_complete(napi); local_irq_enable(); break; }

local_irq_enable(); dev = skb->dev;

netif_receive_skb(skb); //进入协议协议栈 dev_put(dev);

} while (++work < quota && jiffies == start_time); return work; }

网络数据包收发流程(三):e1000网卡和DMA 2011-07-13 13:34:20

分类: LINUX

一、硬件布局

每个网卡(MAC)都有自己的专用DMA Engine,如上图的 TSEC 和 e1000 网卡intel82546。 上图中的红色线就是以太网数据流,DMA与DDR打交道需要其他模块的协助,如TSEC,PCI controller 以太网数据在 TSEC<-->DDR PCI_Controller<-->DDR 之间的流动,CPU的core是不需要介入的 只有在数据流动结束时(接收完、发送完),DMA Engine才会以外部中断的方式告诉CPU的core

二、DMA Engine

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库网络数据包收发流程(一):从驱动到协议栈(3)在线全文阅读。

网络数据包收发流程(一):从驱动到协议栈(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/405115.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: