In order to test upgrades from 26.03 -> main we need to make sure
that the evpn/vtep-fdb-list is backward compatible.  Change it
so the old format is used when there is only one path for given FDB.

Fixes: bd06abf880bb ("controller: Generate OpenFlow select groups for ECMP FDB 
entries.")
Signed-off-by: Ales Musil <[email protected]>
---
 controller/evpn-fdb.c | 32 ++++++++++++++-----------
 tests/system-ovn.at   | 54 +++++++++++++++++++++----------------------
 2 files changed, 46 insertions(+), 40 deletions(-)

diff --git a/controller/evpn-fdb.c b/controller/evpn-fdb.c
index 9da3e86e5..76ab816f3 100644
--- a/controller/evpn-fdb.c
+++ b/controller/evpn-fdb.c
@@ -235,21 +235,27 @@ evpn_fdb_list(struct unixctl_conn *conn, int argc 
OVS_UNUSED,
     const struct evpn_fdb *fdb;
     HMAP_FOR_EACH (fdb, hmap_node, fdbs) {
         ds_put_format(&ds, "UUID: "UUID_FMT", MAC: "ETH_ADDR_FMT", "
-                      "vni: %"PRIu32", dp_key: %"PRIu32
-                      ", paths: [",
-                      UUID_ARGS(&fdb->flow_uuid), ETH_ADDR_ARGS(fdb->mac),
-                      fdb->vni, fdb->dp_key);
-
-        for (size_t i = 0; i < vector_len(&fdb->paths); i++) {
-            if (i) {
-                ds_put_cstr(&ds, ", ");
-            }
+                      "vni: %"PRIu32", ", UUID_ARGS(&fdb->flow_uuid),
+                      ETH_ADDR_ARGS(fdb->mac), fdb->vni);
+
+        if (vector_len(&fdb->paths) == 1) {
             struct evpn_fdb_path path =
-                vector_get(&fdb->paths, i, struct evpn_fdb_path);
-            ds_put_format(&ds, "{key=%#"PRIx32", weight=%"PRIu16"}",
-                          path.binding_key, path.weight);
+                vector_get(&fdb->paths, 0, struct evpn_fdb_path);
+            ds_put_format(&ds, "binding_key: %#"PRIx32", dp_key: %"PRIu32"\n",
+                          path.binding_key, fdb->dp_key);
+        } else {
+            ds_put_format(&ds, "dp_key: %"PRIu32", paths: [", fdb->dp_key);
+            for (size_t i = 0; i < vector_len(&fdb->paths); i++) {
+                if (i) {
+                    ds_put_cstr(&ds, ", ");
+                }
+                struct evpn_fdb_path path =
+                    vector_get(&fdb->paths, i, struct evpn_fdb_path);
+                ds_put_format(&ds, "{key=%#"PRIx32", weight=%"PRIu16"}",
+                              path.binding_key, path.weight);
+            }
+            ds_put_cstr(&ds, "]\n");
         }
-        ds_put_cstr(&ds, "]\n");
     }
 
     unixctl_command_reply(conn, ds_cstr_ro(&ds));
diff --git a/tests/system-ovn.at b/tests/system-ovn.at
index a4afab4e5..dc3c7e979 100644
--- a/tests/system-ovn.at
+++ b/tests/system-ovn.at
@@ -18207,10 +18207,10 @@ check bridge fdb add f0:00:0f:16:10:60 dev 
$VXLAN_NAME dst 169.0.0.20 static ext
 check bridge fdb add f0:00:0f:16:10:70 dev $VXLAN_NAME dst 169.0.0.30 static 
extern_learn
 
 OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/vtep-fdb-list | cut -d',' -f2- | 
sort], [0], [dnl
- MAC: 00:00:00:00:00:01, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000003, 
weight=0}]]
- MAC: f0:00:0f:16:10:50, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000001, 
weight=0}]]
- MAC: f0:00:0f:16:10:60, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000002, 
weight=0}]]
- MAC: f0:00:0f:16:10:70, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000003, 
weight=0}]]
+ MAC: 00:00:00:00:00:01, vni: $vni, binding_key: 0x80000003, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:50, vni: $vni, binding_key: 0x80000001, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:60, vni: $vni, binding_key: 0x80000002, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:70, vni: $vni, binding_key: 0x80000003, dp_key: $dp_key
 ])
 
 AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_GET_REMOTE_FDB | 
grep priority | \
@@ -18269,10 +18269,10 @@ check bridge fdb add f0:00:0f:16:10:90 dev 
$VXLAN_NAME nhid $nh_grp_id extern_le
 
 # Verify the ECMP FDB entry has multiple paths with weights.
 OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/vtep-fdb-list | cut -d',' -f2- | 
sort], [0], [dnl
- MAC: 00:00:00:00:00:01, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000003, 
weight=0}]]
- MAC: f0:00:0f:16:10:50, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000001, 
weight=0}]]
- MAC: f0:00:0f:16:10:60, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000002, 
weight=0}]]
- MAC: f0:00:0f:16:10:70, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000003, 
weight=0}]]
+ MAC: 00:00:00:00:00:01, vni: $vni, binding_key: 0x80000003, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:50, vni: $vni, binding_key: 0x80000001, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:60, vni: $vni, binding_key: 0x80000002, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:70, vni: $vni, binding_key: 0x80000003, dp_key: $dp_key
  MAC: f0:00:0f:16:10:90, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000001, 
