分析skb和网卡驱动的关系

转载 2013年12月06日 10:07:20

网卡驱动所能看到的仅仅是MAC帧,MAC帧独立于任何上层协议,仅仅属于数据链路层。

以太网为例,DM9000作为设备。

*******************************************************************

1.发送的skb是什么样?(内核决定)

发送的MAC帧格式:
   PR| SD    | DA |SA |TYPE | IP packet | FCS
红色的内容,是驱动程序需要提供的MAC帧内容,黑色的部分由DM9000网卡自动填充进去。
DM9000的发送函数:
dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev)
skb->data的缓冲区内容正是:00 00 | DA |SA |TYPE | IP packet |
因此,只需将skb->data内容拷贝到DM9000的发送缓冲区即可。DM9000构造出完整的
PR| SD    | DA |SA |TYPE | IP packet | FCS

MAC帧,发送到物理线路上。

*******************************************************************

2.接收的skb如何?(DM9000决定)

DM9000从物理线路上接收到的是标准的MAC帧,和发送一致:
PR| SD    | DA |SA |TYPE | IP packet | FCS
然而,DM9000的接收缓冲区却没有把MAC帧全部保存进来。
DM9000接收缓冲的内容是:
01|status| byte count low | byte count high    | DA |SA |TYPE | IP packet | FCS
绿色部分,是DM9000自动产生,不是从线路接收到的。后面的非绿色则是从线路接收到的。
如何从接收缓冲区构造出需要的skb呢?其实就是创建skb->data:
| DA |SA |TYPE | IP packet |
RxLen 的长度=| DA |SA |TYPE | IP packet | FCS
dev_alloc_skb(RxLen + 4)
分配的skb空间可以保存 01|status| byte count low | byte count high   | DA |SA |TYPE | IP packet | FCS
事实上多出的4字节没有保存蓝色的信息,蓝色信息对于skb没有意义。
skb_reserve(skb, 2);
skb->data的前面保留2字节,为了对齐用。| DA |SA |TYPE =14 bytes   IP packet是16 byte对齐的!
实际接收到的数据包有效长度RxLen - 4,即红色部分| DA |SA |TYPE | IP packet | FCS,去掉FCS的4字节
rdptr = (u8 *) skb_put(skb, RxLen - 4);
思考题:
DM9000从物理线路上收到的字节数是RxLen还是RxLen-4呢?
程序中是db->stats.rx_bytes += RxLen;将FCS也包含进来。
============================
skb = dev_alloc_skb(RxLen + 4)) != NULL)) {
    skb_reserve(skb, 2);
    rdptr = (u8 *) skb_put(skb, RxLen - 4);
    /* Read received packet from RX SRAM */
   (db->inblk)(db->io_data, rdptr, RxLen);
    db->stats.rx_bytes += RxLen;
    /* Pass to upper layer */
    skb->protocol = eth_type_trans(skb, dev);
    netif_rx(skb);
最后构造的skb内存分布(蓝色部分就是skb->data,我们所需要提供给上层的)
head 保留区(16字节对齐的) 长度未知
data 保留区 2字节
  | DA |SA |TYPE | 14字节
  IP packet 16字节对齐的
tail FCS 4字节
end 未用区 2字节
*******************************************************************

3.总结

通过前面的介绍,应该明白驱动中发送接收时使用的skb内容是什么,以及如何根据设备特性构造skb

分析skb和网卡驱动的关系

分析skb和网卡驱动的关系 来源: ChinaUnix博客  日期: 2007.09.23 11:14 (共有条评论) 我要评论   ...
  • win2domain
  • win2domain
  • 2014年08月21日 13:47
  • 185

SKB包的接收,从网卡驱动到TCP层的处理流程

在开发模块过程中,遇到一个问题:在NF_INET_LOCAL_IN钩子处截获数据包后,如果操作失败,还要把这些截获的数据包重新传递到TCP层处理。但是这个操作是在内核线程中完成,不知道会不会对正常的数...
  • cupidove
  • cupidove
  • 2014年12月18日 11:21
  • 2620

linux网卡驱动源码分析

转自http://blog.csdn.net/ustc_dylan/article/details/6329375 网络驱动是一种典型的PCI设备驱动,无论在嵌入式平台还是在PC领域,网络相...
  • yuan1164345228
  • yuan1164345228
  • 2014年01月10日 11:26
  • 2252

深入理解Linux网络技术内幕——中断与网络驱动程序

接收到帧时通知驱动程序     在网络环境中,设备(网卡)接收到一个数据帧时,需要通知驱动程序进行处理。有一下几种通知机制: 轮询:     内核不断检查设备是否有话要说。(比较耗资源,但在一些...
  • Windeal
  • Windeal
  • 2015年03月19日 14:12
  • 1947

网卡驱动的数据包发送接收

我们在许多网卡驱动中,都可以在网卡的中断函数中见到这一过程。 但是,这一种方法,有一种重要的问题,就是大流量的数据来到,网卡会产生大量的中断,内核在中断上下文中,会浪费大量的资源来处理中断本身。...
  • tangtang_yue
  • tangtang_yue
  • 2016年02月04日 16:24
  • 392

网卡驱动流程分析

1.网卡驱动架构分析 1.1linux网络子系统 1.2.重要数据结构 1.3.网卡驱动架构分析1.1linux网络子系统linux网络子系统可以分为System call interface(...
  • cmh477660693
  • cmh477660693
  • 2016年10月03日 14:17
  • 1122

e1000e网卡驱动分析—网卡驱动的体系结构

在硬件上电初始化时,BIOS统一检查所有的PCI设备,并为每个设备分配一个物理地址,该地址通过BIOS获得并写到设备的配置空间内,CPU不能直接访问,驱动程序可以将这部分配置空间通过ioremap映射...
  • badu_123
  • badu_123
  • 2013年03月02日 18:27
  • 3377

intel万兆网卡驱动简要分析

原创文章,转载请注明: 转载自pagefault 本文链接地址: intel万兆网卡驱动简要分析 这里分析的驱动代码是给予linux kernel 3.4.4 对应的文件在dri...
  • u012275397
  • u012275397
  • 2015年01月10日 20:23
  • 2186

Linux-千兆网卡驱动实现机制浅析

网卡作为一个PCI设备,其必须遵守相应的PCI规范,即必须为网卡定义相应的标识号,每个PCI外设由一个总线编号、一个设备编号及一个功能编号来标识。网卡驱动程序则需要定义相应的pci_device_id...
  • u010069189
  • u010069189
  • 2016年09月21日 17:36
  • 663

网卡驱动程序igb ixgbe 介绍

igb igb 驱动程序支持所有基于 82575,82576,82580 和 I350 的千兆位网络连接。 使用 igb 基础驱动程序 下载 igb 概述 构建和安装 有关驱动程序配置的更多...
  • wangcg123
  • wangcg123
  • 2017年07月04日 14:09
  • 872
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:分析skb和网卡驱动的关系
举报原因:
原因补充:

(最多只允许输入30个字)