OVN BFD 代码简记

93 阅读3分钟

最近在想 ovn 的 BFD 是否支持 “单臂回声” 的问题,所以查查代码看下是如何实现的

image.png

PR 参考: github.com/ovn-org/ovn…

关于 BFD 状态(机)控制

image.png

BFD 封包

image.png

LRP 和 BFD 关联

image.png

ovn BFD 表的维护

image.png

OVN northd 维护着 BFD 表 和 ovs 流表的转换

image.png

静态路由配合 BFD 使用


# ovn/tests/ovn-nbctl.at

...

AT_CHECK([ovn-nbctl lr-route-add lr0 10.0.10.0/24 lp0])
AT_CHECK([ovn-nbctl --bfd lr-route-add lr0 10.0.20.0/24 11.0.2.1 lp0])


AT_CHECK([ovn-nbctl lr-route-list lr0], [0], [dnl
IPv4 Routes
Route Table <main>:
              10.0.0.0/24                  11.0.0.1 dst-ip
              10.0.1.0/24                  11.0.1.1 dst-ip lp0
             10.0.10.0/24                           dst-ip lp0
             10.0.20.0/24                  11.0.2.1 dst-ip lp0 bfd
              20.0.0.0/24                   discard dst-ip
              9.16.1.0/24                  11.0.0.1 src-ip
              10.0.0.0/24                  11.0.0.2 src-ip
              20.0.0.0/24                   discard src-ip
                0.0.0.0/0               192.168.0.1 dst-ip


check_row_count nb:BFD 1
AT_CHECK([ovn-nbctl lr-route-del lr0 10.0.20.0/24])
check_row_count nb:BFD 0

# 这个意思应该是只要创建了基于 BFD 的静态路由, BFD table 就会自动产生一条记录


而实现 ecmp 的 基于 bfd 的静态路由,则需要手动创建 BFD



dnl Check IPv4 and IPv6 routes
AT_CHECK([ovn-nbctl lr-route-add lr0 0.0.0.0/0 192.168.0.1])
AT_CHECK([ovn-nbctl lr-route-add lr0 10.0.1.1/24 11.0.1.1 lp0])
AT_CHECK([ovn-nbctl lr-route-add lr0 10.0.0.1/24 11.0.0.1])
AT_CHECK([ovn-nbctl lr-route-add lr0 0:0:0:0:0:0:0:0/0 2001:0db8:0:f101::1])
AT_CHECK([ovn-nbctl lr-route-add lr0 2001:0db8:0::/64 2001:0db8:0:f102::1 lp0])
AT_CHECK([ovn-nbctl --ecmp lr-route-add lr0 2001:0db8:1::/64 2001:0db8:0:f103::1])
AT_CHECK([ovn-nbctl --ecmp lr-route-add lr0 2001:0db8:1::/64 2001:0db8:0:f103::2])
AT_CHECK([ovn-nbctl --ecmp lr-route-add lr0 2001:0db8:1::/64 2001:0db8:0:f103::3])
AT_CHECK([ovn-nbctl --ecmp lr-route-add lr0 2001:0db8:1::/64 2001:0db8:0:f103::4])
AT_CHECK([ovn-nbctl lr-route-add lr0 2002:0db8:1::/64 2001:0db8:0:f103::5])
AT_CHECK([ovn-nbctl --ecmp-symmetric-reply lr-route-add lr0 2003:0db8:1::/64 2001:0db8:0:f103::6])
AT_CHECK([ovn-nbctl --ecmp-symmetric-reply lr-route-add lr0 2003:0db8:1::/64 2001:0db8:0:f103::6], [1], [],
  [ovn-nbctl: duplicate nexthop for the same ECMP route
])
AT_CHECK([ovn-nbctl --may-exist --ecmp-symmetric-reply lr-route-add lr0 2003:0db8:1::/64 2001:0db8:0:f103::6])

AT_CHECK([ovn-nbctl lr-route-list lr0], [0], [dnl
IPv4 Routes
Route Table <main>:
              10.0.0.0/24                  11.0.0.1 dst-ip
              10.0.1.0/24                  11.0.1.1 dst-ip lp0
                0.0.0.0/0               192.168.0.1 dst-ip

IPv6 Routes
Route Table <main>:
            2001:db8::/64        2001:db8:0:f102::1 dst-ip lp0
          2001:db8:1::/64        2001:db8:0:f103::1 dst-ip ecmp
          2001:db8:1::/64        2001:db8:0:f103::2 dst-ip ecmp
          2001:db8:1::/64        2001:db8:0:f103::3 dst-ip ecmp
          2001:db8:1::/64        2001:db8:0:f103::4 dst-ip ecmp
          2002:db8:1::/64        2001:db8:0:f103::5 dst-ip
          2003:db8:1::/64        2001:db8:0:f103::6 dst-ip ecmp-symmetric-reply
                     ::/0        2001:db8:0:f101::1 dst-ip
])

AT_CHECK([ovn-nbctl lrp-add lr0 lr0-p0 00:00:01:01:02:03 192.168.10.1/24])
bfd_uuid=$(ovn-nbctl create bfd logical_port=lr0-p0 dst_ip=100.0.0.50 status=down min_tx=250 min_rx=250 detect_mult=10)
AT_CHECK([ovn-nbctl lr-route-add lr0 100.0.0.0/24 192.168.0.1])
route_uuid=$(fetch_column nb:logical_router_static_route _uuid ip_prefix="100.0.0.0/24")
AT_CHECK([ovn-nbctl set logical_router_static_route $route_uuid bfd=$bfd_uuid])


image.png

ovn 社区会在草案通过之后才会考虑实现 单臂回声 的 bfd 探测。

ovn 的 BFD 功能可以使用 bfdd-beacon 和 bfdd-control 来模拟测试


# ovn/tests/system-ovn.at

NS_CHECK_EXEC([server], [bfdd-beacon --listen=172.16.1.50], [0])
NS_CHECK_EXEC([server], [bfdd-control allow 172.16.1.1], [0], [dnl
Allowing connections from 172.16.1.1
])