第一部分 硬件识别包类型

网卡,是可以识别包类型的。在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包的更多相关文章

  1. IDEA 构建为了打 jar 包的工程,包含 maven 打 jar 包的过程

    前言:最近自己写了一个单表查询的组件,包含前端.后台,所以需要向阿里的 druid 一样将所有文件打到一个 jar 包里,这里首先记录如何打 jar 包. 附:自己的一个 jar 包源码 https: ...

  2. dpdk网卡收包分析

    一个网络报文从网卡接收到被应用处理,中间主要需要经历两个阶段: 阶段一:网卡通过其DMA硬件将收到的报文写入到收包队列中(入队)阶段二:应用从收包队列中读取报文(出队)由于目前正在使用vpp/dpdk ...

  3. 网络数据包分析 网卡Offload

    http://blog.nsfocus.net/network-packets-analysis-nic-offload/     对于网络安全来说,网络传输数据包的捕获和分析是个基础工作,绿盟科技研 ...

  4. Vxlan与网卡offload性能

    背景 由于数据链路层MTU的限制,发送端TCP/UDP数据在交付到IP层时需要与MTU相匹配,TCP数据不能超过mss,较长的UDP需要分片(Fragmentation)以满足MTU要求:接收端协议栈 ...

  5. OSPF的特征、术语、包类型、邻居关系的建立、RID的选择、DR和BDR的选举、度量值的计算、默认路由、验证

    链路状态路由协议OSPF的特征.术语.包类型.邻居关系的建立.RID的选择.DR和BDR的选举.度量值的计算.默认路由.验证等. 文章目录 [*1*].链路状态路由协议概述 工作过程 优缺点 [*2* ...

  6. DPDK 网卡绑定和解绑

    参考: DPDK网卡绑定和解绑 DPDK的安装与绑定网卡 DPDK 网卡绑定和解绑 注意: 建议不要使用本文的eth0网卡绑定dpdk驱动. 1.进入DPDK目录: $ cd dpdk/tools/ ...

  7. 除了基本类型,其余类型基本上大部分new出来 java.sql 包下面要不需要new

    除了基本类型,其余类型基本上大部分new出来 java.sql 包下面要不需要new

  8. vulcanjs 包类型

    npm 添加在pacakge.json 文件中的 meteor core 包 由meteor 框架提供的 meteor remote 包 从包服务器加载的,使用username:package 格式组 ...

  9. 如何利用UDP协议封装一个数据包

    在如何封装一个数据包上,是一个非常细致的问题,而利用UDP协议来封装的话,是比较简单,让我们一步步来分析典型的TCP/IP协议.一般来说一个典型的一个数据包,包括以太网MAC头+网络层IP数据头+传输 ...

随机推荐

  1. Asp.Net 合并图片(二维码和其他图片合并)

    需求:根据网址生成二维码,然后再把二维码生成到背景图片上,然后显示在网页中 pic.ashx <%@ WebHandler Language="C#" Class=" ...

  2. Ogre2.1 Hlms与渲染流程

    在我前面三篇说明Ogre2.x的文章里,第一篇大致说了下Hlms,第二篇说了下和OpenGL结合比较紧的渲染,本文用来说下Hlms如何影响渲染流程中,因为有些概念已经在前面二文里说过了,本文就不再提, ...

  3. Linux监控平台介绍 zabbix监控介绍 安装zabbix 忘记Admin密码如何做

  4. Golang中下划线的使用

    https://studygolang.com/articles/17479?fr=sidebar

  5. mybatise插件反向生成数据库表相关Java代码

    1.下载相关jar包https://github.com/mybatis/generator/releases 2.配置xml文件 <?xml version="1.0" e ...

  6. MTK 自定义按键添加广播

    一.给自定义按键添加广播 修改PhoneWindowManager.java中的interceptKeyBeforeDispatching方法 /frameworks/base/policy/src/ ...

  7. iOS - DNS劫持

    ******科普** 1.DNS劫持的危害 不知道大家有没有发现这样一个现象,在打开一些网页的时候会弹出一些与所浏览网页不相关的内容比如这样奇(se)怪(qing)的东西 图一   或者这样 图二   ...

  8. 《转载》spring定时任务详解(@Scheduled注解)

    本文转载自爱如指间沙 //每一个小时执行一次 @Scheduled(cron = "0 0 * * * ?") public void saveDailyScoreSchedule ...

  9. QT textBrowser 使用

    使用环境: VS2010 & QT Designer5 1. 在QT Designer 拖入  textBrowser,点击右键属性获得 name值 2. 在程序使用的地方 加入  ui.te ...

  10. HTML+CSS:圆形和圆角图片格式

    效果展示 实现代码 <!DOCTYPE html> <html> <head> <title>JcMan</title> <style ...