VPP中SRv6的多场景实验

本文详细介绍了VPP环境中SRv6在不同场景下的应用,包括中间P节点不支持、支持SRv6以及P节点支持SRv6且PE中VRF非默认0的情况。针对每种场景,分别讨论了拓扑结构、设备配置以及联通测试,提供了具体的配置步骤和测试结果。

1. 中间P节点不支持SRv6

1.1. 拓扑图及概述

  • VPP中基础命令参考
vpp# show sr localsids
//显示SRv6的本地policy
vpp# show sr policies
//显示SRv6的本地steering
vpp# show sr steering-policies

//删除操作
sr localsid del address fc01::2
//删除操作
sr policy del bsid fe01::1
//删除操作
sr steer l3 10.10.10.0/24 via bsid fe01::1 del

1.2. P设备

set int state G0 up
set int state G1 up
set int ip addr G0 fdac::1/96
set int ip addr G1 fdab::2/96
#配置关于loop口的路由
ip route add fc10::/96 via fdab::1
ip route add fc01::/96 via fdac::2

1.3. PE-A设备

set int state G0 up
set int state G1 up
set int ip addr G0 fdab::1/96
set int ip addr G1 10.10.10.1/24
loopback create-interface
set interface state loop0 up
set interface ip address loop0 fc10::1/96

#设置默认路由
ip route add ::/0 via fdab::2

#设置srv6配置项
sr localsid address fc10::2 behavior end.dx4 G1 10.10.10.2
sr policy add bsid fe10::1 next fc01::2
sr steer l3 10.10.1.0/24 via bsid fe10::1

ping fdab::2
VPP中实现新的SRv6功能`end.xs`,当节点匹配到`end.xs`时缓存数据包,可按以下思路进行: ### 1. 定义新的SRv6功能处理函数 需要在VPP代码中定义一个新的SRv6功能处理函数,用于处理`end.xs`功能。当匹配到`end.xs`时,将数据包缓存下来。以下是一个简化的示例代码: ```c #include <vppinfra/error.h> #include <vppinfra/mem.h> #include <vnet/vnet.h> #include <vnet/srv6/srv6.h> // 定义一个全局的数据包缓存 #define MAX_CACHED_PACKETS 100 vlib_buffer_t *cached_packets[MAX_CACHED_PACKETS]; u32 cached_packet_count = 0; // 新的SRv6 end.xs功能处理函数 static uword srv6_end_xs_function (vlib_main_t * vm, vlib_node_runtime_t * node, vlib_frame_t * frame) { u32 n_left_from, *from, *to_next; vlib_buffer_t *b; from = vlib_frame_vector_args (frame); n_left_from = frame->n_vectors; to_next = vlib_frame_vector_args (frame); while (n_left_from > 0) { u32 bi; bi = from[0]; to_next[0] = bi; from += 1; to_next += 1; n_left_from -= 1; b = vlib_get_buffer (vm, bi); // 缓存数据包 if (cached_packet_count < MAX_CACHED_PACKETS) { cached_packets[cached_packet_count++] = b; } // 继续处理数据包,这里可以添加更的处理逻辑 vlib_validate_buffer_enqueue_x1 (vm, node, next_frame, to_next, bi, 1); } vlib_put_frame (vm, node, next_frame, to_next - vlib_frame_vector_args (frame)); return frame->n_vectors; } // 定义新的SRv6 end.xs节点 VLIB_REGISTER_NODE (srv6_end_xs_node) = { .function = srv6_end_xs_function, .name = "srv6-end-xs", .vector_size = sizeof (u32), .format_trace = format_srv6_trace, .type = VLIB_NODE_TYPE_INTERNAL, }; ``` ### 2. 注册新的SRv6功能 在VPP中,需要将新的`end.xs`功能注册到SRv6功能表中。可以在初始化代码中添加以下内容: ```c // 注册新的SRv6 end.xs功能 static clib_error_t * srv6_end_xs_init (vlib_main_t * vm) { srv6_function_register ("end.xs", srv6_end_xs_node.index); return 0; } VLIB_INIT_FUNCTION (srv6_end_xs_init); ``` ### 3. 配置SRv6策略使用新功能 在VPP的配置中,需要配置SRv6策略使用新的`end.xs`功能。可以使用VPP的CLI命令或者API进行配置。例如,使用CLI命令: ```plaintext sr localsid add <localsid> end.xs ``` 其中`<localsid>`是具体的本地段ID。 ### 4. 访问缓存的数据包 可以编写一个VPP插件或者CLI命令来访问缓存的数据包。例如,编写一个CLI命令来打印缓存的数据包信息: ```c #include <vnet/cli/cli.h> // 打印缓存的数据包信息 static clib_error_t * show_cached_packets (vlib_main_t * vm, unformat_input_t * input, vlib_cli_command_t * cmd) { u32 i; for (i = 0; i < cached_packet_count; i++) { vlib_buffer_t *b = cached_packets[i]; vlib_cli_output (vm, "Cached packet %d: buffer index %u", i, b->buffer_index); } return 0; } // 注册CLI命令 VLIB_CLI_COMMAND (show_cached_packets_command, static) = { .path = "show cached-packets", .short_help = "Show cached packets", .function = show_cached_packets, }; ``` ### 注意事项 - 上述代码仅为示例,实际实现中可能需要根据VPP的具体版本和需求进行调整。 - 数据包缓存的大小需要根据实际情况进行调整,避免内存耗尽。 - 处理缓存的数据包时,需要考虑数据包的生命周期和内存管理。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值