VPP中SRv6的使用

24 篇文章 9 订阅
4 篇文章 7 订阅

https://docs.fd.io/vpp/20.01/dd/db5/clicmd_src_vnet_srv6.html

https://www.sdnlab.com/23218.html

VPP版本:20.01

0.前言

VPP(Vector Packet Processing)是思科旗下的一款可拓展的开源框架,提供容易使用的、高质量的交换、路由功能。

VPP全称Vector Packet Processing(矢量数据包处理),最早是Cisco 于 2002年开发的商用代码。之后在2016年Linux基金会创建FD.io开源项目,Cisco将VPP代码的开源版本加入该项目,目前已成为该项目的核心。现在一般来讲的VPP特指 FD.io VPP,即Linux基金会发起的开源项目。这个项目在通用硬件平台上提供了具有灵活性、可扩展强、组件化等特点的高性能IO服务框架。该框架支持高吞吐量、低延迟、高资源利用率的IO服务,并可适用于多种硬件架构(x86/ARM/PowerPC)以及各种部署环境(裸机/VM/容器)。

VPP对于SRv6有着非常好的支持,并且提供高性能。关于SRv6原理及Linux SRv6常见功能VPN、流量工程、服务链。如上图所示,VPP原生已经支持了SRv6,包括常见的SRv6操作。在性能方面,VPP同样出色,比Linux 内核原生支持的SRv6吞吐能力要超出很多;成本方面相比智能网卡则有着巨大优势。目前很多开源项目以及商业项目也选用了VPP,其整体的稳定性和性能得到了广泛的验证。

1. SRv6控制命令归纳

  • show sr localsids: 显示所有本地段id号。

#show sr localsids

SRv6 - My LocalSID Table:

=========================

        Address:        fd01:1::1a

        Behavior:       DX4 (Endpoint with decapsulation and IPv4 cross-connect)

        Iface:          eth5

        Next hop:       10.1.0.2

        Good traffic:   [0 packets : 0 bytes]

        Bad traffic:    [0 packets : 0 bytes]

--------------------

        Address:        fd01::1:1:a0a:102

        Behavior:       DX4 (Endpoint with decapsulation and IPv4 cross-connect)

        Iface:          eth5

        Next hop:       10.10.1.2

        Good traffic:   [0 packets : 0 bytes]

        Bad traffic:    [0 packets : 0 bytes]

--------------------

  • show sr localsids behaviors: 显示所有本地段id号。

#show sr localsids behaviors

SR LocalSIDs behaviors:

-----------------------

Default behaviors:

        End     -> Endpoint.

        End.X   -> Endpoint with Layer-3 cross-connect.

                Parameters: '<iface> <ip6_next_hop>'

        End.T   -> Endpoint with specific IPv6 table lookup.

                Parameters: '<fib_table>'

        End.DX2 -> Endpoint with decapsulation and Layer-2 cross-connect.

                Parameters: '<iface>'

        End.DX6 -> Endpoint with decapsulation and IPv6 cross-connect.

                Parameters: '<iface> <ip6_next_hop>'

        End.DX4 -> Endpoint with decapsulation and IPv4 cross-connect.

                Parameters: '<iface> <ip4_next_hop>'

        End.DT6 -> Endpoint with decapsulation and specific IPv6 table lookup.

                Parameters: '<ip6_fib_table>'

        End.DT4 -> Endpoint with decapsulation and specific IPv4 table lookup.

                Parameters: '<ip4_fib_table>'

Plugin behaviors:

        End.AD  -> Endpoint with dynamic proxy to SR-unaware appliance.

                Parameters: 'nh <next-hop> oif <iface-out> iif <iface-in>'

        End.AM  -> Endpoint to SR-unaware appliance via masquerading.

                Parameters: 'nh <next-hop> oif <iface-out> iif <iface-in>'

        End.AS  -> Endpoint with static proxy to SR-unaware appliance.

                Parameters: 'nh <next-hop> oif <iface-out> iif <iface-in> src <src-addr> next <sid> [next <sid> ...]'

  • show sr policies: 显示所有sr策略。

#show sr policies

SR policies:

[0].-   BSID: fd01::1:2:a0a:200

        Behavior: Encapsulation

        Type: Default

        FIB table: 0

        Segment Lists:

        [0].- < fd01::1:1:a0a:102 > weight: 1

-----------

  • show sr steering-policies: 显示所有steer引流和对应策略bsid。

vpp# show sr steering-policies

SR steering policies:

Traffic         SR policy BSID

