- 博客(780)
- 资源 (5)
- 收藏
- 关注
原创 strongswan链表结构
链表结构定义如下,public成员为公共的方法,count,first和last为私有成员,count表示链表中元素的数量,first和last分别指向链表的头和尾。public(linked_list_t结构)定义了一系列操作链表的方法,其必须为第一个结构成员,方便在公共方法和私有结构间转换。如下函数创建通用的链表元素结构。
2024-11-03 19:39:12 323
原创 strongswan中METHOD定义
strongswan中使用METHOD来定义函数(方法),如下get_first函数定义。METHOD宏各个参数的说明以及对应于的get_first函数的各个参数如下。METHOD宏重新布局如下。其由三部分组成,第一部分为函数声明,首个参数为transparent_union属性修饰的联合体,联合体内容为对应结构(如linked_list_t)的公共和私有结构体;METHOD定义的函数为静态,文件内部使用时首个参数为私有结构体,如private_linked_list_t。
2024-11-03 18:45:00 105
原创 Cisco ASAv虚拟防火墙
配置如下,主要是三个方面,配置管理口地址模式DHCP,配置安全级别;第二,开启http服务器,配置允许访问主机的网段和接口;修改ASDM快捷方式,点击属性,将目标修改为:C:\Windows\System32\wscript.exe invisible.vbs run.bat。浏览器访问ASAv管理地址,如下下载cisco asdm的界面,以上配置显示中可见asdm镜像为:asdm-openjre-7202.bin。下载安装ASDM-7.20(2),其包含openjre,不需要在另外安装。
2024-10-26 20:22:50 277
原创 openssl签名报错
从内核4.8(DEVRANDOM_SAFE_KERNEL)开始,当/dev/random(DEVRANDOM_WAIT)可读时,不确保设备/dev/urandom被正确的Seed。出现问题的系统使用的内核为3.10,但是uname系统调用获取到的内核版本为5.16,导致了问题的产生。将程序与openssl库做静态链接,放到其它机器上运行一切正常,排除了openssl库的问题,应当是系统问题。否则,检查/dev/random是否可读,来判断/dev/urandom是否正确的Seed。
2024-10-20 19:45:00 420
原创 EVE-NG防火墙镜像
如下图所示,用到的虚拟防火墙有Checkpoint,cisco,fortinet,Paloalto,hillstone,H3C和Huawei几个品牌。
2024-07-28 17:45:00 1403
原创 Trex测试仪使用
公司测试仪器紧张,打算安装Trex做简单的测试。如下下载最新的trex工程。解压,得到版本v3.04。运行脚本dpdk_setup_ports.py,配置trex使用的网卡。需要配置偶数的接口数量,可以使用ID,PCI地址或者linux接口名称来指定trex使用的接口。这里根据ID,指定ID为4和5的接口,即linux接口enp7s0和enp8s0。脚本默认配置两个接口为回环模式。先都采用默认的配置,稍后在修改。配置完之后,预览配置内容如下,保存到/etc/trex_cfg.yaml。对应的拓扑如下图。
2024-06-23 20:56:16 390
翻译 cjdns whitepaper
互联网一个更技术性的问题,也是很多人都没有意识到的,是地址空间的碎片化。每台连接到互联网的计算机都需要一个地址,作为唯一标识它的数字,发送到这台计算机的每条数据上都附有此地址。在其互联网路径上的每一站,路由器都会检查报文(数据单元)的地址字段,以决定它可以在哪条线路上发送数据包。如果地址是大块的,路由器会更容易快速的查找报文中地址字段的前几个字节,然后知道,例如,它的目的地是中国的某个地方,虽然不准确,但足以知道该使用哪根线路发送。
2024-06-09 21:26:04 137
原创 VPP FIB路径链表环路检查
在添加新的路径时需要进行路径环路检查。函数fib_path_list_recursive_loop_detect会被反复调用。
2024-05-26 21:13:35 486
原创 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 247
原创 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 847
原创 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 875
原创 VPP添加接口IP地址
如下命令添加接口IPv4地址。配置IP地址由函数ip4_add_del_interface_address_internal处理,主要参数为接口索引,IPv4地址和掩码长度(address_length)。
2024-03-31 20:52:54 872
原创 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 1202
原创 VPP接口二层互联xconnect
以下命令将接口设置为L2二层互联模式,如果要双向流量,需要两个口都设置成此模式。一个接口上接收到的报文将发送到另外一个接口,反之亦然。
2024-01-28 22:11:41 1261
原创 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 1271
原创 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 1118
原创 自适应节点调度模式
节点模式调节的基础是VPP主循环执行的次数,即main_loop_count的值。每次主循环执行,都调用以上函数,递增main_loop_count的计数。
2024-01-06 20:56:51 484
原创 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 842
原创 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 756
原创 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 474
原创 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 548
原创 内核inet_peer及限速
inet_peer为内核中的其它系统提供对通信另一端相关信息的存储功能。peers按照红黑树结构组织,相比于hash结构,可以避免在受到DDOS攻击时,发生哈希冲突,单个哈希值冲突链表过长,导致查询时长增加的问题。inet_peer支持IPv4和IPv6,红黑树的键值为IPv4或者IPv6的地址值。
2023-08-13 22:22:35 266
原创 LinuxCP插件virtio与内核vhost
以下为LCP创建的接口对,VPP侧为物理接口port7,映射到Linux侧的为虚拟接口hostap1,接口hostap1作为vhost的后端存在。VPP侧接口tap1为前端的virtio接口。以下内容分三个部分:virtio/vhost相关初始化,发送和接收流程。
2023-07-09 18:15:00 742
原创 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 674
原创 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 166
原创 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 178
翻译 GCC内存模型同步模式
事实上,它并不像听起来那么复杂,所以为了让你的眼睛不那么呆滞,请针对每一种不同的内存模型来研究以下的示例:当两个线程以顺序一致模式同步时,所有可见的变量都必须在系统中刷新,以便所有线程都能看到相同的状态。因此,这两个assert都是可通过的。释放/获取模式只需要同步所涉及的两个线程。这意味着同步的值对于其他线程是不可交换的。线程2中的assert必须仍然是可通过的,因为线程1和2与通过x.load()操作进行了同步。
2023-05-21 21:33:57 242
原创 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 924
原创 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 640
原创 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 423
原创 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 719
原创 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 864
原创 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 699
原创 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 1837
原创 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 1316
原创 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 813
dm-launcher-7.20.msi
2024-09-24
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人