VPP
文章平均质量分 58
redwingz
这个作者很懒,什么都没留下…
展开
-
VPP FIB路径链表环路检查
在添加新的路径时需要进行路径环路检查。函数fib_path_list_recursive_loop_detect会被反复调用。原创 2024-05-26 21:13:35 · 409 阅读 · 0 评论 -
libnl-3.6.0库问题
在函数parse_multipath中,使用_nl_auto_rtnl_nexthop宏修饰了变量nh,导致nh的作用范围结束时,其被释放。其中fcn函数由宏定义_NL_AUTO_DEFINE_FCN_TYPED0确定,函数名为_nl_auto_rtnl_nexthop_fcn,函数体判断rtnl_nexthop类型变量是否有值,调用函数rtnl_route_nh_free将其空间释放。宏定义_nl_steal_pointer的参数pp为nh的地址,以下将nh的值赋给了_p,作为宏的返回值,继续使用。原创 2024-05-18 22:16:42 · 181 阅读 · 0 评论 -
VPP IPv6-IPSec手动隧道保护IPv4流量
手动创建IPv6 IPSec隧道,参见FDIO官方文档:https://wiki.fd.io/view/VPP/IPSec_and_IKEv2, 以下做了修改以便在一台ubuntu设备上运行,以及修复一些测试中的问题和命令修正。以下命令配置网络拓扑中的veth接口对,以及创建两个网络命名空间clientns和serverns。配置两个网络命名空间中的接口IP地址和路由。原创 2024-04-28 21:18:02 · 768 阅读 · 0 评论 -
VPP IKEv2隧道示例
在安装Ubuntu 22.04.04系统的虚拟机上实现。依据fd.io官网的IKEv2文档:https://s3-docs.fd.io/vpp/22.10/usecases/ikev2/2_vpp.html。将两个VPP实例通过IPSec隧道连接。安装VPP版本23.10。原创 2024-04-20 19:15:00 · 743 阅读 · 0 评论 -
VPP添加接口IP地址
如下命令添加接口IPv4地址。配置IP地址由函数ip4_add_del_interface_address_internal处理,主要参数为接口索引,IPv4地址和掩码长度(address_length)。原创 2024-03-31 20:52:54 · 745 阅读 · 0 评论 -
VPP FIB表项信息
如下命令,VPP配置了接口eth11和eth13的IP地址,分别为17.1.1.1/16和18.1.1.1/16。命令show fib entry显示以上接口对应的fib表项。接口eth11对应4个FIB表项,对应的前缀分别为:17.1.0.0/16,17.1.0.0/32,17.1.255.255/32和17.1.1.1/32。接口eth13对应4个FIB表项。对应的前缀分别为:18.1.0.0/16,18.1.0.0/32,18.1.255.255/32和18.1.1.1/32。原创 2024-03-10 22:57:51 · 1031 阅读 · 0 评论 -
VPP接口二层互联xconnect
以下命令将接口设置为L2二层互联模式,如果要双向流量,需要两个口都设置成此模式。一个接口上接收到的报文将发送到另外一个接口,反之亦然。原创 2024-01-28 22:11:41 · 1139 阅读 · 0 评论 -
NAT44-ED features及节点图
VPP配置SNAT,内网接口GigabitEthernet2/0/0,外网接口GigabitEthernet3/0/0,NAT之后的地址为GigabitEthernet3/0/0接口的地址。NAT44-ED插件使用的feature和node节点如下。nat44-ed处理节点流程如下。VPP配置了多个worker线程的话,需要nat44-in2out-worker-handoff和nat44-out2in-worker-handoff节点;原创 2024-01-21 20:02:36 · 1145 阅读 · 0 评论 -
NAT44-ED会话与处理线程
NAT44-ED流表使用bihash创建,bihash类型为16_8,即16字节的key值和8字节的value值。默认情况下每个线程的会话数量为63K。bihash的哈希桶数量默认为32768。bihash哈希桶translation_buckets的值要求为2的幂,以下函数根据63K流表项,计算buckets值。原创 2024-01-14 22:28:12 · 1038 阅读 · 0 评论 -
自适应节点调度模式
节点模式调节的基础是VPP主循环执行的次数,即main_loop_count的值。每次主循环执行,都调用以上函数,递增main_loop_count的计数。原创 2024-01-06 20:56:51 · 440 阅读 · 0 评论 -
VPP节点统计信息
节点的统计位于函数dispatch_node函数中,节点处理函数运行之后(node->function)返回值为处理的报文数量n(n_vectors),通过函数vlib_node_runtime_update_stats来更新节点的相关统计信息。三种统计维度:调用次数、报文数量和时间,对应以上的参数n_calls=1,n_vectors=n和n_clocks=t - last_time_stamp。将node中的三个记录统计信息的成员分别累加上对应的值。原创 2023-11-12 21:27:52 · 716 阅读 · 0 评论 -
VPP ARC和feature初始化
遍历feature_main主结构的next_arc单向链表,按照顺序为每个ARC注册结构分配索引(feature_arc_index),如果注册ARC的时候为成员arc_index_ptr附了值,将ARC索引写入此值。将arc_name作为key,areg注册结构为value,写入arc_index_by_name的哈希中,方便之后查找。计算ARC中开始节点的数量,递增ARC索引,遍历下一个ARC注册结构。按照最大的ARC索引值,分配以下的向量。原创 2023-09-24 21:33:40 · 666 阅读 · 0 评论 -
VPP以太网VLAN子接口
子接口类型如下三类:VLAN子接口、QinQ子接口,untagged子接口。原创 2023-09-10 22:31:57 · 903 阅读 · 0 评论 -
VPP以太网接口模式
以太网接口结构ethernet_interface_t如下,其成员flags为32bit,高16bit为运行状态标志,低16bit为操作标志。最低bit位表示接口的L2/L3模式设置。第16bit为1表示接口运行在L3模式。物理接口在注册时,例如在VPP插件DPDK中,以太网接口结构成员flags没有进行赋值。函数ethernet_set_flags设置flags的值。原创 2023-09-10 21:51:28 · 378 阅读 · 0 评论 -
VPP以太网节点vlib_buffer_t初始优化
flags字段当前只关心VNET_BUFFER_F_L2_HDR_OFFSET_VALID和VNET_BUFFER_F_L3_HDR_OFFSET_VALID两个标志,以下将会用到,与结构vnet_buffer_opaque_t相关,前者表示成员l2_hdr_offset是有效的,后者表示l3_hdr_offset是有效的。current_data在vlib_buffer_t结构中的偏移为0,current_length的偏移为2,flags的偏移为4。或操作仅对buffer结构的flags赋值。原创 2023-08-19 19:15:00 · 438 阅读 · 0 评论 -
LinuxCP插件virtio与内核vhost
以下为LCP创建的接口对,VPP侧为物理接口port7,映射到Linux侧的为虚拟接口hostap1,接口hostap1作为vhost的后端存在。VPP侧接口tap1为前端的virtio接口。以下内容分三个部分:virtio/vhost相关初始化,发送和接收流程。原创 2023-07-09 18:15:00 · 561 阅读 · 0 评论 -
VPP时间轮
结构tw_timer_wheel是定时器的总结构。初始化时首先初始化时间轮的超时函数、最大时长,运行间隔/频率等,其中运行间隔不能为0。expired_timer_handles向量记录超时的定时器句柄,初始为空。初始化tw_timer_wheel_slot_t结构的二维数组w,第一个维度为时间轮的数量;第二个维度为每个时间轮的slot数量。每个slot中添加一个定时器(tw_timer结构),slot的head_index赋值为定时器的索引。所有的定时器统一在timers池中分配。原创 2023-05-07 22:25:16 · 775 阅读 · 0 评论 -
LCP邻居代理
lcp_adj_init注册新的邻居代理类型lcp_adj_vft。原创 2023-04-09 19:34:16 · 493 阅读 · 0 评论 -
LCP插件linux-cp-xc-ip6节点
如下命令创建LCP接口对,VPP物理接口eth0,对应linux接口host-eth0。LCP插件创建了virtio类型的tap1接口,用于和host-eth0连通。设置VPP接口和linux中对应接口的IPv6地址。如下定义节点linux-cp-xc-ip6,类型VLIB_NODE_TYPE_INTERNAL。节点属于ip6-unicast/ip6-multicast 特性arc。用于处理linux发往VPP的流量。节点处理函数lcp_xc_ip6如下,实际处理由函数lcp_xc_inline完成。原创 2023-03-26 20:44:08 · 366 阅读 · 0 评论 -
LCP插件linux-cp-xc-ip4节点
如下命令创建LCP接口对,VPP物理接口eth0,对应linux接口host-eth0。LCP插件创建了virtio类型的tap1接口,用于和host-eth0连通。如下定义节点linux-cp-xc-ip4,类型VLIB_NODE_TYPE_INTERNAL。节点属于ip-unicast/ip4-multicast 特性arc。用于处理linux发往VPP的流量。节点处理函数lcp_xc_ip4如下,实际处理由函数lcp_xc_inline完成。原创 2023-03-19 19:56:15 · 672 阅读 · 0 评论 -
Linux-cp处理arp回复报文
在linux-cp插件中,新建feature,名称为lcp_arp_phy_arp_feat,其所属的ARC为arp。feature中的node节点为linux-cp-arp-phy。此feature位于arp-reply feature之前。如下为node节点lcp_arp_phy_node的定义。如下show features命令,在ARP ARC中,新注册的feature linux-cp-arp-phy位于arping-reply之前。原创 2023-03-12 21:07:40 · 774 阅读 · 0 评论 -
virtio设备input节点
节点的运行state由其处理的所有接收队列来决定,如果其中存在接收队列为VNET_HW_IF_RX_MODE_POLLING接收模式,节点的state优先使用VLIB_NODE_STATE_POLLING。节点state为中断状态VLIB_NODE_STATE_INTERRUPT,由函数vnet_hw_if_generate_rxq_int_poll_vector获取当前已经产生的中断,生成需要处理的向量pv。注册virtio_input_node节点,节点类型为VLIB_NODE_TYPE_INPUT。原创 2023-03-05 23:01:21 · 639 阅读 · 0 评论 -
VPP接口INPUT节点运行数据
在设置virtio接口接收/发送队列函数的最后,更新接口的运行数据。原创 2023-02-19 23:22:10 · 557 阅读 · 0 评论 -
linux-cp virtio接口队列
在函数tap_create_if最后,初始化virtio接口的发送和接收队列。原创 2023-02-12 23:49:04 · 482 阅读 · 0 评论 -
linux-cp tap vhost接口
LCP中接口创建命令如下。将创建下图结构的三个虚拟网络设备,分别为VPP中的virtio接口,内核中的vhost-net设备和tap后端设备(backend)。其中virtio设备和tap设备可分别在VPP和linux中通过命令查看,vhost设备可通过内核创建的vhost处理线程确定。在创建接口对的函数lcp_itf_pair_create中,由函数tap_create_if执行实际的接口创建工作。如下为tap/tun接口创建所使用的参数。原创 2023-02-05 17:08:56 · 1674 阅读 · 0 评论 -
Linux-cp创建接口对
为了能够将数据报文由VPP送到Linux中,Linux-cp的如下命令为VPP中的接口创建对应的linux中映射接口(host-if),host-if默认为tap类型接口,可通过关键字tun改变接口类型,创建tun类型的映射接口。解析lcp命令行参数,交由函数lcp_itf_pair_create处理。首先,检查指定的VPP接口是否有效,以及要创建的linux接口的名称是否合法。其次,检查VPP接口是否存在。对于未指定命名空间的情况,使用默认的命名空间,默认命名空间也可能为空。原创 2023-01-15 23:13:33 · 1171 阅读 · 0 评论 -
linux-cp rtnetlink消息接收
否则,在nl_status等于NL_STATUS_NOTIF_PROC时,发送事件NL_EVENT_READ到节点nl_route_process_node。函数nl_route_process_msgs遍历nl_msg_queue向量,解析rtnetlink消息,由nl_route_dispatch根据类型(如RTM_NEWROUTE、RTM_NEWNEIGH、RTM_NEWADDR等)进行具体的处理。在接收到NL_EVENT_ERR之后,将nl_status设置为NL_STATUS_SYNC。原创 2023-01-08 23:35:03 · 738 阅读 · 0 评论 -
VPP开启调试trace
注册如下的命令trace add,开启记录报文信息,参数为节点名称和记录报文数量。命令行指定的节点需要支持trace功能,对应标志VLIB_NODE_FLAG_TRACE_SUPPORTED。如果指定的trace报文数量为最大值,修改为50。遍历每个线程,找到线程中的vlib_trace_node_t结构(或者新分配),将指定的报文数量设置到limit成员。将每个线程的vlib_trace_main_t结构成员trace_enable设置为1。原创 2023-01-01 22:30:34 · 935 阅读 · 0 评论 -
VPP调试trace显示
注册如下的命令show trace,显示记录的报文信息,默认每个线程最大显示50条,可使用参数max进行更改。trace显示处理函数如下,首先获取用户输入的trace最大显示数量。接下来遍历所有线程的vlib_main_t结构,第一行内容为线程的索引和线程名称,写入到向量s中。遍历当前线程的trace_buffer_pool池添加到traces向量中,trace_buffer_pool池中每个元素为一个报文的trace信息,包括报文在整个处理过程中每个节点node产生的信息。原创 2023-01-01 22:36:17 · 1094 阅读 · 0 评论 -
VEC128指令获取二层类型信息
如下VPP中eth_input_get_etype_and_tags函数,解析以太网二层类型和VLAN标签信息,分别保存在u16类型的etype和u64类型的tags变量中。如果定义了CLIB_HAVE_VEC128,将如下type字段地址前移6个字节的地址定义为u64x2类型的变量r,r为16字节变量。根据变量r,获取到etype和tags的值,如下图。否则,没有定义CLIB_HAVE_VEC128,如下赋值etype和tags。原创 2022-12-04 21:33:07 · 176 阅读 · 0 评论 -
VEC256指令MAC检查
函数is_dmac_bad_x4对四个报文的目的MAC地址进行检查,参数hwaddr为接收报文的接口硬件地址。u64x4_load_unaligned将dmacs开头的4个u64类型MAC地址加载为u64x4变量,将u64类型的DMAC_MASK复制4次并加载为u64x4类型变量,之后,两者相与得到r0,由于MAC地址为48bit,这样就去掉了u64中的16bit,得到4个MAC地址。第一种情况,如果4个MAC地址都与接口hwaddr地址相等,或者4个MAC地址都是组播(I/G)地址,返回零,4个MAC原创 2022-12-04 20:55:41 · 289 阅读 · 0 评论 -
VPP目的MAC检查
两个基本的宏掩码如下。报文DMAC检查如下,首先,检查报文的目的MAC地址与接口的主硬件地址,确定是否合法。对于两个报文做检查的情况,检查第二个报文的目的MAC地址是否合法。如果其中有一个(或者两个)报文的目的MAC地址不合法,并且接口还有次要硬件地址,遍历所有的次要硬件地址,检查报文DMAC的合法性。比较函数如下,报文的目的MAC与接口的硬件地址不相等,并且目的MAC不是多播地址,认为目的MAC有误。对于接口的次要硬件地址,如果报文的目的MAC地址不等于次要硬件地址,即认为目的MAC有误。原创 2022-11-27 21:03:03 · 369 阅读 · 0 评论 -
DPDK插件接收队列
VPP插件DPDK在注册以太网接口之后,设定处理此接口的节点索引,即由当前的节点dpdk_input_node来处理此接口。将dpdk_input_node节点的索引赋值给接口结构的成员input_node_index。如果配置了worker进程(配置参数corelist-workers),遍历worker位图,首先确保配置的接收队列(num-rx-queues)不能少于worker的数量,否则触发ASSERT。为每个worker注册接收队列,将接口的队列与worker绑定。原创 2022-11-27 19:17:50 · 332 阅读 · 0 评论 -
VPP接口添加删除回调
函数call_sw_interface_add_del_callbacks将调用以上注册在链表sw_interface_add_del_functions中的回调函数。回调函数链接在vnet_main_t结构的成员链表sw_interface_add_del_functions中。如下宏用来定义接口添加/删除所用的回调函数VNET_SW_INTERFACE_ADD_DEL_FUNCTION。在vnet_main_t结构中,定义了软件接口添加/删除回调函数链表,其由两个优先级链表组成。原创 2022-11-20 20:50:31 · 313 阅读 · 0 评论 -
X710网卡RSS对称哈希
Intel X710的RSS哈希函数支持微软的Toeplitz算法以及XOR算法。并且支持对称和非对称操作。与82599不同,X710的Toeplitz算法使用416位(52字节)的秘钥,82599网卡使用320位(40字节)的秘钥。在DPDK中,函数i40e_hash_parse_key默认设置此hash秘钥值rss_key_default。启用对称哈希,可以使用如下的秘钥值。而不用启用X710的对称设置。原创 2022-11-20 19:15:00 · 2113 阅读 · 0 评论 -
VPP创建主HEAP内存
初始化clib_mem_vm_map_hdr_t结构的hdr,将其作为新的内存映射尾部赋值给last_map,初始化hdr的起始地址,页面大小和数量等信息。base起始地址开头为clib_mem_heap_t结构,进行初始化,随后跳过此结构以及名称长度的空间,将随后空间生成mspace结构,以供mspace_malloc分配内存使用,例如pool_get的内存分配。在函数clib_mem_vm_map_internal中,首先设置mmap标志MAP_SHARED,mmap的空间变动在其它进程中可见。原创 2022-11-13 22:06:33 · 882 阅读 · 0 评论 -
DPDK和VPP地址池
将以上创建的的两个DPDK内存池赋值与以VPP内存池索引的数组dpdk_mempool_by_buffer_pool_index和dpdk_no_cache_mempool_by_buffer_pool_index。数组dpdk_mempool_by_buffer_pool_index和dpdk_no_cache_mempool_by_buffer_pool_index用于存放之后创建的DPDK mempool地址。创建DPDK内存池结构,elt_size为元素大小,bp->n_buffers为元素数量。原创 2022-11-13 22:00:00 · 1263 阅读 · 1 评论 -
VLIB缓存模板
联合体中根据CLIB_HAVE_VECx的值定义了三个数组,数组大小都为64字节,对应于第一个cacheline0的大小,在buffer_template的处理中将使用到。接收处理函数中,首先将buffer_template拷贝到局部变量bt中,在将bt的模板数据拷贝到接收数据的vlib_buffer_t缓存中。在VPP插件dpdk初始化函数中,将每线程结构的buffer_template结构清空,其中,发送接口索引sw_if_index设置为无效。原创 2022-11-06 21:45:45 · 272 阅读 · 0 评论 -
VLIB缓存标志位
如下文件vnet/buffer.h中定义了剩余的标志位,剩余28个标志位,但是文件中定义了27个。/***/vnet定义的标志位由最高位开始,参见宏LOG2_VLIB_BUFFER_FLAG_USER(32-n)。如上所示,标志位VNET_BUFFER_F_L4_CHECKSUM_COMPUTED占据的为最高位,即第31位。以上AVAILx未被使用,可被重新定义使用。原创 2022-11-06 23:30:00 · 492 阅读 · 1 评论 -
VPP创建buffer池
如果新的起始地址小于已有的起始地址bm->buffer_mem_start,起始地址使用新的起始地址,新的长度值递增两者的差值(bm->buffer_mem_start - start)。在新添加的size值大于新计算的长度值bm->buffer_mem_size的情况下,buffer池的长度值更新为size的值,此种情况下,新添加的物理内存完全覆盖了原有的物理内存空间。如果新的计算出来长度值大于原有的长度值,更新buffer池的长度,此种情况下,新添加的物理内存和原有内存有交集。原创 2022-10-30 22:23:18 · 446 阅读 · 0 评论