自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

redwingz的博客

Linux内核网络、虚拟化

  • 博客(772)
  • 资源 (5)
  • 收藏
  • 关注

原创 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 70

原创 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 713

原创 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 671

原创 VPP添加接口IP地址

如下命令添加接口IPv4地址。配置IP地址由函数ip4_add_del_interface_address_internal处理,主要参数为接口索引,IPv4地址和掩码长度(address_length)。

2024-03-31 20:52:54 681

原创 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 916

原创 VPP接口二层互联xconnect

以下命令将接口设置为L2二层互联模式,如果要双向流量,需要两个口都设置成此模式。一个接口上接收到的报文将发送到另外一个接口,反之亦然。

2024-01-28 22:11:41 1055

原创 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 1086

原创 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 1009

原创 自适应节点调度模式

节点模式调节的基础是VPP主循环执行的次数,即main_loop_count的值。每次主循环执行,都调用以上函数,递增main_loop_count的计数。

2024-01-06 20:56:51 426

原创 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 652

原创 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 586

原创 VPP以太网VLAN子接口

子接口类型如下三类:VLAN子接口、QinQ子接口,untagged子接口。

2023-09-10 22:31:57 781

原创 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 341

原创 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 368

原创 内核inet_peer及限速

inet_peer为内核中的其它系统提供对通信另一端相关信息的存储功能。peers按照红黑树结构组织,相比于hash结构,可以避免在受到DDOS攻击时,发生哈希冲突,单个哈希值冲突链表过长,导致查询时长增加的问题。inet_peer支持IPv4和IPv6,红黑树的键值为IPv4或者IPv6的地址值。

2023-08-13 22:22:35 197

原创 LinuxCP插件virtio与内核vhost

以下为LCP创建的接口对,VPP侧为物理接口port7,映射到Linux侧的为虚拟接口hostap1,接口hostap1作为vhost的后端存在。VPP侧接口tap1为前端的virtio接口。以下内容分三个部分:virtio/vhost相关初始化,发送和接收流程。

2023-07-09 18:15:00 453

原创 shufti匹配

hyperscan的shufti匹配,用于单字符集的匹配,核心使用了intel的_mm_shuffle_epi8指令,其为针对16字节变量的指令。如下函数pshufb_m128,根据第二个参数b中保存的索引值,由参数a中获得相应位置的值,保存到result中。参数b中每个字节的低四位作为索引值,索引值的范围为:[0, 15],对应参数b中的16个字节,查询不会超出范围。另外,如果参数b中某个字节的最高位为1,不执行查询操作,结果固定为0。

2023-06-11 22:21:37 586

原创 vermicelli双字符匹配

其次,分别与第一个要查找的字符chars1,以及第二个字符chars2进行比较。如下示例,假设需要匹配的两个字符为:ab,输入64字节长度字符串为:thisisatestchabt…对于字符b,仅在位置14产生了一处匹配(mask2)。之后,将mask2右移1位,这样mask2的第14位移动到了第13位,将其与mask1进行位与操作,得到匹配结果z,第13位为1(ctz64函数获得)。dvermMini函数执行双字符匹配,每次最多可检测64字节的输入数据,返回第一个匹配的起始位置。

2023-06-11 18:15:00 127

原创 vermicelli单字符匹配

vermMini函数处理单字符的匹配,每次最多匹配64字节长度的数据,返回首个匹配位置。参数chars中保存了64个相同字符(如字符a),待匹配数据长度小于等于VERM_BOUNDARY(64)字节。AVX-512指令_mm512_maskz_loadu_epi8将buf 到 buf_end内存中数据以字节为单位加载到m512变量中,64bit掩码mask指定了要加载到data中的字节,mask中bit为零表示不加载buf对应字节位置的数据。

2023-06-04 21:07:00 137

翻译 GCC内存模型同步模式

事实上,它并不像听起来那么复杂,所以为了让你的眼睛不那么呆滞,请针对每一种不同的内存模型来研究以下的示例:当两个线程以顺序一致模式同步时,所有可见的变量都必须在系统中刷新,以便所有线程都能看到相同的状态。因此,这两个assert都是可通过的。释放/获取模式只需要同步所涉及的两个线程。这意味着同步的值对于其他线程是不可交换的。线程2中的assert必须仍然是可通过的,因为线程1和2与通过x.load()操作进行了同步。