L3 10.10.2.0/24 fd01::1:2:a0a:200

  • sr localsid: 设置本地段标签,以及终端解析转发的行为

范式:

vpp# sr localsid (del) address XX:XX::YY:YY(fib-table 8) behavior STRING.

创建段路由SG的localSID并绑定一个特殊行为参数:一种格式是localSID IPv6_addr(128b),或者是lSID IPv6 address (fib-table X)。VRF 通过SRv6本地localsid的行为字符串指定行为。

行为:End -> Endpoint. End.X -> Endpoint,表示解压缩和3层交叉连接;参数:'<iface> <ip6_next_hop>' End.DX2 -> Endpoint表示解压缩和二层交叉连接;参数:'<iface>' End.DX6 -> Endpoint表示解压缩和IPv6的交叉连接;参数:'<iface> <ip6_next_hop>' End.DX4 -> Endpoint表示解压缩和ipv4的交叉连接;参数:'<iface> <ip4_next_hop>' End.DT6表示终点解压缩并指定IPv6表查询;参数<ip6_fib_table>' End.DT4 -> Endpoint表示解压缩并指定ipv4的表查询;参数: '<ip4_fib_table>';

  • sr policy:设置转发策略标签以及每跳标签等

范式:

sr policy [add||del||mod] [bsid 2001::1||index 5] next A:: next B:: next C:: (weight 1) (fib-table 2) (encap|insert).

举例:

        SR策略的操作。SR策略可能包含多个SID列表。每个SID列表都有一个权重,默认为1,并用于wECMP (uECMP)。段路由SR策略可能有封装类型或;

        一个绑定BindingSID是本地分配的SegmentID。对每个接收的IPv6_DA:BSID包,这种流通信将被引导到SR策略中。add命令将通过第一段列表sl创建一个SR策略;mod命令允许在SR策略中增加、删除或修改已有的段列表标签;del命令允许删除一个SR策略和所有相关的SID列表。

  • sr steer:设置转发策略标签以及每跳标签等

范式:

sr steer (del) [l3 <ip_addr/mask>|l2 <sf_if>] via [index <sr_policy_index>|bsid <bsid_ip6_addr>] (fib-table <fib_table_index>).

举例:

Steer a L2 or L3 traffic through an existing SR policy.

    Examples:

            sr steer l3 2001::/64 via sr_policy index 5

            sr steer l3 2001::/64 via sr_policy bsid 2010::9999:1

            sr steer l2 GigabitEthernet0/5/0 via sr_policy index 5

            sr steer del l3 2001::/64 via sr_policy index 5

  • set interface ip table:设置ip接口绑定vrf表

范式:

set interface ip table <interface> <table-id>.

描述:

        将指定网口加入支持的IPv4 FIB表中(VRF)。这个FIB表必须已通过ip table add 创建。如需显示当前的IPv4 FIB表,使用命令show ip fib。仅在有路由信息被加入该表中,或是表中网口已绑定IP地址(自动添加路由),才会显示该FIB表信息。通过命令show int address 查看端口和vrf表绑定状态。

注意:

        在网口IP表被加入指定的FIB表后,再设置IP地址时,需要注意。如果表中加入IP地址后再改变table,这将会产生错误。控制台必须先删除这些地址,再改变表。VPP将不会自动将这些地址从旧表移到新表,因为它不知道该变化是否有效。

范例:

如何将网口增加到IPv4的FIB表中(其中2表示表ID号):

vpp# set ip fib table 2           //1.创建vrf表2
vpp# set interface ip table GigabitEthernet2/0/0 2      //2.将端口绑定vrf表ID号2
vpp# set int state  GigabitEthernet2/0/0 2 up    //3.启动端口
vpp# set int ip address GigabitEthernet2/0/0 2 10.10.10.1/24      //4.设置端口网段,必须在绑定vrf之后
  • show ip6 fib :显示fib信息

范式:

show ip6 fib       show ip6 fib [summary] [table <table-id>] [index <fib-id>] [<ip6-addr>[/<width>]] [detail]

概述:

    show ip6 fib summary显示概略信息。

    show ip6 fib table 显示table表信息,此处设置SRv6策略表不在策略中。

    show ip6 fib index 显示指定策略信息路径,可以显示srv6策略,通过fib索引号查询。

 

2.SRv6测试用例

配置SRv6实现访问控制步骤:

