[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数据头+传输 ...
随机推荐
- Summary Checklist for Run-Time Kubernetes Security
Here is a convenient checklist summary of the security protections to review for securing Kubernetes ...
- python学习之struct模块
class struct.Struct(format) 返回一个struct对象(结构体,参考C). 该对象可以根据格式化字符串的格式来读写二进制数据. 第一个参数(格式化字符串)可以指定字节的顺序. ...
- tensorflow笔记9:nn_ops.bias_add 函数
完整代码引入:from tensorflow.python.ops import nn_ops tensorflow version:1.9 代码演示: import os import tensor ...
- java解析Excel(xls、xlsx两种格式)
https://www.cnblogs.com/hhhshct/p/7255915.html ***************************************************** ...
- elk问题,求教各位大虾!
[filebeat --> kafka --> logstash-->MongoDB|磁盘]架构进行日志收集 但是当logstash写入MongoDB有延迟,然后正常之后,会导致lo ...
- net use错误原因解决(精辟)(转)
(1)"发生系统错误 1326. 登录失败: 未知的用户名或错误密码." 在远程机的"控制面板-文件夹选项-查看-简单的文件共享",去掉选取,然后再尝试连接 ...
- CentOS Nginx网站服务器搭建实例
Nginx是一款开源的高性能HTTP服务器和返向代理服务器. 下载.编译.安装模块: [root@localhost nginx-1.4.0]#wget http://nginx.org/ ...
- 年关将至业内警示P2P跑路风险
年关将近,P2P网贷行业的问题平台亦不断增多,“跑路潮”会否再现,业内人士讨论热烈. “从历年数据统计来看,问题平台接近线性向上的增长趋势,即时间越往后,问题平台占比就越高,而每逢年关,问题平台占比都 ...
- post请求参数设置
控制器参数有[FromBody]修饰参数这么传: 控制器没有[FromBody]修饰参数这么传:
- Nginx-配置https虚拟服务(访问http时自动跳转https)
https口令文件和nginx配置文件位置关系: nginx配置文件内容如下: #user nobody; worker_processes 1; #设置工作进程数 pid logs/nginx.pi ...