2023-05-21 21:33:57 193

原创 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 713

原创 LCP邻居代理

lcp_adj_init注册新的邻居代理类型lcp_adj_vft。

2023-04-09 19:34:16 478

原创 linux-cp节点node路径

如下linux-cp命令,为VPP中接口创建对应的linux接口tap1,类型默认为TAP。可指定命令参数tun,来创建TUN类型接口。函数lcp_itf_pair_add参数如下:host_sw_if_index - VPP中对应的virtio接口索引;phy_sw_if_index - VPP中的物理接口索引;host_name - linux中主机接口的名称host_index - linux中主机接口的索引。在调用此函数时,virtio接口和linux主机接口都已经创建完成。

2023-04-02 20:36:25 493

原创 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 350

原创 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 619

原创 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 719

原创 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 612

原创 VPP接口INPUT节点运行数据

在设置virtio接口接收/发送队列函数的最后,更新接口的运行数据。

2023-02-19 23:22:10 523

原创 linux-cp virtio接口队列

在函数tap_create_if最后,初始化virtio接口的发送和接收队列。

2023-02-12 23:49:04 437

原创 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 1544

原创 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 1071

原创 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 688

原创 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 1036

原创 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 846

原创 内核配置文件注释

程序scripts/kconfig/conf位于目录linux-5.10/scripts/kconfig下,如下为confdata.c文件内容。如下注释内容(# CONFIG_COMPILE_TEST is not set),表明CONFIG_COMPILE_TEST没有设置。如果此注释的配置项类型为S_BOOLEAN或者S_TRISTATE,此行表明配置值为NO,可见并非简单的注释。如果去掉此行,在内核编译时,不能确定COMPILE_TEST如何配置,提示用户进行选择。

2022-12-25 19:59:34 352

原创 飞腾平台编译文件系统

使用默认的第一个phytium_d2000-64b-efi_defconfig配置,首先修复其中的几个错误,对于4.19版本内核,sdk.config配置已经不存在,更改为defconfig文件。对于buildroot配置文件phytium_d2000_defconfig,其使用的内核配置也是defconfig,也存在同样的问题。对于使用内核配置文件e2000_defconfig的情况,已经配置了CONFIG_REMOTEPROC选项,应当没有问题。查看当前gitee上飞腾内核的版本信息。

2022-12-25 19:15:00 1566 1

原创 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 164

原创 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 280

原创 VPP目的MAC检查

两个基本的宏掩码如下。报文DMAC检查如下,首先,检查报文的目的MAC地址与接口的主硬件地址,确定是否合法。对于两个报文做检查的情况,检查第二个报文的目的MAC地址是否合法。如果其中有一个(或者两个)报文的目的MAC地址不合法,并且接口还有次要硬件地址,遍历所有的次要硬件地址,检查报文DMAC的合法性。比较函数如下,报文的目的MAC与接口的硬件地址不相等,并且目的MAC不是多播地址,认为目的MAC有误。对于接口的次要硬件地址,如果报文的目的MAC地址不等于次要硬件地址,即认为目的MAC有误。

2022-11-27 21:03:03 349

原创 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 310

botan-ed25519.pcap

IKEv2协议交互报文,认证方式选用Ed25519算法的证书方式。

2019-10-28

IKEv2-rw-cert2.pcap

strongswan使用linux内核的af_alg加密接口配置,IKEv2协议交互报文。

2019-10-28

IKEv2-camellia.pcap

IKEv2协议使用camellia加密算法的协商报文,交互流程。

2019-10-28

libssh2-1.8.0 and ssh2_batch example

ssh2_batch可执行程序,用于非交互式的ssh命令执行。源代码和libssh2

2018-06-13

WEB Portal 认证完整的交互报文

web认证交互报文,包括WLAN controller与portal server的认证与注销,AC与radius 服务器的认证报文。

2018-04-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除