The match wasn't cleared which led to matches being appended together
and the ovn-controller failed to parse them.

Fixes: 3faadc76ad71 ("northd: Fix pmtud for non routed traffic.")
Signed-off-by: Ales Musil <[email protected]>
---
 northd/northd.c     |  3 ++-
 tests/ovn-northd.at | 24 ++++++++++++++++++++++--
 2 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/northd/northd.c b/northd/northd.c
index 495b838fc..a78cbcd53 100644
--- a/northd/northd.c
+++ b/northd/northd.c
@@ -11989,9 +11989,9 @@ build_lswitch_icmp_packet_toobig_admin_flows(
 {
     ovs_assert(op->nbsp);
 
-    ds_clear(match);
     if (!lsp_is_router(op->nbsp)) {
         for (size_t i = 0; i < op->n_lsp_addrs; i++) {
+            ds_clear(match);
             ds_put_format(match,
                           "((ip4 && icmp4.type == 3 && icmp4.code == 4) ||"
                           " (ip6 && icmp6.type == 2 && icmp6.code == 0)) &&"
@@ -12011,6 +12011,7 @@ build_lswitch_icmp_packet_toobig_admin_flows(
         return;
     }
 
+    ds_clear(match);
     if (peer->od->is_gw_router) {
         ds_put_format(match,
                       "((ip4 && icmp4.type == 3 && icmp4.code == 4) ||"
diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
index 7f579630c..f3ffb4a6d 100644
--- a/tests/ovn-northd.at
+++ b/tests/ovn-northd.at
@@ -8752,8 +8752,8 @@ ovn_strip_lflows ], [0], [dnl
   table=??(ls_out_check_port_sec), priority=100  , match=(eth.mcast), 
action=(reg0[[15]] = 0; next;)
 ])
 
-check ovn-nbctl lsp-add sw0 sw0p1 -- lsp-set-addresses sw0p1 
"00:00:00:00:00:01"
-check ovn-nbctl lsp-add sw0 sw0p2 -- lsp-set-addresses sw0p2 
"00:00:00:00:00:02"
+check ovn-nbctl lsp-add sw0 sw0p1 -- lsp-set-addresses sw0p1 
"00:00:00:00:00:01" "00:00:00:00:01:01"
+check ovn-nbctl lsp-add sw0 sw0p2 -- lsp-set-addresses sw0p2 
"00:00:00:00:00:02" "00:00:00:00:02:02"
 check ovn-nbctl --wait=sb lsp-add sw0 localnetport -- lsp-set-type 
localnetport localnet
 
 ovn-sbctl dump-flows sw0 > sw0flows
@@ -8768,11 +8768,15 @@ ovn_strip_lflows ], [0], [dnl
   table=??(ls_in_check_port_sec), priority=105  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
flags.tunnel_rx == 1), action=(drop;)
   table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:00:01 && outport == "sw0p1" && 
!is_chassis_resident("sw0p1") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
   table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:00:02 && outport == "sw0p2" && 
!is_chassis_resident("sw0p2") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
+  table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:01:01 && outport == "sw0p1" && 
!is_chassis_resident("sw0p1") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
+  table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:02:02 && outport == "sw0p2" && 
!is_chassis_resident("sw0p2") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
   table=??(ls_in_check_port_sec), priority=50   , match=(1), 
action=(reg0[[15]] = check_in_port_sec(); next;)
   table=??(ls_in_l2_lkup      ), priority=0    , match=(1), action=(outport = 
get_fdb(eth.dst); next;)
   table=??(ls_in_l2_lkup      ), priority=110  , match=(eth.dst == 
$svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
   table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:00:01), action=(outport = "sw0p1"; output;)
   table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:00:02), action=(outport = "sw0p2"; output;)
+  table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:01:01), action=(outport = "sw0p1"; output;)
+  table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:02:02), action=(outport = "sw0p2"; output;)
   table=??(ls_in_l2_lkup      ), priority=70   , match=(eth.mcast), 
action=(outport = "_MC_flood"; output;)
   table=??(ls_in_l2_unknown   ), priority=0    , match=(1), action=(output;)
   table=??(ls_in_l2_unknown   ), priority=50   , match=(outport == "none"), 
action=(drop;)
@@ -8797,11 +8801,15 @@ ovn_strip_lflows ], [0], [dnl
   table=??(ls_in_check_port_sec), priority=105  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
flags.tunnel_rx == 1), action=(drop;)
   table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:00:01 && outport == "sw0p1" && 
!is_chassis_resident("sw0p1") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
   table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:00:02 && outport == "sw0p2" && 
!is_chassis_resident("sw0p2") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
+  table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:01:01 && outport == "sw0p1" && 
!is_chassis_resident("sw0p1") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
+  table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:02:02 && outport == "sw0p2" && 
!is_chassis_resident("sw0p2") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
   table=??(ls_in_check_port_sec), priority=50   , match=(1), 
action=(reg0[[15]] = check_in_port_sec(); next;)
   table=??(ls_in_l2_lkup      ), priority=0    , match=(1), action=(outport = 
get_fdb(eth.dst); next;)
   table=??(ls_in_l2_lkup      ), priority=110  , match=(eth.dst == 
$svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
   table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:00:01), action=(outport = "sw0p1"; output;)
   table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:00:02), action=(outport = "sw0p2"; output;)
+  table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:01:01), action=(outport = "sw0p1"; output;)
+  table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:02:02), action=(outport = "sw0p2"; output;)
   table=??(ls_in_l2_lkup      ), priority=70   , match=(eth.mcast), 
action=(outport = "_MC_flood"; output;)
   table=??(ls_in_l2_unknown   ), priority=0    , match=(1), action=(output;)
   table=??(ls_in_l2_unknown   ), priority=50   , match=(outport == "none"), 
action=(drop;)
@@ -8827,11 +8835,15 @@ ovn_strip_lflows ], [0], [dnl
   table=??(ls_in_check_port_sec), priority=105  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
flags.tunnel_rx == 1), action=(drop;)
   table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:00:01 && outport == "sw0p1" && 
!is_chassis_resident("sw0p1") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
   table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:00:02 && outport == "sw0p2" && 
!is_chassis_resident("sw0p2") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
+  table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:01:01 && outport == "sw0p1" && 
!is_chassis_resident("sw0p1") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
+  table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:02:02 && outport == "sw0p2" && 
!is_chassis_resident("sw0p2") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
   table=??(ls_in_check_port_sec), priority=50   , match=(1), 
action=(reg0[[15]] = check_in_port_sec(); next;)
   table=??(ls_in_l2_lkup      ), priority=0    , match=(1), action=(outport = 
get_fdb(eth.dst); next;)
   table=??(ls_in_l2_lkup      ), priority=110  , match=(eth.dst == 
$svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
   table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:00:01), action=(drop;)
   table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:00:02), action=(outport = "sw0p2"; output;)
+  table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:01:01), action=(drop;)
+  table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:02:02), action=(outport = "sw0p2"; output;)
   table=??(ls_in_l2_lkup      ), priority=70   , match=(eth.mcast), 
action=(outport = "_MC_flood"; output;)
   table=??(ls_in_l2_unknown   ), priority=0    , match=(1), action=(output;)
   table=??(ls_in_l2_unknown   ), priority=50   , match=(outport == "none"), 
action=(drop;)
@@ -8856,12 +8868,16 @@ ovn_strip_lflows ], [0], [dnl
   table=??(ls_in_check_port_sec), priority=105  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
flags.tunnel_rx == 1), action=(drop;)
   table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:00:01 && outport == "sw0p1" && 
!is_chassis_resident("sw0p1") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
   table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:00:02 && outport == "sw0p2" && 
