If OVN creates static routes with bfd option, we should keep forwarding
BFD packets to router ingress pipeline.
Fixes: 370527673c2b ("northd: Routing protocol port redirection.")
Signed-off-by: Lorenzo Bianconi <[email protected]>
---
northd/northd.c | 32 +++++++++++++++++++++++---------
tests/ovn-northd.at | 10 ++++++++++
tests/system-ovn.at | 5 +++++
3 files changed, 38 insertions(+), 9 deletions(-)
diff --git a/northd/northd.c b/northd/northd.c
index b49c6d693..8cfc6f34e 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -14545,11 +14545,19 @@ build_routing_protocols_redirect_rule__(
const char *s_addr, const char *redirect_port_name, int protocol_port,
const char *proto, bool is_ipv6, struct ovn_port *ls_peer,
struct lflow_table *lflows, struct ds *match, struct ds *actions,
- struct lflow_ref *lflow_ref)
+ struct lflow_ref *lflow_ref, bool clone)
{
int ip_ver = is_ipv6 ? 6 : 4;
ds_clear(actions);
- ds_put_format(actions, "outport = \"%s\"; output;", redirect_port_name);
+ if (clone) {
+ ds_put_format(actions,
+ "clone { outport = \"%s\"; output; }; "
+ "outport = %s; output;",
+ redirect_port_name, ls_peer->json_key);
+ } else {
+ ds_put_format(actions, "outport = \"%s\"; output;",
+ redirect_port_name);
+ }
/* Redirect packets in the input pipeline destined for LR's IP
* and the routing protocol's port to the LSP specified in
@@ -14577,20 +14585,21 @@ static void
apply_routing_protocols_redirect__(
const char *s_addr, const char *redirect_port_name, int protocol_flags,
bool is_ipv6, struct ovn_port *ls_peer, struct lflow_table *lflows,
- struct ds *match, struct ds *actions, struct lflow_ref *lflow_ref)
+ struct ds *match, struct ds *actions, struct lflow_ref *lflow_ref,
+ bool clone_bfd_traffic)
{
if (protocol_flags & REDIRECT_BGP) {
build_routing_protocols_redirect_rule__(s_addr, redirect_port_name,
179, "tcp", is_ipv6, ls_peer,
lflows, match, actions,
- lflow_ref);
+ lflow_ref, false);
}
if (protocol_flags & REDIRECT_BFD) {
build_routing_protocols_redirect_rule__(s_addr, redirect_port_name,
3784, "udp", is_ipv6, ls_peer,
lflows, match, actions,
- lflow_ref);
+ lflow_ref, clone_bfd_traffic);
}
/* Because the redirected port shares IP and MAC addresses with the LRP,
@@ -14658,7 +14667,7 @@ static void
build_lrouter_routing_protocol_redirect(
struct ovn_port *op, struct lflow_table *lflows, struct ds *match,
struct ds *actions, struct lflow_ref *lflow_ref,
- const struct hmap *ls_ports)
+ const struct hmap *ls_ports, const struct sset *bfd_ports)
{
/* LRP has to have a peer.*/
if (!op->peer) {
@@ -14714,6 +14723,11 @@ build_lrouter_routing_protocol_redirect(
return;
}
+ /* If BFD support is enabled in OVN we need to forward it to router
+ * pipeline.
+ */
+ bool clone_bfd_traffic = (redirected_protocols & REDIRECT_BFD) &&
+ bfd_is_port_running(bfd_ports, op->key);
/* Redirect traffic destined for LRP's IPs and the specified routing
* protocol ports to the port defined in 'routing-protocol-redirect'
* option.*/
@@ -14722,14 +14736,14 @@ build_lrouter_routing_protocol_redirect(
apply_routing_protocols_redirect__(ip_s, redirect_port_name,
redirected_protocols, false,
op->peer, lflows, match, actions,
- lflow_ref);
+ lflow_ref, clone_bfd_traffic);
}
for (size_t i = 0; i < op->lrp_networks.n_ipv6_addrs; i++) {
const char *ip_s = op->lrp_networks.ipv6_addrs[i].addr_s;
apply_routing_protocols_redirect__(ip_s, redirect_port_name,
redirected_protocols, true,
op->peer, lflows, match, actions,
- lflow_ref);
+ lflow_ref, clone_bfd_traffic);
}
/* Drop ARP replies and IPv6 RA/NA packets originating from
@@ -17956,7 +17970,7 @@ build_lswitch_and_lrouter_iterate_by_lrp(struct
ovn_port *op,
&lsi->actions, op->lflow_ref);
build_lrouter_routing_protocol_redirect(op, lsi->lflows, &lsi->match,
&lsi->actions, op->lflow_ref,
- lsi->ls_ports);
+ lsi->ls_ports, lsi->bfd_ports);
}
static void *
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index 47e8817ea..a5c2bc6c4 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -14307,6 +14307,16 @@ AT_CHECK([ovn-sbctl dump-flows ls | grep
ls_in_check_port_sec | grep "priority=8
table=??(ls_in_check_port_sec), priority=80 , match=(inport == "lsp-bgp"
&& nd_ra), action=(reg0[[15]] = 1; next;)
])
+# Add OVN BFD static routes and check the BFD control packets are properly
+# cloned and redirected to "lsp-bgp".
+check ovn-nbctl --wait=sb --bfd lr-route-add lr 100.0.0.0/8 172.16.1.2 lr-ls
+AT_CHECK([ovn-sbctl dump-flows ls | grep ls_in_l2_lkup | grep -E "udp.dst ==
3784|udp.src == 3784" | ovn_strip_lflows], [0], [dnl
+ table=??(ls_in_l2_lkup ), priority=100 , match=(ip4.dst == 172.16.1.1
&& udp.dst == 3784), action=(clone { outport = "lsp-bgp"; output; }; outport =
"ls-lr"; output;)
+ table=??(ls_in_l2_lkup ), priority=100 , match=(ip4.dst == 172.16.1.1
&& udp.src == 3784), action=(clone { outport = "lsp-bgp"; output; }; outport =
"ls-lr"; output;)
+ table=??(ls_in_l2_lkup ), priority=100 , match=(ip6.dst ==
fe80::ac:10ff:fe01:1 && udp.dst == 3784), action=(clone { outport = "lsp-bgp";
output; }; outport = "ls-lr"; output;)
+ table=??(ls_in_l2_lkup ), priority=100 , match=(ip6.dst ==
fe80::ac:10ff:fe01:1 && udp.src == 3784), action=(clone { outport = "lsp-bgp";
output; }; outport = "ls-lr"; output;)
+])
+
# Remove 'bgp-redirect' option from LRP and check that rules are removed
check ovn-nbctl --wait=sb remove logical_router_port lr-ls options
routing-protocol-redirect
check ovn-nbctl --wait=sb remove logical_router_port lr-ls options
routing-protocols
diff --git a/tests/system-ovn.at b/tests/system-ovn.at
index 5f67b6997..4f1cc0422 100644
--- a/tests/system-ovn.at
+++ b/tests/system-ovn.at
@@ -7360,6 +7360,11 @@ check ovn-nbctl set logical_router R1 options:chassis=hv1
check ovn-nbctl set logical_router R1 options:dynamic-routing=true
check ovn-nbctl set Logical_Router_Port rp-public
options:dynamic-routing-redistribute="connected,static"
check ovn-nbctl set logical_router_static_route $route_uuid bfd=$uuid
+# set option that redirects BGP and BFD traffic to a LSP "bgp-daemon".
+# OVN should continue to keep BFD static route state.
+check ovn-nbctl lsp-add public bgp-daemon -- lsp-set-addresses bgp-daemon
unknown
+check ovn-nbctl --wait=sb set logical_router_port rp-public
options:routing-protocol-redirect=bgp-daemon
+check ovn-nbctl --wait=sb set logical_router_port rp-public
options:routing-protocols=BGP,BFD
# restart bfdd
NETNS_DAEMONIZE([server], [bfdd-beacon --nofork --tee --listen=172.16.1.50
>beacon.stdout 2>&1], [beacon.pid])
--
2.51.0
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev