[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数据头+传输 ...
随机推荐
- ajax请求中的6个全局事件
//事件触发顺序ajaxStart,ajaxSend,ajaxSuccess或ajaxError,ajaxComplete,ajaxStop $(document).ajaxStart(functio ...
- Fluent动网格【1】:概述
最近总有小伙伴向我询问Fluent中的动网格问题,因此决定做一期关于Fluent动网格技术的内容. 动网格技术在流体仿真中很特殊,应用也很广.生活中能够碰到形形色色的包含有部件运动的问题,比如说我现在 ...
- Git 移动操作
顾名思义移动(move )操作移动目录或文件从一个位置到另一个.Tom 决定移动到src目录下的源代码.因此,修改后的目录结构看起来会像这样. [tom@CentOS project]$ pwd /h ...
- easyui-combox(tagbox) 多选操作 显示为tagbox
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 【转】彻底搞清C#中cookie的内容
http://blog.163.com/sea_haitao/blog/static/77562162012027111212610/ 花了2天时间,彻底搞清C#中cookie的内容,搞清以下内容将让 ...
- python 模块会导入几次?猴子补丁为什么可以实现?
一共三个文件 a.py内容是 print('被导入') x = 1 b.py内容是 import a a.x = 2 c.py内容是 import a import b print(a.x) 现在运行 ...
- [Python] 03 - Lists, Dictionaries, Tuples, Set
Lists 列表 一.基础知识 定义 >>> sList = list("hello") >>> sList ['h', 'e', 'l', ' ...
- java.util.Queue(队列)的简单使用
import java.util.LinkedList; import java.util.Queue; import org.junit.Before; import org.junit.Test; ...
- 如何在Ubuntu 16.04上安装配置Redis
如何在Ubuntu 16.04上安装配置Redis Redis是一个内存中的键值存储,以其灵活性,性能和广泛的语言支持而闻名.在本指南中,我们将演示如何在Ubuntu 16.04服务器上安装和配置Re ...
- [Linux] 在 Linux CLI 使用 ssh-keygen 生成 RSA 密钥
RSA 是一种公钥加密算法,在 1977 年由麻省理工学院的 Ron Rivest, Adi Shamir, Leonard Adleman 三人一起提出,因此该算法命名以三人姓氏首字母组合而成. S ...