接续前节:[dpdk] 熟悉SDK与初步使用 (三)(IP Fragmentation源码分析)

前文中的最后一个问题,搁置,并没有找到答案。所以继续阅读其他例子的代码,想必定能在其他位置看到答案。

使用,大致过了一般文档和代码,试运行一下:

绑定2,3,6,7四颗CPU核心。使用port1,port2.

port0/queue0/core2映射在一起。port0/queue1/core3映射在一起。port1/queue0/core6映射在一起。port1/queue1/core7映射在一起。

与前边的例子相同,依然要在代码级关掉 hw_ip_checksum。

[root@dpdk build]# ./l3fwd -l2,,, -- -p  --config "(0,0,2),(0,1,3),(1,0,6),(1,1,7)"
EAL: Detected lcore(s)
EAL: Probing VFIO support...
EAL: WARNING: cpu flags constant_tsc=yes nonstop_tsc=no -> using unreliable clock cycles !
PMD: bnxt_rte_pmd_init() called for (null)
EAL: PCI device ::03.0 on NUMA socket -
EAL: probe driver: 1af4: rte_virtio_pmd
EAL: PCI device ::04.0 on NUMA socket -
EAL: probe driver: 1af4: rte_virtio_pmd
EAL: PCI device ::05.0 on NUMA socket -
EAL: probe driver: 1af4: rte_virtio_pmd
EAL: PCI device ::06.0 on NUMA socket -
EAL: probe driver: 1af4: rte_virtio_pmd
L3FWD: LPM or EM none selected, default LPM on
Initializing port ... Creating queues: nb_rxq= nb_txq=... Address::::::, Destination::::::, Allocated mbuf pool on socket
LPM: Adding route 0x01010100 / ()
LPM: Adding route 0x02010100 / ()
LPM: Adding route IPV6 / ()
LPM: Adding route IPV6 / ()
Allocated mbuf pool on socket
LPM: Adding route 0x01010100 / ()
LPM: Adding route 0x02010100 / ()
LPM: Adding route IPV6 / ()
LPM: Adding route IPV6 / ()
txq=,, txq=,, txq=,, txq=,,
Initializing port ... Creating queues: nb_rxq= nb_txq=... Address::::::, Destination::::::, txq=,, txq=,, txq=,, txq=,, Skipping disabled port Initializing rx queues on lcore ... rxq=,,
Initializing rx queues on lcore ... rxq=,,
Initializing rx queues on lcore ... rxq=,,
Initializing rx queues on lcore ... rxq=,, port cannot parse packet type, please add --parse-ptype
EAL: Error - exiting with code:
Cause: ptype check fails
[root@dpdk build]#

以上出现的ERROR,刚好回答了(三)最后留下的疑问。此程序依然依赖硬件来完成packet type的识别。该参数“--parse-ptype”应该是启用了软件识别类型的功能,如下:

已经可以正常启动了。

[root@dpdk build]# ./l3fwd -l2,,, -- -p  --config "(0,0,2),(0,1,3),(1,0,6),(1,1,7)" --parse-ptype
EAL: Detected lcore(s)
EAL: Probing VFIO support...
EAL: WARNING: cpu flags constant_tsc=yes nonstop_tsc=no -> using unreliable clock cycles !
PMD: bnxt_rte_pmd_init() called for (null)
EAL: PCI device ::03.0 on NUMA socket -
EAL: probe driver: 1af4: rte_virtio_pmd
EAL: PCI device ::04.0 on NUMA socket -
EAL: probe driver: 1af4: rte_virtio_pmd
EAL: PCI device ::05.0 on NUMA socket -
EAL: probe driver: 1af4: rte_virtio_pmd
EAL: PCI device ::06.0 on NUMA socket -
EAL: probe driver: 1af4: rte_virtio_pmd
soft parse-ptype is enabled
L3FWD: LPM or EM none selected, default LPM on
Initializing port ... Creating queues: nb_rxq= nb_txq=... Address::::::, Destination::::::, Allocated mbuf pool on socket
LPM: Adding route 0x01010100 / ()
LPM: Adding route 0x02010100 / ()
LPM: Adding route IPV6 / ()
LPM: Adding route IPV6 / ()
Allocated mbuf pool on socket
LPM: Adding route 0x01010100 / ()
LPM: Adding route 0x02010100 / ()
LPM: Adding route IPV6 / ()
LPM: Adding route IPV6 / ()
txq=,, txq=,, txq=,, txq=,,
Initializing port ... Creating queues: nb_rxq= nb_txq=... Address::::::, Destination::::::, txq=,, txq=,, txq=,, txq=,, Skipping disabled port Initializing rx queues on lcore ... rxq=,,
Initializing rx queues on lcore ... rxq=,,
Initializing rx queues on lcore ... rxq=,,
Initializing rx queues on lcore ... rxq=,, Port : softly parse packet type info
Port : softly parse packet type info
Port : softly parse packet type info
Port : softly parse packet type info Checking link statusdone
Port Link Up - speed Mbps - full-duplex
Port Link Up - speed Mbps - full-duplex
L3FWD: entering main loop on lcore
L3FWD: -- lcoreid= portid= rxqueueid=
L3FWD: entering main loop on lcore
L3FWD: -- lcoreid= portid= rxqueueid=
L3FWD: entering main loop on lcore
L3FWD: -- lcoreid= portid= rxqueueid=
L3FWD: entering main loop on lcore
L3FWD: -- lcoreid= portid= rxqueueid=

接下来通过对代码的阅读调试,印证一下之前的想法。

