[daily][dpdk] 网卡offload识别包类型;如何模拟环境构造一个vlan包

第一部分 硬件识别包类型

网卡,是可以识别包类型的。在dpdk的API中。识别完之后,存在这个结构里:

struct rte_mbuf {
......
        union {
                uint32_t packet_type; /**< L2/L3/L4 and tunnel information. */
                struct {
                        uint32_t l2_type:4; /**< (Outer) L2 type. */
                        uint32_t l3_type:4; /**< (Outer) L3 type. */
                        uint32_t l4_type:4; /**< (Outer) L4 type. */
                        uint32_t tun_type:4; /**< Tunnel type. */
                        uint32_t inner_l2_type:4; /**< Inner L2 type. */
                        uint32_t inner_l3_type:4; /**< Inner L3 type. */
                        uint32_t inner_l4_type:4; /**< Inner L4 type. */
                };
        };
... ...
}

这非常厉害,利用硬件能力;但是遗憾的是,有一些硬件并不能这么干,因为他们比较low,然后我们就需要软件实现。参考例子l3fwd,加一个回调替代硬件功能,提高兼容性:

static uint16_t callback(uint8_t port, uint16_t queue, struct rte_mbuf *pkts[],
                        uint16_t nb_pkts, uint16_t max_pkts, void *user_param)
{
}   

                void* cb_handler;
                cb_handler = rte_eth_add_rx_callback(port_id, i,
                        callback, NULL);
                if (!cb_handler) {
                        perror("rte_eth_add_rx_callback: ");
                        return -1;
                }       

所以,在实现这个函数之前,必须要了解硬件的行为模式。

第二部分 硬件的行为是啥样的

一个包来了之后,硬件会为 l2_type l3_type l4_type 赋值,值都是宏,见源码。如果是tunnel或者IP in IP等,也有相应的值变量可以付。但是我比较关系vlan。

而且发现,在 l2_type 定义的值之中,并没有VLAN存在。然后我构建了一组vlan包(见下一节)来实验,发现vlan包也能被正确识别到各层协议,那么它如何将这个一个

vlan包的信息传递出来呢?经过测试,发现用到了下面这个变量:

/**
 * The generic rte_mbuf, containing a packet mbuf.
 */
struct rte_mbuf {
        uint64_t ol_flags;        /**< Offload features. */                     

}

如果是vlan包,会设置标记:

/**
 * RX packet is a 802.1q VLAN packet. This flag was set by PMDs when
 * the packet is recognized as a VLAN, but the behavior between PMDs
 * was not the same. This flag is kept for some time to avoid breaking
 * applications and should be replaced by PKT_RX_VLAN_STRIPPED.
 */
#define PKT_RX_VLAN_PKT      (1ULL << 0)
                           

至此,硬件行为基本清晰,已经基本满足我当前的需求,可以进行软件模拟了。

第三部分 构造一个VLAN包

做前文的实验中,为了验证硬件行为,需要自行构建vlan包。是这么干的。

1. 开一个虚拟机。单独建立一个网卡,与本地tap设备链接。

2. 在两端安装vconfig工具,并加载 8021q 内核模块,使用vconfig工具网卡增加一个虚拟的vlan网卡。

/home/tong/Data [[email protected]] [14:38]
> pkgfile vconfig
community/vlan
/home/tong/Data [[email protected]] [14:38]
> pacman -Ss vlan
community/vlan 1.9-4
    Virtual LAN configuration utility
/home/tong/Data [[email protected]] [14:38]
> sudo pacman -S vlan
/home/tong/Data [[email protected]] [14:40]
> modprobe 8021q
/home/tong/Data [[email protected]] [14:48]
> sudo vconfig add tap-dpdk-1 3
Added VLAN with VID == 3 to IF -:tap-dpdk-1:-

这时候能看见多了一个网卡

/home/tong/Data [[email protected]] [14:49]
> ip link
21: tap-dpdk-1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UNKNOWN mode DEFAULT group default qlen 1000
    link/ether d2:75:44:af:2b:20 brd ff:ff:ff:ff:ff:ff
25: tap-dpdk-1.3@tap-dpdk-1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether d2:75:44:af:2b:20 brd ff:ff:ff:ff:ff:ff

3. 在虚拟机里同样操作,设成同样的vlan id = 3 ,也是会有两个网卡 eth1 和 eth1.3

4. 在host主机上,给 tap-dpdk-1.3 发包。 在 guest 主机上,eth1和eth1.3上,都会看见发来的包,区别是,eth1.3看见的包已经去除了vlan,而eth1上的包是带着vlan的。

所以,抓eth1,就把带着vlan的pcap,抓出来了。。。。

5. 我真是太聪明了,我这都是跟谁学的。。。。。

第四部分 补充

测以上内容,用来两个网卡

0000:03:00.0 ‘82599EB 10-Gigabit SFI/SFP+ Network Connection‘ drv=igb_uio unused=ixgbe
0000:09:00.0 ‘82583V Gigabit Network Connection‘ drv=igb_uio unused=e1000e

不用说,82599EB 肯定是支持硬件offload的。82583v 不仅不支持offload,连多队列都不支持。。。。

另:82599EB 配成一个队列的时候,竟然无法收到全部的包,发了51个,只收到30个,另外20个一定是跑去了别的队列??? 咋回事捏???

时间: 2024-10-13 03:14:14