##1.定义Segment fd01:1::1a的操作为End.DX4,将内部的IPv4包转发到eth5的10.1.1.2机器下(即Tester2)
ip table add 1                //创建vrf虚拟路由转发表,用于指定ip4 vrf表1
ip6 table add 1                //创建vrf虚拟路由转发表,用于指定ip6 vrf表1
set interface ip table eth5 1    //将接口绑定vrf表,需要在分配IPv4之前绑定,否则默认绑定vrf id 0.
set interface ip table eth6 1 
set int state eth5 up
set int state eth6 up
set int ip address eth5 10.10.1.0/24
set int ip address eth6 10.10.2.0/24
sr localsid address fd01::1:1:0a0a:0a02 behavior end.dx4 eth5 10.10.1.0

//绑定指定索引表vrf的id号
// sr localsid address fd01::1:1:0a0a:0a02 fib-table 1 behavior end.dx4 eth5 10.10.1.0


##2. #添加一个新的路由策略,包含2个标签Segment fd01::1:1:0a0a:0b01 fd01::1:1:0a0a:0c01
sr policy add bsid fd01::1:1:0a0a:0a01 next fd01::1:1:0a0a:0b01 next fd01::1:1:0a0a:0c01 encap


##3. # 将去往10.10.2.0/24的包引导至新定义的SRv6 Policy
sr steer l3 10.10.2.0/24 via bsid fd01::1:1:0a0a:0a01

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 VPP 实现 Hash 表的示例代码: ```c #include <vlib/vlib.h> #include <vppinfra/hash.h> typedef struct { u32 key; u32 value; } hash_pair_t; typedef struct { u64 hits; u64 misses; uword *hash; } hash_table_t; typedef struct { hash_table_t ht; } hash_main_t; hash_main_t hash_main; static uword hash_pair_hash (void *item) { hash_pair_t *p = item; return hash_combine (0, p->key); } static int hash_pair_cmp (void *a1, void *a2) { hash_pair_t *p1 = a1; hash_pair_t *p2 = a2; return (p1->key == p2->key); } static void hash_table_init (hash_table_t *ht) { ht->hits = 0; ht->misses = 0; ht->hash = hash_create (0, sizeof (hash_pair_t), sizeof (uword)); } static void hash_table_add (hash_table_t *ht, u32 key, u32 value) { hash_pair_t pair = { .key = key, .value = value, }; hash_set_mem (ht->hash, &pair, hash_pair_hash (&pair)); } static u32 hash_table_find (hash_table_t *ht, u32 key) { hash_pair_t query = { .key = key, }; uword *p = hash_get_mem (ht->hash, &query); if (p) { ht->hits++; hash_pair_t *pair = (hash_pair_t *) p[0]; return pair->value; } else { ht->misses++; return ~0; } } static clib_error_t * hash_init (vlib_main_t *vm) { hash_table_init (&hash_main.ht); return 0; } VLIB_INIT_FUNCTION (hash_init); static clib_error_t * hash_cli (vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd) { u32 key, value; if (!unformat (input, "add %u %u", &key, &value)) { return clib_error_return (0, "unknown input `%U'", format_unformat_error, input); } hash_table_add (&hash_main.ht, key, value); return 0; } VLIB_CLI_COMMAND (hash_cli_command, static) = { .path = "hash-table", .short_help = "hash table commands", .function = hash_cli, }; static clib_error_t * hash_test (vlib_main_t *vm) { u32 key, value, result; key = 42; value = 1337; hash_table_add (&hash_main.ht, key, value); result = hash_table_find (&hash_main.ht, key); if (result == value) { vlib_cli_output (vm, "Test 1 passed\n"); } else { vlib_cli_output (vm, "Test 1 failed: expected %u, got %u\n", value, result); } key = 43; result = hash_table_find (&hash_main.ht, key); if (result == ~0) { vlib_cli_output (vm, "Test 2 passed\n"); } else { vlib_cli_output (vm, "Test 2 failed: expected ~0, got %u\n", result); } return 0; } VLIB_EARLY_CONFIG_FUNCTION (hash_test); ``` 在此示例代码,我们定义了一个`hash_pair_t`结构体,它包含一个键和一个值。我们还定义了一个`hash_table_t`结构体,它包含命次数、未命次数和一个哈希表。我们使用`hash_create()`函数初始化哈希表。`hash_pair_hash()`函数计算哈希值,`hash_pair_cmp()`函数比较两个键是否相等。`hash_table_add()`函数将一个键值对添加到哈希表,`hash_table_find()`函数在哈希表查找一个键对应的值。`hash_init()`函数在加载模块时初始化哈希表。`hash_cli()`函数处理 CLI 命令。`hash_test()`函数测试哈希表的功能。 请注意,此示例代码仅用于演示 VPP 哈希表的实现,实际使用可能需要更改代码以符合您的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值