
VPP+DPDK
文章平均质量分 69
很多代码的解读都移步到了微信公众号。请扫描配图关注。
轻飘风扬
有较强的团队合作精神,学习能力较强,善于学习新技术,为人乐观积极做事有耐心,能够在较强的压力下工作,有较强的适应能力,真诚温和,做事踏实,有较强的动手能力
展开
-
learning:vppsb router插件编译
前面文章中介绍了一篇博客:Learning VPP: OSPF routing protocol,文章中介绍使用VPPsb的router插件,它实现了将控制报文推到Linux网络堆栈的逻辑,以及一个基于netlink的机制,它将Linux的路由表同步到VPP的FIB中。本文主要尝试vppsb router查询在最新vpp21.06版本编译。并配置简单的ping业务正常。基本逻辑可以查询vpp官方指导文档:https://wiki.fd.io/view/VPP_Sandbox/router。源码解读后续有原创 2021-05-16 22:00:36 · 2852 阅读 · 0 评论 -
DPDK -20.5遇到的一些问题总结
源码下载及编译 dpdk 最新代码下载,可以再码云平台创建clone一个dpdk的项目,从码云平台上下载代码速度比较块,能达到2Mbps,直接从github上下载不是一个数量级。git clone https://gitee.com/jinshaohui/dpdk.git编译可以直接参照dpdk上的文档,目前是使用meson & ninja来进行源码编译,旧的编译方式也适用。首先需要安装工具meson,环境是是centos 7.5版本,需要更新成阿里源才能安装成功。[root@loca原创 2020-07-24 10:19:08 · 3622 阅读 · 8 评论 -
DPDK网卡设备加载流程
bus总线网卡设备扫描函数在目录dpdk/lib/librte_eal/common/eal_common_bus.cbus scan提供的主接口,内部会调用所有bus->scan。接口的目的是扫描所有bus下注册的设备。bus设备注册dpdk/lib/librte_eal/include/rte_bus.h是由宏RTE_REGISTER_BUS,在程序启动时完成的注册,目前查询宏使用的地方如下。/** * Helper for Bus registration. * The cons原创 2020-07-12 15:31:23 · 3476 阅读 · 1 评论 -
DPDK 内存管理---malloc_heap和malloc_elem
博文是基于dpdk20.5代码阅读所写,如理解有错误或不当之处,烦请指正,不甚感激。也可以私信我一起探讨。两种数据结构体介绍Malloc 库内部使用了两种数据结构类型(可以参考dpdk官方文档3.4.4章节介绍):struct malloc_heap:用于在每个 CPU Socket 上跟踪和管理可用内存空间。struct malloc_elem:Malloc 库内部用于追踪分配和释放空间的基本要素。基本内存分布结构说明malloc_elem介绍elem是heap管理内存的基本单元,内原创 2020-07-11 16:05:26 · 2084 阅读 · 2 评论 -
QOS相关基础知识总结
QOS基本概念三种令牌桶模式的区别和应用场景由前文描述可以看出,三种令牌桶模式之间既有区别也有演进关系,具体见下表。基于上述三种令牌桶模式之间的区别,其功能和使用场景也有所不同,具体见下表。参数设置有讲究在令牌桶算法中,CIR的值越大,即令牌产生的速率越大,报文可以获取的令牌就越多,流向网络的流量也就越大。因此,CIR的值是控制流入网络中流量多少的关键。CBS也是一个重要参数。CBS的值越大,C桶中可以积累令牌的数目也越多,允许通过的报文尺寸就越大。由于设备进行的是逐包转发,CBS的值不应原创 2020-07-09 12:23:28 · 4544 阅读 · 0 评论 -
vpp源码阅读---node节点调度总结
调度类型总结调度方式总结个人理解:从代码上来看只有Input类型的node节点注册的时候state设置成中断方式,才会出现中断和轮训的切换,默认全是轮询方式。PRE_INPUT类型node只能按照轮询当时来调度。设置成state为中断也是一样的。中断方式和轮询方式之间切换。模式切换依据累计报文数量,在vlib_main_or_worker_loop启动中设置。PRE_INPUT和INPUT类型调度Pre_input类型只能在main线程上被调度,一般为Process类型提供输入。in原创 2020-05-17 10:44:19 · 6578 阅读 · 1 评论 -
DPDK-vpp 一次mbuf地址被踩的定位思路
上个月解决了一个mbuf地址异常导致程序coredump的问题,问题定位前后花了将近一个月的时间,期间也是一点定位思路都没有,写这篇文章希望有同样问题的提供一种解决思路。问题背景在业务转发流程中vpp 发包模块mtu 9000字节,多mbuf单链表串联场景下,其中一个mbuf的next地址是非法地址,从而导致程序coredump异常。异常调用栈分析 分析过程发现发包mubuf数组中tx_pkts[-1]的next是非法地址导致程序异常。通过vlib_buf的next_buffer反推下一个mbu原创 2020-05-13 10:39:34 · 2548 阅读 · 0 评论 -
VPP源码阅读----vppinfra 结构说明
vppinfra 相关结构学习相关视频地址可以在B站上搜索的,但是ppt暂时没有找到,自己的阅读截图说明了。vetvec结构是最基础的类型,图片的右下角的大字比较醒目,也是初学者很容易犯的错误:Allocation only increases,Vector origin pointer may changer,store indexes(not pointers)!vector 原始指针可能会改变,存储索引而不是指针。这种说法成立的前提是vector操作中不调用vec_del函数,否则也不能原创 2020-05-08 21:52:54 · 2018 阅读 · 0 评论 -
dpdk查寻是否支持此网卡
[jinsh@localhost dpdk-19.11]$ lspci -nn | grep Ethernet07:00.0 Ethernet controller [0200]: Intel Corporation I210 Gigabit Network Connection [8086:1533] (rev 03)08:00.0 Ethernet controller [0200]: I...原创 2020-05-05 22:09:49 · 4318 阅读 · 0 评论 -
Vpp源码解读--workhandoff处理
1、node节点handoff功能1.1、申请node节点对应vlib_frame_queue_main_t结构我们可以阅读以下函数ip4_sv_reass_init_function完成IP报文假重组功能中handoff使用u32 vlib_frame_queue_main_init (u32 node_index, u32 frame_queue_nelts)下面是对应结构体描述:...原创 2020-05-01 23:37:49 · 2882 阅读 · 0 评论 -
VPP源码阅读---IP报文重组和分片
1、dpdk ip报文重组相关数据接口及API1.1相关数据结构1.2 相关API/*NO.1 创建rte_ip_frag_tbl结构,用来暂存分片的表。其中max_cycles表示分片报文超时时间TTL *frag_cycle = (rte_get_tsc_hz()) + MS_PER_S –1) / MS_PER_S * 10; *是10ms的cycle的一个例子。 */str...原创 2020-04-25 17:14:31 · 4756 阅读 · 5 评论 -
VPP源码阅读-------copy、clone、recycle机制对比分析
原创 2020-03-17 09:34:55 · 868 阅读 · 2 评论 -
DPDK源码解读-------ring结构体
RTE RING结构体内存挂接挂接在全局rte_ring_tailq尾队列链表上ring_list = RTE_TAILQ_CAST(rte_ring_tailq.head, rte_ring_list);下面是相关的结构体声明及定义/*尾队列表头TAILQ_HEAD 宏定义*/#define TAILQ_HEAD(name, type) \ struct name { \...原创 2020-03-14 13:26:33 · 1747 阅读 · 0 评论 -
VPP源码-----mempool池创建解读
dpdk_buffer_pool_init函数处理逻辑如下:目前阅读最新的vpp(20-1)代码,报文存储区域rte_mbuf已经不再通过DPDK结构来申请了,目前是在vpp自己管理的物理内存上直接申请而来,下面是dpdk_buffer_pool_init的处理逻辑:rte_mempool相关结构体参数注解rte_mempool 相关内存的分布mempoll管理节点的内存分布将当前...原创 2020-03-11 17:25:13 · 1984 阅读 · 1 评论 -
libevent源码–TAILQ队列,
TAILQ 队列结构图其中tqh_first 指向队列的第一个结点tqh_last 指向队列的最后一个结点的 tqe_next 字段tqe_next 指向该结点的下一个结点tqe_prev 指向该结点的上一个结点的 tqe_next 字段根据结构图,TAILQ 队列为双向循环链表源码// 定义队列的头结点结构体的宏#define TAILQ_HEAD(name, type) ...转载 2020-03-10 14:16:20 · 563 阅读 · 1 评论 -
VPP源码----mheap结构学习
1、系统malloc和mmap对比malloc使用brk分配的内存,需要等到高地址内存释放以后才能释放,申请大内存(大于128k)时候使用的是mmap系统调用;mmap系统调用是在堆和栈之间分配一块内存,这块内存可以单独释放,不会造成内存“空洞”,也不会影响到堆顶内存的缩减释放。mmap的缺点是按需调页:一页大小4k bytes,如果需要的内存很小,会造成内存浪费;频繁的mmap、munma...原创 2020-03-04 11:09:12 · 1661 阅读 · 0 评论 -
ipv4、ipv6编址
ipv4地址IPv4地址分类及特征IP地址按作用范围可分成两类,一类是在大网使用的公共IP地址,另一类是只在内网使用的私有地址。IP按用途可分五大类:A类(政府)、B类(公司)、C类(公用)、D类(组播)和E类(实验),地址格式为网络地址+主机地址或网络地址+子网地址+主机地址形式。 它们之间的区别和特征如下表所示:此外还有几个特殊IP地址:1、0.0.0.0只能做源地址2、255....原创 2020-02-06 17:02:46 · 1121 阅读 · 0 评论 -
DPDK指南--编写高效的代码
简介本章提供了使用DPDK开发高效代码的一些技巧。有关更多的信息,请参考Intel®64和IA-32架构优化参考手册,这是编写高效代码的宝贵参考资料。1、内存 本节描述在DPDK环境中开发应用程序时的一些关键内存注意事项。1.1内存拷贝:不要在数据平面中使用libc在DPDK中可以通过Linux*应用程序环境获得许多libc函数。这可以简化应用程序的移植和配置平面的开发。然而,这些功...原创 2019-11-18 16:43:20 · 3412 阅读 · 0 评论 -
Vpp源码---hash mhash结构学习
Hash 结构哈希表默认是支持动态扩容的,即当哈希表存放键值对大于3/4哈希桶的个数时,会2倍扩容。哈希冲突时,vector长度认为是没有限制的。hash结构内存分布及结构体描述哈希结构内存分布如下图所示:hash冲突时是如何解决的哈希冲突解决分2中情况(具体代码在lookup()函数中):1、key和vlaue都保存时hash结构体中log2_pair_size不等于 0是,存...原创 2019-11-18 09:45:20 · 3232 阅读 · 0 评论 -
内存屏障和编译屏障的理解
在vpp和dpdk的编码经常遇到有内存屏障和编译屏障的地方,使用内存屏障会远远降低执行性能,实测大概有10%左右的性能损耗,在多核竞争下更加劣化。下面文章有详细的介绍:个人认为内存屏障是解决的时候多CPU下问题,而编译屏障是为了防止cpu优化。https://www.cnblogs.com/straybirds/p/8856726.html...转载 2019-11-15 10:28:08 · 1326 阅读 · 0 评论 -
vpp--arc_feature学习以ipv4单播为例
1、feature arc及feature注册 vnet\ipIp4_forward.c feature arc及feature的main函数启动前的注册宏feature arc注册 VNET_FEATURE_ARC_INIT将注册feature arc,主要初始化feature类的名称、起始及结束node名字及arc_index的指针。会以链表形式挂接到全局变...原创 2019-11-12 09:38:38 · 2938 阅读 · 0 评论 -
VPP 创建自己的work线程
1 创建自己的核绑定线程1.1 线程启动流程以worker线程为例,介绍线程启动流程:1.1.1 线程注册:VLIB_REGISTER_THREAD线程注册宏注册到全局 vlib_thread_main_tvlib_thread_main->next链表上。typedef struct vlib_thread_registration_ { /* constructor g...原创 2019-11-07 13:05:29 · 3431 阅读 · 1 评论 -
DPDK&VPP关键技术文档总结。
1、DPDK 流量管理API使用指南–TM2、为不同的Intel平台交叉编译DPDK;链接二3、DPDK数据包捕获框架4、DPDK中的memcpy性能优化及思考原创 2019-09-21 10:07:19 · 9406 阅读 · 1 评论 -
VPP和Linux内核协议栈通信的方法
背景介绍基于VPP开发一款网络设备,除使用VPP框架实现端口数据报文转发外,还需要对设备进行配置和管理,比较常用的是要实现ssh、web等相关服务,另外,由于VPP并未实现dhcp server的功能,控制面可能还需移植isc-dhcp类似的dhcp server。相关的用户态程序是基于Linux内核的socket来收发包的,因此,需要实现VPP和Linux内核协议栈通信的方法,可以将访问控制面...转载 2019-05-18 15:13:15 · 4173 阅读 · 0 评论 -
Centos7 安装Vpp 及一些学习资料。
首先VMware虚拟机按照Centos7以上版本,以下是遇到的一些问题和安装桌面版本。1、从centos官网下载DVD安装包https://www.centos.org/download/2、虚拟机按照Centos7–这个比较简单就不说了。3、安装完后发现无网络和yum update都会报错,参考下面链接设置后,yum update就可以使用了。https://www.cnblogs.c...原创 2018-12-02 14:30:17 · 4003 阅读 · 0 评论 -
Vpp源码分析之 vec_len 宏的理解
在VPP代码中我们经常遇到地方使用vec_len的宏,但是不确定为什么就可以这样使用。自己在环境上调试了一下,就理解了。/************************************************************************* > File Name: test.c > Author: jinshaohui > Mail: ...原创 2018-11-20 20:00:37 · 1819 阅读 · 2 评论