[daily][dpdk] 网卡offload识别包类型;如何模拟环境构造一个vlan包的相关文章

网络数据包分析 网卡Offload

http://blog.nsfocus.net/network-packets-analysis-nic-offload/ 对于网络安全来说,网络传输数据包的捕获和分析是个基础工作,绿盟科技研究员在日常工作中,经常会捕获到一些大小远大于MTU值的数据包,经过分析这些大包的特性,发现和网卡的offload特性有关,本文对网卡Offload技术做简要描述. 文章目录 网络分片技术 网卡offload机制 发送模式 接收模式 网卡offload模式的设置 Linux windows 网卡Offload

Vxlan与网卡offload性能

背景 由于数据链路层MTU的限制,发送端TCP/UDP数据在交付到IP层时需要与MTU相匹配,TCP数据不能超过mss,较长的UDP需要分片(Fragmentation)以满足MTU要求:接收端协议栈也是从网卡接收上述不超过MTU的小帧并重组,早期上述数据分片和组合的工作均由CPU完成,导致占用CPU资源且效率不高. offload 是将本来该操作系统进行的一些数据包处理(如分片.重组等)放到网卡硬件中去做,降低系统 CPU 消耗的同时提高处理的性能. 解释 发送模式 TSO (tcp-segm

AR8161网卡无法识别

[背景] 最近需要部署一个cobbler的环境,专门弄来一台pc主机,装上CentOS6.5,启动时发现: 1.找不到/etc/sysconfig/network这个文件 2.ifconfig -a 看不到网卡设备(除了lo) [分析] 这是由于这个台式机的网卡没有被识别,我们要做的是先找出这个网卡的型号,然后,下载这个网卡的驱动,然后,将这个驱动装上,问题就能被解决了. [方案] 1.使用下面的命令,查出这台机子的网卡型号(AR8161)     [[email protected] ~]# 

保留包类型(NetworkComms 2.3.1源码了解和学习)

networkComms.net2.3.1开源版本,基于gpl V3协议.因为不能公开3.x版本的源码,所以基于此版本进行学习.3.X版本进行了诸多改进和Bug修复,使用方法上两者相差不大. /*请注意使用以下代码,需遵循GplV3协议*/ /// 保留包类型 消息确认.检验和失败重发.心跳检测.连接建立 /// </summary> enum ReservedPacketType { Confirmation, CheckSumFailResend, AliveTestPacket, Con

解决部分android手机自带浏览器下载 apk 文件的时候提示无法识别该类型的文件

android 有些较为早期的手机自带的浏览器可能会出现无法识别 apk 类型的文件,因此在文件服务器端需要做以下的调整: 解决一: 在IIS服务器上,MIME类型中添加一个: 文件扩展名: .apk MIME类型: application/vnd.android.package-archive 解决二: 服务端部署在tomcat下,已经在tomcat的web.xml里面配置了mini type <mime-mapping> <extension>apk</extension

ospf的5种数据包类型

OSPF的数据包格式: 根据OSPF数据包type字段数值的不同,OSPF数据包类型分为5种,不同的type,其后面的内容也不同. 路由表的形成与这5种数据包的交互息息相关. type=1    hello数据包 type=2    数据库描述包--DBD type=3    链路状态请求包---LSR type=4    链路状态更新包---LSU type=5    链路状态确认包---LSAck 1.hello包-----周期10s 编号为1的OSPF数据包 功能:用于发现,和维持邻居关系

一个TCP包中的数据数据问题

一个TCP包中最大的数据 2008-03-10 18:54 在以太网中,最大传输单元MTU为1500个字节,在一个IP包中,去除IP包头的20个字节,可以传输的最大数据长度为1480个字节.在TCP包中,去除20个TCP包头,可以传输的最大数据段为1460个字节.因此,当数据超过最大数据长度时,将对该数据进行分片处理,在IP包头中会看到有多个片在传输,但标识号是相同的,表示是同一个数据包. 在IP层中本来有一个用来标识IP包总长度的字段,为16bit,即65536字节.但实际上在不同的网络协议中

ping不通,找房东-----从一个ping包来解析网络转发原理

"房东,我ping不通了",相信在外打工租房的各位都有过这个经历吧.ping不通,一个简单的现象,其实蕴藏着很多的过程,今天我们就来谈谈,ping不通该怎么办. 在说这些之前,先介绍几个概念:1.ping包ping包走的是ICMP协议,什么是ICMP协议呢,Internet控制报文协议,字面意思不好理解,作用很简单,就是发送一些控制消息,来检测链路. 要了解一个协议,我们一般先看它是怎么封装的,查什么书籍都是假的,最好的办法就是自己去抓一个包看看,抓包的工具有很多种,我喜欢用wires

抓包工具 - Fiddler(如何捕获Android数据包)

如何捕获Android数据包 一.移动设备访问网络原理 先看看移动设备是怎么去访问网络,如图1所示,可以看到,移动端的数据包是从wifi出去的. 图1(移动设备访问网络) 所以我们可以把自己的电脑开启热点,将手机连上电脑,本机的Fiddler开启代理后,让这些数据通过Fiddler,那Fiddler就可以抓到这些包,然后发给路由器,如图2所示 图2(设置) 二.Fiddler抓取android数据包所需条件 1.电脑需要安装Fiddler 2.测试手机需要支持Wifi 3.测试手机与电脑需要同一