!is_chassis_resident("sw0p2") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
+  table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:01:01 && outport == "sw0p1" && 
!is_chassis_resident("sw0p1") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
+  table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:02:02 && outport == "sw0p2" && 
!is_chassis_resident("sw0p2") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
   table=??(ls_in_check_port_sec), priority=50   , match=(1), 
action=(reg0[[15]] = check_in_port_sec(); next;)
   table=??(ls_in_check_port_sec), priority=70   , match=(inport == "sw0p2"), 
action=(set_queue(10); reg0[[15]] = check_in_port_sec(); next;)
   table=??(ls_in_l2_lkup      ), priority=0    , match=(1), action=(outport = 
get_fdb(eth.dst); next;)
   table=??(ls_in_l2_lkup      ), priority=110  , match=(eth.dst == 
$svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
   table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:00:01), action=(drop;)
   table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:00:02), action=(outport = "sw0p2"; output;)
+  table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:01:01), action=(drop;)
+  table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:02:02), action=(outport = "sw0p2"; output;)
   table=??(ls_in_l2_lkup      ), priority=70   , match=(eth.mcast), 
action=(outport = "_MC_flood"; output;)
   table=??(ls_in_l2_unknown   ), priority=0    , match=(1), action=(output;)
   table=??(ls_in_l2_unknown   ), priority=50   , match=(outport == "none"), 
action=(drop;)
@@ -8888,6 +8904,8 @@ ovn_strip_lflows ], [0], [dnl
   table=??(ls_in_check_port_sec), priority=105  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
flags.tunnel_rx == 1), action=(drop;)
   table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:00:01 && outport == "sw0p1" && 
!is_chassis_resident("sw0p1") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
   table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:00:02 && outport == "sw0p2" && 
!is_chassis_resident("sw0p2") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
+  table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:01:01 && outport == "sw0p1" && 
!is_chassis_resident("sw0p1") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
+  table=??(ls_in_check_port_sec), priority=110  , match=(((ip4 && icmp4.type 
== 3 && icmp4.code == 4) || (ip6 && icmp6.type == 2 && icmp6.code == 0)) && 
eth.src == 00:00:00:00:02:02 && outport == "sw0p2" && 
!is_chassis_resident("sw0p2") && flags.tunnel_rx == 1), action=(outport <-> 
inport; next;)
   table=??(ls_in_check_port_sec), priority=50   , match=(1), 
action=(reg0[[15]] = check_in_port_sec(); next;)
   table=??(ls_in_check_port_sec), priority=70   , match=(inport == 
"localnetport"), action=(set_queue(10); reg0[[15]] = check_in_port_sec(); next;)
   table=??(ls_in_check_port_sec), priority=70   , match=(inport == "sw0p1"), 
action=(reg0[[14]] = 1; next(pipeline=ingress, table=??);)
@@ -8896,6 +8914,8 @@ ovn_strip_lflows ], [0], [dnl
   table=??(ls_in_l2_lkup      ), priority=110  , match=(eth.dst == 
$svc_monitor_mac && (tcp || icmp || icmp6)), action=(handle_svc_check(inport);)
   table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:00:01), action=(outport = "sw0p1"; output;)
   table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:00:02), action=(outport = "sw0p2"; output;)
+  table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:01:01), action=(outport = "sw0p1"; output;)
+  table=??(ls_in_l2_lkup      ), priority=50   , match=(eth.dst == 
00:00:00:00:02:02), action=(outport = "sw0p2"; output;)
   table=??(ls_in_l2_lkup      ), priority=70   , match=(eth.mcast), 
action=(outport = "_MC_flood"; output;)
   table=??(ls_in_l2_unknown   ), priority=0    , match=(1), action=(output;)
   table=??(ls_in_l2_unknown   ), priority=50   , match=(outport == "none"), 
action=(drop;)
-- 
2.45.0

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

Reply via email to