先来一组测试包:

/home/tong/Data [tong@T7] [:]
> sudo tcpreplay-edit -D 0.0.0.0/:2.1.1.1/ -i tap-dpdk- -t -L oicq-bak.pcap

基于代码里写死的路由规则,必要nat成2.1.1.1才能被转发。

发现了与参数 --parse-ptype 对应的函数:

rte_eth_add_rx_callback(portid, queueid, l3fwd_lkp.cb_parse_ptype, NULL)

此回调函数,设置了IP包的类型。

至此,解答了(三)中留下的问题。

[dpdk] 熟悉SDK与初步使用 (四)(L3 Forwarding源码分析)的更多相关文章

  1. [dpdk] 熟悉SDK与初步使用 (二)(skeleton源码分析)

    接续前节:[dpdk] 熟悉SDK与初步使用 (一)(qemu搭建实验环境) 程序逻辑: 运行参数: 关键API: 入口函数: int rte_eal_init(int argc, char **ar ...

  2. java 日志体系(四)log4j 源码分析

    java 日志体系(四)log4j 源码分析 logback.log4j2.jul 都是在 log4j 的基础上扩展的,其实现的逻辑都差不多,下面以 log4j 为例剖析一下日志框架的基本组件. 一. ...

  3. [dpdk] 熟悉SDK与初步使用 (三)(IP Fragmentation源码分析)

    对例子IP Fragmentation的熟悉,使用,以及源码分析. 功能: 该例子的功能有二: 一: 将IP分片? 二: 根据路由表,做包转发. 路由表如下: IP_FRAG: Socket : ad ...

  4. Java 集合系列(四)—— ListIterator 源码分析

    以脑图的形式来展示Java集合知识,让零碎知识点形成体系 Iterator 对比   Iterator(迭代器)是一种设计模式,是一个对象,用于遍历集合中的所有元素.  Iterator 包含四个方法 ...

  5. 【Java入门提高篇】Day21 Java容器类详解(四)ArrayList源码分析

    今天要介绍的是List接口中最常用的实现类——ArrayList,本篇的源码分析基于JDK8,如果有不一致的地方,可先切换到JDK8后再进行操作. 本篇的内容主要包括这几块: 1.源码结构介绍 2.源 ...

  6. Spring Security(四) —— 核心过滤器源码分析

    摘要: 原创出处 https://www.cnkirito.moe/spring-security-4/ 「老徐」欢迎转载,保留摘要,谢谢! 4 过滤器详解 前面的部分,我们关注了Spring Sec ...

  7. [dpdk] 熟悉SDK与初步使用 (一)(qemu搭建实验环境)

    搭建实验环境: troubleshoot 第一步加载驱动 第二步切换驱动 使用了所有qemu支持的卡 [tong@T7:~/VM/dpdk] % cat start.sh sudo qemu-syst ...

  8. Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析

    经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...

  9. 并发编程(四)—— ThreadLocal源码分析及内存泄露预防

    今天我们一起探讨下ThreadLocal的实现原理和源码分析.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码分析了其实现原理和使用需要注意的地方,最后给出了两 ...

随机推荐

  1. unlink和close关系

    今天看到nginx用文件锁实现互斥的实现方案时,发现,unlink文件后还可需用fd,很是纳闷!于是搜索到此文,并自测了下,涨姿势了~分享给大家~ 原理: 每一个文件,都可以通过一个struct st ...

  2. 日志解析LogParse启动参数配置

    -task task_stat1001to1010.yaml -log log4j_stat1001to1010.xml 用绝对路径

  3. C#的XML序列化及反序列化

    webservice在工作中用到的很多,基本都是以XML格式问通讯内容,其中最关键的就是XML串的序列化及反序列化. XML的运用中有两种信息传递,一种为XML的请求信息,另一种为返回信息,要运用XM ...

  4. nginx.conf配置文件里的upstream加入健康检查

    查看NGINX启用了那些模块: # ./nginx -V Tengine version: Tengine/ (nginx/) built by gcc (Red Hat -) (GCC) TLS S ...

  5. Linux C编程学习之C语言简介---预处理、宏、文件包含……

    C的简介 C语言的结构极其紧凑,C语言是一种模块化的编程语言,整个程序可以分割为几个相对独立的功能模块,模块之间的相互调用和数据传递是非常方便的 C语言的表达能力十分强大.C语言兼顾了高级语言和汇编语 ...

  6. 创建ACCESS数据库,并且创建表和数据。重点:关闭ACCESS数据库引用

    /// <summary> /// 创建ACCESS数据库,并且创建表和数据 /// </summary> /// <param name="dictTable ...

  7. 表单验证——jquery validate使用说明【另一个教程】

    [参考:http://www.tuicool.com/articles/y6fyme] jQuery Validate jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证 ...

  8. 传智播客DotNet面试题

    技术类面试.笔试题汇总(整理者:杨中科,部分内容从互联网中整理而来) 注:标明*的问题属于选择性掌握的内容,能掌握更好,没掌握也没关系. 下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化 ...

  9. pandas 学习(1): pandas 数据结构之Series

    1. Series Series 是一个类数组的数据结构,同时带有标签(lable)或者说索引(index). 1.1 下边生成一个最简单的Series对象,因为没有给Series指定索引,所以此时会 ...

  10. js最佳继承范型

    先回想下怎么给一个类设置属性:1.构造函数 内  通过this2.prototype中的属性两者的区别就是构造函数中的属性是每个实例私有的,而prototype中的属性是所有实例共有的(一般方法和静态 ...