前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >vpp bfd模块配置及转发总结

vpp bfd模块配置及转发总结

作者头像
dpdk-vpp源码解读
发布2023-03-07 17:21:19
9211
发布2023-03-07 17:21:19
举报
文章被收录于专栏:DPDK VPP源码分析DPDK VPP源码分析

环境配置

1、Rpm包方式按照最新vpp release版本
代码语言:javascript
复制
#下载并按照vpp rpm源
curl -s https://packagecloud.io/install/repositories/fdio/release/script.rpm.sh | sudo bash
#安装vpp版本
yum -y install vpp vpp-lib vpp-plugin* vpp-devel

1、安装方式来源于fdio开源项目https://gerrit.fd.io/r/sweetcomb中Makefile文件,Ubuntu版本请自己查阅。 rpm包安装vpp后,如果需要删除可以通过下面的命令 for vpp_rpm in rpm -qa | grep vpp do rpm -e --nodeps $vpp_rpm done

2、bfd基本配置
代码语言:javascript
复制
B#vpp1 配置
代码语言:javascript
复制
set interface state GigabitEthernet13/0/0 up
set interface ip address GigabitEthernet13/0/0 192.168.1.2/31
#配置bfd
bfd udp session add interface GigabitEthernet13/0/0 local-addr 192.168.1.2 peer-addr 192.168.1.3 desired-min-tx 1000000 required-min-rx 1000000 detect-mult 3
#vpp2 配置
set interface state GigabitEthernet13/0/0 up
set interface ip address GigabitEthernet13/0/0 192.168.1.3/31
#配置bfd
bfd udp session add interface GigabitEthernet13/0/0 local-addr 192.168.1.3 peer-addr 192.168.1.2 desired-min-tx 2000000 required-min-rx 200000 detect-mult 5

参照华为的配置默认情况下都需要指定bfd的本地和远程会话描述符,bfd报文中需要携带本地和对端会话描述符,当收到bfd报文Your Discriminator不是本地bfd配置中,会直接丢弃掉。vpp默认不会配置会话描述符,本地会话描述符是随机生成的。首次收到对端bfd报文中Your Discriminator默认设置为0,会通过报文的接收索引+报文sip+dip组成三元组查询本地bfd会话表,如果存在就处理(保存对端会话描述符,柄,并创建会话描述符和会话表索引的hash关系,下次通过会话描述符来查询),不存在直接丢弃。

基本转发流程

1、bfd 发包流程

在vnet\bfd\bfd_main.c中会创建一个bfd的process节点。主要有2个任务: 1、通过事件的方式,监听新的bfd会话加入和bfd会话配置更新动作。 2、通过时间轮方式获取bfd会话最近下一个需要发包的时间,设置定时任务来触发,时间到会启动时间轮过期事件处理,启动bfd发包流程。

1、bfd 发包是需要走arp还是rewrite节点? 首次创建bud会话时,需要生成到达对端的adj表信息,使用peer_addr作为下一跳IP和接口索引来查询路由,如果查不到,就会创建一个adj,adj的处理是送到arp节点,会发送arp报文。最终由arp学习生成32位路由,更新adj信息为rewrite。 2、bfd报文Pool标识位使用 当bfd配置参数变更时,需要置位P标识,对端收到带有p标识的报文需要立即回应,并且回应报文中需要置位F,收到F的报文需要更新本地状态。下面是我们在vpp2上修改发送或接收的最小间隔时间,在对端抓包如下:

代码语言:javascript
复制
bfd udp session mod interface GigabitEthernet13/0/0 local-addr 192.168.1.3 peer-addr 192.168.1.2 desired-min-tx  3000000 required-min-rx 300000 detect-mult 5
2、bfd 收包处理流程

bfd配置流程后,会注册udp端口号3784(对应bfd-udp4-input节点)和3785(对应bfd_udp_echo4_input节点)对应的处理节点。

代码语言:javascript
复制
#bfd_udp_add_session()->bfd_udp_add_session_internal()函数:
udp_register_dst_port (vm, UDP_DST_PORT_bfd4,
                 bfd_udp4_input_node.index, 1);