weight=100}, {key=0x80000002, weight=200}]]
 ])
 
@@ -18316,11 +18316,11 @@ check ip nexthop replace id $nh_grp_id group 
$nh_id1,100 fdb
 
 # Verify the entry reverts to single path.
 OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/vtep-fdb-list | cut -d',' -f2- | 
sort], [0], [dnl
- MAC: 00:00:00:00:00:01, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000003, 
weight=0}]]
- MAC: f0:00:0f:16:10:50, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000001, 
weight=0}]]
- MAC: f0:00:0f:16:10:60, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000002, 
weight=0}]]
- MAC: f0:00:0f:16:10:70, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000003, 
weight=0}]]
- MAC: f0:00:0f:16:10:90, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000001, 
weight=100}]]
+ MAC: 00:00:00:00:00:01, vni: $vni, binding_key: 0x80000003, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:50, vni: $vni, binding_key: 0x80000001, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:60, vni: $vni, binding_key: 0x80000002, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:70, vni: $vni, binding_key: 0x80000003, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:90, vni: $vni, binding_key: 0x80000001, dp_key: $dp_key
 ])
 
 AT_CHECK_UNQUOTED(
@@ -18359,10 +18359,10 @@ check bridge fdb del f0:00:0f:16:10:90 dev 
$VXLAN_NAME nhid $nh_grp_id
 
 # Verify the FDB entry is cleaned up.
 OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/vtep-fdb-list | cut -d',' -f2- | 
sort], [0], [dnl
- MAC: 00:00:00:00:00:01, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000003, 
weight=0}]]
- MAC: f0:00:0f:16:10:50, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000001, 
weight=0}]]
- MAC: f0:00:0f:16:10:60, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000002, 
weight=0}]]
- MAC: f0:00:0f:16:10:70, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000003, 
weight=0}]]
+ MAC: 00:00:00:00:00:01, vni: $vni, binding_key: 0x80000003, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:50, vni: $vni, binding_key: 0x80000001, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:60, vni: $vni, binding_key: 0x80000002, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:70, vni: $vni, binding_key: 0x80000003, dp_key: $dp_key
 ])
 
 AS_BOX([L2 EVPN FDB advertising])
@@ -19025,10 +19025,10 @@ check bridge fdb add f0:00:0f:16:10:60 dev 
$VXLAN_NAME dst 169::20 static extern
 check bridge fdb add f0:00:0f:16:10:70 dev $VXLAN_NAME dst 169::30 static 
extern_learn
 
 OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/vtep-fdb-list | cut -d',' -f2- | 
sort], [0], [dnl
- MAC: 00:00:00:00:00:01, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000003, 
weight=0}]]
- MAC: f0:00:0f:16:10:50, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000001, 
weight=0}]]
- MAC: f0:00:0f:16:10:60, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000002, 
weight=0}]]
- MAC: f0:00:0f:16:10:70, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000003, 
weight=0}]]
+ MAC: 00:00:00:00:00:01, vni: $vni, binding_key: 0x80000003, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:50, vni: $vni, binding_key: 0x80000001, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:60, vni: $vni, binding_key: 0x80000002, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:70, vni: $vni, binding_key: 0x80000003, dp_key: $dp_key
 ])
 
 AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_GET_REMOTE_FDB | 
grep priority | \
@@ -19592,12 +19592,12 @@ check bridge fdb add f0:00:0f:16:10:70 dev 
$VXLAN_NAME dst 169.0.0.30 static ext
 check bridge fdb add f0:00:0f:16:10:80 dev $VXLAN_V6_NAME dst 169::30 static 
extern_learn
 
 OVS_WAIT_FOR_OUTPUT_UNQUOTED([ovn-appctl evpn/vtep-fdb-list | cut -d',' -f2- | 
sort], [0], [dnl
- MAC: 00:00:00:00:00:01, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000004, 
weight=0}]]
- MAC: 00:00:00:00:00:10, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000005, 
weight=0}]]
- MAC: f0:00:0f:16:10:50, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000001, 
weight=0}]]
- MAC: f0:00:0f:16:10:60, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000003, 
weight=0}]]
- MAC: f0:00:0f:16:10:70, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000004, 
weight=0}]]
- MAC: f0:00:0f:16:10:80, vni: $vni, dp_key: $dp_key, paths: [[{key=0x80000005, 
weight=0}]]
+ MAC: 00:00:00:00:00:01, vni: $vni, binding_key: 0x80000004, dp_key: $dp_key
+ MAC: 00:00:00:00:00:10, vni: $vni, binding_key: 0x80000005, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:50, vni: $vni, binding_key: 0x80000001, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:60, vni: $vni, binding_key: 0x80000003, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:70, vni: $vni, binding_key: 0x80000004, dp_key: $dp_key
+ MAC: f0:00:0f:16:10:80, vni: $vni, binding_key: 0x80000005, dp_key: $dp_key
 ])
 
 AT_CHECK_UNQUOTED([ovs-ofctl dump-flows br-int table=OFTABLE_GET_REMOTE_FDB | 
grep priority | \
-- 
2.54.0

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

Reply via email to