[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:; /**< (Outer) L2 type. */
uint32_t l3_type:; /**< (Outer) L3 type. */
uint32_t l4_type:; /**< (Outer) L4 type. */
uint32_t tun_type:; /**< Tunnel type. */
uint32_t inner_l2_type:; /**< Inner L2 type. */
uint32_t inner_l3_type:; /**< Inner L3 type. */
uint32_t inner_l4_type:; /**< 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 -;
}
所以,在实现这个函数之前,必须要了解硬件的行为模式。
第二部分 硬件的行为是啥样的
一个包来了之后,硬件会为 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 [tong@T7] [:]
> pkgfile vconfig
community/vlan
/home/tong/Data [tong@T7] [:]
> pacman -Ss vlan
community/vlan 1.9-
Virtual LAN configuration utility
/home/tong/Data [tong@T7] [:]
> sudo pacman -S vlan
/home/tong/Data [tong@T7] [:]
> modprobe 8021q
/home/tong/Data [tong@T7] [:]
> sudo vconfig add tap-dpdk-
Added VLAN with VID == to IF -:tap-dpdk-:-
这时候能看见多了一个网卡
/home/tong/Data [tong@T7] [:]
> ip link
: tap-dpdk-: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc mq state UNKNOWN mode DEFAULT group default qlen
link/ether d2:::af:2b: brd ff:ff:ff:ff:ff:ff
: tap-dpdk-1.3@tap-dpdk-: <BROADCAST,MULTICAST> mtu qdisc noop state DOWN mode DEFAULT group default qlen
link/ether d2:::af:2b: 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. 我真是太聪明了,我这都是跟谁学的。。。。。
第四部分 补充
测以上内容,用来两个网卡
::00.0 '82599EB 10-Gigabit SFI/SFP+ Network Connection' drv=igb_uio unused=ixgbe
::00.0 '82583V Gigabit Network Connection' drv=igb_uio unused=e1000e
不用说,82599EB 肯定是支持硬件offload的。82583v 不仅不支持offload,连多队列都不支持。。。。
另:82599EB 配成一个队列的时候,竟然无法收到全部的包,发了51个,只收到30个,另外20个一定是跑去了别的队列??? 咋回事捏???
[daily][dpdk] 网卡offload识别包类型;如何模拟环境构造一个vlan包的更多相关文章
- IDEA 构建为了打 jar 包的工程,包含 maven 打 jar 包的过程
前言:最近自己写了一个单表查询的组件,包含前端.后台,所以需要向阿里的 druid 一样将所有文件打到一个 jar 包里,这里首先记录如何打 jar 包. 附:自己的一个 jar 包源码 https: ...
- dpdk网卡收包分析
一个网络报文从网卡接收到被应用处理,中间主要需要经历两个阶段: 阶段一:网卡通过其DMA硬件将收到的报文写入到收包队列中(入队)阶段二:应用从收包队列中读取报文(出队)由于目前正在使用vpp/dpdk ...
- 网络数据包分析 网卡Offload
http://blog.nsfocus.net/network-packets-analysis-nic-offload/ 对于网络安全来说,网络传输数据包的捕获和分析是个基础工作,绿盟科技研 ...
- Vxlan与网卡offload性能
背景 由于数据链路层MTU的限制,发送端TCP/UDP数据在交付到IP层时需要与MTU相匹配,TCP数据不能超过mss,较长的UDP需要分片(Fragmentation)以满足MTU要求:接收端协议栈 ...
- OSPF的特征、术语、包类型、邻居关系的建立、RID的选择、DR和BDR的选举、度量值的计算、默认路由、验证
链路状态路由协议OSPF的特征.术语.包类型.邻居关系的建立.RID的选择.DR和BDR的选举.度量值的计算.默认路由.验证等. 文章目录 [*1*].链路状态路由协议概述 工作过程 优缺点 [*2* ...
- DPDK 网卡绑定和解绑
参考: DPDK网卡绑定和解绑 DPDK的安装与绑定网卡 DPDK 网卡绑定和解绑 注意: 建议不要使用本文的eth0网卡绑定dpdk驱动. 1.进入DPDK目录: $ cd dpdk/tools/ ...
- 除了基本类型,其余类型基本上大部分new出来 java.sql 包下面要不需要new
除了基本类型,其余类型基本上大部分new出来 java.sql 包下面要不需要new
- vulcanjs 包类型
npm 添加在pacakge.json 文件中的 meteor core 包 由meteor 框架提供的 meteor remote 包 从包服务器加载的,使用username:package 格式组 ...
- 如何利用UDP协议封装一个数据包
在如何封装一个数据包上,是一个非常细致的问题,而利用UDP协议来封装的话,是比较简单,让我们一步步来分析典型的TCP/IP协议.一般来说一个典型的一个数据包,包括以太网MAC头+网络层IP数据头+传输 ...
随机推荐
- JAVA(四)类集/枚举
成鹏致远 | lcw.cnblog.com |2014-02-04 JAVA类集 1.认识类集 类集的作用 类集实际上就是一个动态的对象数组,与一般的对象数组不同,类集中的对象内容可以任意扩充 类集的 ...
- LeetCode: Permutation Sequence 解题报告
Permutation Sequence https://oj.leetcode.com/problems/permutation-sequence/ The set [1,2,3,…,n] cont ...
- Oracle---常用SQL语法和数据对象
1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, ……) VALUES ( 值1, 值2, ……); INSERT INTO 表名(字段名1, 字 ...
- 【iCore4 双核心板_FPGA】例程五:基础逻辑门实验——逻辑门使用
实验现象: 打开tool-->Netlist viewer-->RTL viewer可观察各个逻辑连接 核心代码: //--------------------module_logic_g ...
- 关于Stm32定时器+ADC+DMA进行AD采样的实现
Stm32的ADC有DMA功能这都毋庸置疑,也是我们用的最多的!然而,如果我们要对一个信号(比如脉搏信号)进行定时采样(也就是隔一段时间,比如说2ms),有三种方法: 1.使用定时器中断每隔一定时间进 ...
- java反编译工具(Java Decompiler)
1,下载地址,包括GUI,Eclipse插件 http://jd.benow.ca/ 2,Eclipse插件的安装参看 https://blog.csdn.net/yh_zeng2/article/d ...
- java 注解默认值
package com.zejian.annotationdemo; import java.lang.annotation.ElementType; import java.lang.annotat ...
- 解决pymongo里操作IOSDate类型的问题
pymongo是Python对MongoDB的操作库.但是由于python没有IOSDate类型,所以对Mongo的时间类型是个很麻烦的操作.整理一个把python能识别的date类型转化为IOSDa ...
- Java知多少(31)static关键字以及Java静态变量和静态方法
static 修饰符能够与变量.方法一起使用,表示是“静态”的. 静态变量和静态方法能够通过类名来访问,不需要创建一个类的对象来访问该类的静态成员,所以static修饰的成员又称作类变量和类方法.静态 ...
- Ubuntu下Apache虚拟主机+反向代理
反向代理 就是通过一台代理服务器,让Internet用户可以访问到内部网络上的服务器 下图中192.168.0.4 可以理解带有2个网卡,一个是公网ip,一个是192.168.0.4 代理内外中的2个 ...