udp_register_dst_port (vm, UDP_DST_PORT_bfd_echo4,
                 bfd_udp_echo4_input_node.index, 1);

具体转发流程相对比较简单,具体如下图:

1、BFD控制报文实际发送时间间隔=本端Desired Min TX Interval与对端Required Min RX Interval之中的最大值,也就是说比较慢的一方决定了发送频率。 2、检测时间=对端BFD控制报文中的Detect Mult乘以经过协商的对端BFD控制报文发送时间间隔。

其他命令配置学习

1、admindown设置

通过配置BFD会话进入AdminDown状态,本端处于admindown状态,对端收到此状态后设置为down状态,diag设置为3( Neighbor Signaled Session Down (0x03)),停止bfd检测功能

代码语言:javascript
复制
bfd udp session set-flags interface GigabitEthernet13/0/0 local-addr 192.168.1.3 peer-addr 192.168.1.2 admin down

1、抓取192.168.1.3发往192.168.1.2的admindown流。

2、抓取192.168.1.2回应192.168.1.3的报文,告知本段状态是Down。

2、设置认证模式

先配置vpp2,认证激活启用延迟生效策略,再配置vpp1直接生效模式。

上一篇文章对延迟选项设置作用有介绍,这里就不再说了。

代码语言:javascript
复制
#vpp1
bfd key set conf-key-id 2368880803 type meticulous-keyed-sha1 secret 69d685b0d990cdba46872706dc
bfd udp session auth activate interface GigabitEthernet13/0/0 local-addr 192.168.1.2 peer-addr 192.168.1.3 conf-key-id 2368880803  bfd-key-id 239

#vpp2
bfd key set conf-key-id 2368880803 type meticulous-keyed-sha1 secret 69d685b0d990cdba46872706dc
bfd udp session auth activate interface GigabitEthernet13/0/0 local-addr 192.168.1.3 peer-addr 192.168.1.2 conf-key-id 2368880803  bfd-key-id 239 delayed yes

在vpp1上同时抓取双向的流量,查询vpp1发送2个认证模式的报文后,vpp2才开始回应认证报文。查看如下:

延迟选项配置大致实现思路如下:

1、vpp2 配置认证模式,并开启延迟生效选项。设置对应会话的is_delayed=1,并且设置next_key指向用户刚配置的key。

2、vpp1配置认证模式,理解生效,设置curr_key为配置key,bfd报文发送时判断curr_key不为空,就发送带有key的bfd报文

3、vpp2收到带有认证选项的bfd报文后。按照如下策略处理:

1、判断curr_key为空时,并且开启延迟选项,就使用next_key进行认证。

2、如果当前key不为空,直接使用当前key进行认证,认证不通过再判断是否开启延迟选项,如果开启验证选项,使用next_key进行认证。

认证模式延迟生效策略实现也比较巧妙,保证了bfd会话的安全性。

疑问

1、bfd只配置一端时,两端是无法ping通的。

当只在vpp2环境上配置bfd后,此时在vpp1上ping vpp2接口的ip是不通的,在vpp2上查看路由发现是drop的。但是在vpp2上可以抓取bfd报文。

代码语言:javascript
复制
vpp# show ip fib  192.168.1.2
.....
 forwarding:   unicast-ip4-chain #这里是drop
  [@0]: dpo-load-balance: [proto:ip4 index:9 buckets:1 uRPF:8 to:[14:1152] via:[23:2208]]
    [0] [@0]: dpo-drop ip4

此时在vpp2上配置bfd后,vpp2的路由恢复正常。

应该是通过函数bfd_register_listener来注册bfd状态变更时通告回调函数来更新路由的变化。但是路由时drop时,bfd报文是能够正常发送到对端的,不清楚是否属于正常?

2、bfd echo source模式是如何配置的?

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DPDK VPP源码分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、Rpm包方式按照最新vpp release版本
  • 2、bfd基本配置
  • 基本转发流程
    • 1、bfd 发包流程
      • 2、bfd 收包处理流程
      • 其他命令配置学习
        • 1、admindown设置
          • 2、设置认证模式
          • 疑问
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档