Introduce the capability to enable/disable the advertisement of a
specific EVPN MAC/IP binding configuring the LSP dynamic-routing-advertise
option. This parameter is relavant if the CMS configures
dynamic-routing-redistribute option to fdb,ip in the Logical_Switch
other_config column.

Reported-at: https://redhat.atlassian.net/browse/FDP-2743
Signed-off-by: Lorenzo Bianconi <[email protected]>
---
 controller/neighbor.c |  8 ++++++++
 northd/northd.c       |  8 ++++++++
 ovn-sb.xml            |  9 +++++++++
 tests/system-ovn.at   | 23 +++++++++++++++++++++++
 4 files changed, 48 insertions(+)

diff --git a/controller/neighbor.c b/controller/neighbor.c
index 57df1e90c..8d8c2f875 100644
--- a/controller/neighbor.c
+++ b/controller/neighbor.c
@@ -280,6 +280,10 @@ neighbor_collect_mac_to_advertise(const struct 
neighbor_ctx_in *n_ctx_in,
             continue;
         }
 
+        if (!smap_get_bool(&pb->options, "dynamic-routing-advertise", true)) {
+            continue;
+        }
+
         for (size_t i = 0; i < pb->n_mac; i++) {
             struct lport_addresses addresses;
             if (!extract_lsp_addresses(pb->mac[i], &addresses)) {
@@ -329,6 +333,10 @@ neighbor_collect_ip_mac_to_advertise(
             continue;
         }
 
+        if (!smap_get_bool(&pb->options, "dynamic-routing-advertise", true)) {
+            continue;
+        }
+
         struct in6_addr ip;
         if (!ip46_parse(adv_mb->ip, &ip)) {
             continue;
diff --git a/northd/northd.c b/northd/northd.c
index b9de69fae..2d1483948 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -2907,6 +2907,14 @@ ovn_port_update_sbrec(struct ovsdb_idl_txn *ovnsb_txn,
                 smap_add(&options, "peer", op->peer->key);
             }
 
+            const char *dynamic_routing_advertise =
+                smap_get(&op->nbsp->options, "dynamic-routing-advertise");
+            if (dynamic_routing_advertise) {
+                smap_add(&options, "dynamic-routing-advertise",
+                         !strcasecmp(dynamic_routing_advertise, "false")
+                         ? "false" : "true");
+            }
+
             sbrec_port_binding_set_options(op->sb, &options);
             smap_destroy(&options);
             if (lsp_is_switch(op->nbsp)) {
diff --git a/ovn-sb.xml b/ovn-sb.xml
index 46568da62..d839c7088 100644
--- a/ovn-sb.xml
+++ b/ovn-sb.xml
@@ -3889,6 +3889,15 @@ tcp.flags = RST;
         <code>queue_id</code> used in OpenFlow in <code>struct
         ofp_action_enqueue</code>.
       </column>
+
+      <column name="options" key="dynamic-routing-advertise">
+        If the CSM set <ref column="other_config"
+        key="dynamic-routing-redistribute" table="Logical_Switch"/> to
+        <code>fdb</code> and/or <code>ip</code>, this parameter is used
+        by the CMS to enable/disable the advertisement of LSP IPs/MAC binding.
+        Default: <code>true</code>.
+      </column>
+
     </group>
 
     <group title="Distributed Gateway Port Options">
diff --git a/tests/system-ovn.at b/tests/system-ovn.at
index 649e85ec1..f7ecab7d8 100644
--- a/tests/system-ovn.at
+++ b/tests/system-ovn.at
@@ -18491,6 +18491,22 @@ f0:00:0f:16:01:20 dev $LO_NAME master $BR_NAME static
 f0:00:0f:16:01:20 dev $LO_NAME vlan 1 master $BR_NAME static
 ])
 
+ls_evpn_w1_uuid=$(fetch_column nb:Logical_Switch_Port _uuid name="workload1")
+check ovn-nbctl --wait=hv set Logical_Switch_Port $ls_evpn_w1_uuid 
options:dynamic-routing-advertise=false
+ls_evpn_w2_uuid=$(fetch_column nb:Logical_Switch_Port _uuid name="workload2")
+check ovn-nbctl --wait=hv set Logical_Switch_Port $ls_evpn_w2_uuid 
options:dynamic-routing-advertise=false
+OVS_WAIT_FOR_OUTPUT_UNQUOTED([bridge fdb show | grep $LO_NAME | grep 
"f0:00:0f:16:01" | sort], [0], [dnl
+])
+
+check ovn-nbctl --wait=hv set Logical_Switch_Port $ls_evpn_w1_uuid 
options:dynamic-routing-advertise=true
+check ovn-nbctl --wait=hv set Logical_Switch_Port $ls_evpn_w2_uuid 
options:dynamic-routing-advertise=true
+OVS_WAIT_FOR_OUTPUT_UNQUOTED([bridge fdb show | grep $LO_NAME | grep 
"f0:00:0f:16:01" | sort], [0], [dnl
+f0:00:0f:16:01:10 dev $LO_NAME master $BR_NAME static
+f0:00:0f:16:01:10 dev $LO_NAME vlan 1 master $BR_NAME static
+f0:00:0f:16:01:20 dev $LO_NAME master $BR_NAME static
+f0:00:0f:16:01:20 dev $LO_NAME vlan 1 master $BR_NAME static
+])
+
 check ovn-nbctl --wait=hv lsp-del workload2
 OVS_WAIT_FOR_OUTPUT_UNQUOTED([bridge fdb show | grep $LO_NAME | grep 
"f0:00:0f:16:01" | sort], [0], [dnl
 f0:00:0f:16:01:10 dev $LO_NAME master $BR_NAME static
@@ -18737,6 +18753,13 @@ AT_CHECK([ip neigh show dev $BR_NAME nud noarp | grep 
-q '172.16.1.1 lladdr f0:0
 AT_CHECK([ip -6 neigh show dev $BR_NAME nud noarp | grep -q '172:16::10 lladdr 
f0:00:0f:16:01:10 NOARP'])
 AT_CHECK([ip -6 neigh show dev $BR_NAME nud noarp | grep -q '172:16::1 lladdr 
f0:00:0f:16:01:01 NOARP'])
 
+check ovn-nbctl --wait=hv set Logical_Switch_Port $ls_evpn_w1_uuid 
options:dynamic-routing-advertise=false
+AT_CHECK([ip neigh show dev $BR_NAME nud noarp | grep -q '172.16.1.10 lladdr 
f0:00:0f:16:01:10 NOARP'], [1])
+AT_CHECK([ip -6 neigh show dev $BR_NAME nud noarp | grep -q '172:16::10 lladdr 
f0:00:0f:16:01:10 NOARP'], [1])
+check ovn-nbctl --wait=hv set Logical_Switch_Port $ls_evpn_w1_uuid 
options:dynamic-routing-advertise=true
+AT_CHECK([ip neigh show dev $BR_NAME nud noarp | grep -q '172.16.1.10 lladdr 
f0:00:0f:16:01:10 NOARP'])
+AT_CHECK([ip -6 neigh show dev $BR_NAME nud noarp | grep -q '172:16::10 lladdr 
f0:00:0f:16:01:10 NOARP'])
+
 OVS_WAIT_FOR_OUTPUT_UNQUOTED([bridge fdb show | grep $LO_NAME | grep 
"f0:00:0f:16:01" | sort], [0], [dnl
 f0:00:0f:16:01:01 dev $LO_NAME master $BR_NAME static
 f0:00:0f:16:01:01 dev $LO_NAME vlan 1 master $BR_NAME static
-- 
2.54.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to