Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2227936/?format=api
{ "id": 2227936, "url": "http://patchwork.ozlabs.org/api/patches/2227936/?format=api", "web_url": "http://patchwork.ozlabs.org/project/ovn/patch/20260424141009.91977-1-ARukomoinikova@k2.cloud/", "project": { "id": 68, "url": "http://patchwork.ozlabs.org/api/projects/68/?format=api", "name": "Open Virtual Network development", "link_name": "ovn", "list_id": "ovs-dev.openvswitch.org", "list_email": "ovs-dev@openvswitch.org", "web_url": "http://openvswitch.org/", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260424141009.91977-1-ARukomoinikova@k2.cloud>", "list_archive_url": null, "date": "2026-04-24T14:10:07", "name": "[ovs-dev,v6] northd, ovn-ic: Add support for east-west traffic PBR.", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "3a05a79465f814059023b9a9f80628ace3fb9730", "submitter": { "id": 89461, "url": "http://patchwork.ozlabs.org/api/people/89461/?format=api", "name": "Alexandra Rukomoinikova", "email": "ARukomoinikova@k2.cloud" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/ovn/patch/20260424141009.91977-1-ARukomoinikova@k2.cloud/mbox/", "series": [ { "id": 501375, "url": "http://patchwork.ozlabs.org/api/series/501375/?format=api", "web_url": "http://patchwork.ozlabs.org/project/ovn/list/?series=501375", "date": "2026-04-24T14:10:07", "name": "[ovs-dev,v6] northd, ovn-ic: Add support for east-west traffic PBR.", "version": 6, "mbox": "http://patchwork.ozlabs.org/series/501375/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2227936/comments/", "check": "warning", "checks": "http://patchwork.ozlabs.org/api/patches/2227936/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<ovs-dev-bounces@openvswitch.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "dev@openvswitch.org" ], "Delivered-To": [ "patchwork-incoming@legolas.ozlabs.org", "ovs-dev@lists.linuxfoundation.org" ], "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n unprotected) header.d=k2.cloud header.i=@k2.cloud header.a=rsa-sha256\n header.s=cloudmail header.b=dySBpCCC;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=2605:bc80:3010::137; helo=smtp4.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)", "smtp4.osuosl.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key,\n unprotected) header.d=k2.cloud header.i=@k2.cloud header.a=rsa-sha256\n header.s=cloudmail header.b=dySBpCCC", "smtp3.osuosl.org; dmarc=pass (p=quarantine dis=none)\n header.from=k2.cloud", "smtp3.osuosl.org; dkim=pass (1024-bit key,\n unprotected) header.d=k2.cloud header.i=@k2.cloud header.a=rsa-sha256\n header.s=cloudmail header.b=dySBpCCC" ], "Received": [ "from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g2FGm5d2dz1xvV\n\tfor <incoming@patchwork.ozlabs.org>; Sat, 25 Apr 2026 00:10:24 +1000 (AEST)", "from localhost (localhost [127.0.0.1])\n\tby smtp4.osuosl.org (Postfix) with ESMTP id A28EE409A4;\n\tFri, 24 Apr 2026 14:10:22 +0000 (UTC)", "from smtp4.osuosl.org ([127.0.0.1])\n by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id q5Upuft9sopi; Fri, 24 Apr 2026 14:10:19 +0000 (UTC)", "from lists.linuxfoundation.org (lf-lists.osuosl.org\n [IPv6:2605:bc80:3010:104::8cd3:938])\n\tby smtp4.osuosl.org (Postfix) with ESMTPS id 8360D405D0;\n\tFri, 24 Apr 2026 14:10:19 +0000 (UTC)", "from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id 5B2F8C04FB;\n\tFri, 24 Apr 2026 14:10:19 +0000 (UTC)", "from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136])\n by lists.linuxfoundation.org (Postfix) with ESMTP id B3DAEC04FA\n for <dev@openvswitch.org>; Fri, 24 Apr 2026 14:10:17 +0000 (UTC)", "from localhost (localhost [127.0.0.1])\n by smtp3.osuosl.org (Postfix) with ESMTP id A54E2612EF\n for <dev@openvswitch.org>; Fri, 24 Apr 2026 14:10:17 +0000 (UTC)", "from smtp3.osuosl.org ([127.0.0.1])\n by localhost (smtp3.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id Omk6S69wIT43 for <dev@openvswitch.org>;\n Fri, 24 Apr 2026 14:10:15 +0000 (UTC)", "from mail2.k2.cloud (mail2.k2.cloud [109.73.14.253])\n by smtp3.osuosl.org (Postfix) with ESMTPS id 2DCA5612D8\n for <dev@openvswitch.org>; Fri, 24 Apr 2026 14:10:13 +0000 (UTC)" ], "X-Virus-Scanned": [ "amavis at osuosl.org", "amavis at osuosl.org" ], "X-Comment": "SPF check N/A for local connections -\n client-ip=2605:bc80:3010:104::8cd3:938; helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ", "DKIM-Filter": [ "OpenDKIM Filter v2.11.0 smtp4.osuosl.org 8360D405D0", "OpenDKIM Filter v2.11.0 smtp3.osuosl.org 2DCA5612D8" ], "Received-SPF": "Pass (mailfrom) identity=mailfrom; client-ip=109.73.14.253;\n helo=mail2.k2.cloud; envelope-from=arukomoinikova@k2.cloud;\n receiver=<UNKNOWN>", "DMARC-Filter": "OpenDMARC Filter v1.4.2 smtp3.osuosl.org 2DCA5612D8", "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=k2.cloud;\n s=cloudmail; t=1777039810;\n bh=DhAkrHzh1gwp2LHuscuIaXuX2Tm9iHXGrL0qs9YIZNY=;\n h=From:To:Cc:Subject:Date;\n b=dySBpCCCY3EVejVH48LW5nDI34vWtvwgbyztXxCJE696XipioRVT5f6aRNmT3rNZ6\n 6Mfzwjl/zwY6UZMImCxlsustf6fvyRL+nVQg3YBrOj53wx6TOAJnB9cMCeJncA6QKu\n Kk+YoU07491egC9WjRUb7h6btC5S+d0myA441saw=", "To": "dev@openvswitch.org", "Cc": "Alexandra Rukomoinikova <ARukomoinikova@k2.cloud>", "Date": "Fri, 24 Apr 2026 17:10:07 +0300", "Message-Id": "<20260424141009.91977-1-ARukomoinikova@k2.cloud>", "MIME-Version": "1.0", "Subject": "[ovs-dev] [PATCH ovn v6] northd,\n ovn-ic: Add support for east-west traffic PBR.", "X-BeenThere": "ovs-dev@openvswitch.org", "X-Mailman-Version": "2.1.30", "Precedence": "list", "List-Id": "<ovs-dev.openvswitch.org>", "List-Unsubscribe": "<https://mail.openvswitch.org/mailman/options/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=unsubscribe>", "List-Archive": "<http://mail.openvswitch.org/pipermail/ovs-dev/>", "List-Post": "<mailto:ovs-dev@openvswitch.org>", "List-Help": "<mailto:ovs-dev-request@openvswitch.org?subject=help>", "List-Subscribe": "<https://mail.openvswitch.org/mailman/listinfo/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=subscribe>", "From": "Alexandra Rukomoinikova via dev <ovs-dev@openvswitch.org>", "Reply-To": "Alexandra Rukomoinikova <ARukomoinikova@k2.cloud>", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Errors-To": "ovs-dev-bounces@openvswitch.org", "Sender": "\"dev\" <ovs-dev-bounces@openvswitch.org>" }, "content": "Enable east-west traffic rerouting for locally connected networks between\nAvailability Zones (AZs). This allows traffic destined to a locally connected\nnetwork to be forcibly forwarded to a remote AZ for processing (e.g.,\nfirewalling, inspection, service chaining) and then delivered back.\n\nIntroduce new option (override-connected) for static routes. Static route with\nthis option set overrides local directly connected route. ovn-ic is extended to\npass this option during advertise-learn processing. Also, route_table column in\nic database now used for connected routes too.\n\nIC route priorities are changed to raise the priority of learned connected\nroutes that have a route table set. The new priority order for the same\nprefix (highest to lowest) is:\n\n 1. Static routes (local or IC-learned) with override-connected=true\n 2. IC-learned connected routes with route_table set (auto-marked)\n 3. All other connected routes (local and learned)\n 4. All other static routes\n 5. Routes learned from external sources (e.g., BGP)\n 6. Source-IP routes (lowest priority)\n\n(It's also now described in ovn-northd manpage)\n\nSigned-off-by: Alexandra Rukomoinikova <ARukomoinikova@k2.cloud>\n---\nv5 --> v6: 1) fixed review comments in docs\n 2) fixed ovn-k test: problem was in the incorrect\n calculation of metrics for src-ip static routes\nv4 --> v5: Rebased, added documentation to ovn-northd manpage AD for routing\nv4 (https://patchwork.ozlabs.org/project/ovn/patch/20251128154550.4840-1-arukomoinikova@k2.cloud/)\n---\n NEWS | 4 +\n ic/ovn-ic.c | 81 ++++++++---\n lib/ovn-util.h | 3 +\n northd/en-learned-route-sync.c | 2 +-\n northd/northd.c | 158 +++++++++++++---------\n northd/northd.h | 8 +-\n northd/ovn-northd.8.xml | 44 ++++++\n ovn-ic-sb.ovsschema | 7 +-\n ovn-ic-sb.xml | 27 ++++\n ovn-nb.xml | 8 ++\n tests/ovn-ic.at | 182 ++++++++++++++++++++++++-\n tests/ovn-northd.at | 238 ++++++++++++++++-----------------\n utilities/ovn-nbctl.8.xml | 6 +\n utilities/ovn-nbctl.c | 28 +++-\n 14 files changed, 585 insertions(+), 211 deletions(-)", "diff": "diff --git a/NEWS b/NEWS\nindex 8633ba8bb..fdc02b4a8 100644\n--- a/NEWS\n+++ b/NEWS\n@@ -3,6 +3,10 @@ Post v26.03.0\n - Dynamic Routing:\n * Add support for hub-and-spoke propagation via the \"hub-spoke\" option\n in dynamic-routing-redistribute settings.\n+ - Added \"override-connected\" option to Logical Router Static Routes to mark\n+ static routes as higher-priority than connected routes, which in turn led\n+ to changes in administrative distance for specific route types. Please see\n+ the \"Route Administrative Distance\" section of the ovn-northd manpage.\n \n OVN v26.03.0 - xxx xx xxxx\n --------------------------\ndiff --git a/ic/ovn-ic.c b/ic/ovn-ic.c\nindex ba9490658..fb7723641 100644\n--- a/ic/ovn-ic.c\n+++ b/ic/ovn-ic.c\n@@ -1309,6 +1309,7 @@ struct ic_route_info {\n const char *origin;\n const char *route_table;\n const char *route_tag;\n+ bool override_connected;\n struct uuid ic_route_uuid;\n \n const struct nbrec_logical_router *nb_lr;\n@@ -1326,16 +1327,25 @@ struct ic_route_info {\n const struct nbrec_load_balancer *nb_lb;\n };\n \n+static inline bool\n+get_override_connected(const struct smap *options)\n+{\n+ return smap_get_bool(options, ROUTE_OVERRIDE_CONNECTED, false);\n+}\n+\n static uint32_t\n ic_route_hash(const struct in6_addr *prefix, unsigned int plen,\n const struct in6_addr *nexthop, const char *origin,\n- const char *route_table, const struct uuid *ic_route_uuid)\n+ const char *route_table,\n+ const struct uuid *ic_route_uuid,\n+ bool override_connected)\n {\n uint32_t basis = ic_route_uuid ? uuid_hash(ic_route_uuid) : 0;\n basis = hash_bytes(prefix, sizeof *prefix, basis);\n basis = hash_int((uint32_t) plen, basis);\n basis = hash_string(origin, basis);\n basis = hash_string(route_table, basis);\n+ basis = hash_boolean(override_connected, basis);\n return hash_bytes(nexthop, sizeof *nexthop, basis);\n }\n \n@@ -1343,16 +1353,18 @@ static struct ic_route_info *\n ic_route_find(struct hmap *routes, const struct in6_addr *prefix,\n unsigned int plen, const struct in6_addr *nexthop,\n const char *origin, const char *route_table,\n- const struct uuid *ic_route_uuid, uint32_t hash)\n+ const struct uuid *ic_route_uuid,\n+ bool override_connected, uint32_t hash)\n {\n struct ic_route_info *r;\n if (!hash) {\n hash = ic_route_hash(prefix, plen, nexthop, origin, route_table,\n- ic_route_uuid);\n+ ic_route_uuid, override_connected);\n }\n HMAP_FOR_EACH_WITH_HASH (r, node, hash, routes) {\n if (ipv6_addr_equals(&r->prefix, prefix) &&\n r->plen == plen &&\n+ r->override_connected == override_connected &&\n ipv6_addr_equals(&r->nexthop, nexthop) &&\n !strcmp(r->origin, origin) &&\n !strcmp(r->route_table ? r->route_table : \"\", route_table) &&\n@@ -1410,11 +1422,14 @@ add_to_routes_learned(struct hmap *routes_learned,\n return false;\n }\n const char *origin = smap_get_def(&nb_route->options, \"origin\", \"\");\n+ bool override_connected = get_override_connected(&nb_route->options);\n \n uint32_t hash = ic_route_hash(&prefix, plen, &nexthop, origin,\n- nb_route->route_table, ic_route_uuid);\n+ nb_route->route_table, ic_route_uuid,\n+ override_connected);\n if (ic_route_find(routes_learned, &prefix, plen, &nexthop, origin,\n- nb_route->route_table, ic_route_uuid, hash)) {\n+ nb_route->route_table, ic_route_uuid,\n+ override_connected, hash)) {\n /* Route was added to learned on previous iteration. */\n return true;\n }\n@@ -1428,6 +1443,7 @@ add_to_routes_learned(struct hmap *routes_learned,\n ic_route->route_table = nb_route->route_table;\n ic_route->nb_lr = nb_lr;\n ic_route->ic_route_uuid = *ic_route_uuid;\n+ ic_route->override_connected = override_connected;\n hmap_insert(routes_learned, &ic_route->node, hash);\n \n return true;\n@@ -1588,7 +1604,7 @@ add_to_routes_ad(struct hmap *routes_ad, const struct in6_addr prefix,\n const struct nbrec_logical_router_static_route *nb_route,\n const struct nbrec_logical_router *nb_lr,\n const struct nbrec_load_balancer *nb_lb,\n- const char *route_tag)\n+ const char *route_tag, bool override_connected)\n {\n ovs_assert(nb_route || nb_lrp || nb_lb || nb_lr);\n \n@@ -1597,10 +1613,10 @@ add_to_routes_ad(struct hmap *routes_ad, const struct in6_addr prefix,\n }\n \n uint hash = ic_route_hash(&prefix, plen, &nexthop, origin,\n- route_table, NULL);\n+ route_table, NULL, override_connected);\n \n if (!ic_route_find(routes_ad, &prefix, plen, &nexthop, origin, route_table,\n- NULL, hash)) {\n+ NULL, override_connected, hash)) {\n struct ic_route_info *ic_route = xzalloc(sizeof *ic_route);\n ic_route->prefix = prefix;\n ic_route->plen = plen;\n@@ -1612,6 +1628,7 @@ add_to_routes_ad(struct hmap *routes_ad, const struct in6_addr prefix,\n ic_route->nb_lr = nb_lr;\n ic_route->nb_lb = nb_lb;\n ic_route->route_tag = route_tag;\n+ ic_route->override_connected = override_connected;\n hmap_insert(routes_ad, &ic_route->node, hash);\n } else {\n static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);\n@@ -1645,6 +1662,8 @@ add_static_to_routes_ad(\n {\n struct in6_addr prefix, nexthop;\n unsigned int plen;\n+ bool override_connected = get_override_connected(&nb_route->options);\n+\n if (!parse_route(nb_route->ip_prefix, nb_route->nexthop,\n &prefix, &plen, &nexthop)) {\n return;\n@@ -1684,7 +1703,7 @@ add_static_to_routes_ad(\n \n add_to_routes_ad(routes_ad, prefix, plen, nexthop, ROUTE_ORIGIN_STATIC,\n nb_route->route_table, NULL, nb_route, nb_lr,\n- NULL, route_tag);\n+ NULL, route_tag, override_connected);\n }\n \n static void\n@@ -1693,8 +1712,9 @@ add_network_to_routes_ad(struct hmap *routes_ad, const char *network,\n const struct lport_addresses *nexthop_addresses,\n const struct smap *nb_options,\n const struct nbrec_logical_router *nb_lr,\n- const char *route_tag,\n const struct nbrec_logical_router_port *ts_lrp,\n+ const char *route_tag,\n+ const char *ts_route_table,\n bool is_src_dynamic)\n {\n struct in6_addr prefix, nexthop;\n@@ -1745,11 +1765,25 @@ add_network_to_routes_ad(struct hmap *routes_ad, const char *network,\n ds_destroy(&msg);\n }\n \n+ /* Create additional route to local and remote networks that have\n+ * common route table name with port attached to transit switch having\n+ * same route table name.\n+ * As a result, traffic that is processed within such route table and is\n+ * routed cross az will select port attached to transit switch specially\n+ * allocated to process traffic within that route table.\n+ */\n+\n+ if (*ts_route_table) {\n+ add_to_routes_ad(routes_ad, prefix, plen, nexthop,\n+ ROUTE_ORIGIN_CONNECTED, ts_route_table,\n+ nb_lrp, NULL, nb_lr, NULL, route_tag, true);\n+ }\n+\n const char *origin = is_src_dynamic ? ROUTE_ORIGIN_CONNECTED_DYNAMIC :\n ROUTE_ORIGIN_CONNECTED;\n /* directly-connected routes go to <main> route table */\n add_to_routes_ad(routes_ad, prefix, plen, nexthop, origin,\n- NULL, nb_lrp, NULL, nb_lr, NULL, route_tag);\n+ NULL, nb_lrp, NULL, nb_lr, NULL, route_tag, false);\n }\n \n static void\n@@ -1807,7 +1841,7 @@ add_lb_vip_to_routes_ad(struct hmap *routes_ad, const char *vip_key,\n \n /* Lb vip routes go to <main> route table */\n add_to_routes_ad(routes_ad, vip_ip, plen, nexthop, ROUTE_ORIGIN_LB,\n- NULL, NULL, NULL, nb_lr, nb_lb, route_tag);\n+ NULL, NULL, NULL, nb_lr, nb_lb, route_tag, false);\n out:\n free(vip_str);\n }\n@@ -2189,11 +2223,15 @@ sync_learned_routes(struct ic_context *ctx,\n continue;\n }\n \n+ bool override_connected =\n+ get_override_connected(&isb_route->options);\n struct ic_route_info *route_learned\n = ic_route_find(&ic_lr->routes_learned, &prefix, plen,\n &nexthop, isb_route->origin,\n isb_route->route_table,\n- &isb_route->header_.uuid, 0);\n+ &isb_route->header_.uuid,\n+ override_connected, 0);\n+\n if (route_learned) {\n hmap_remove(&ic_lr->routes_learned, &route_learned->node);\n free(route_learned);\n@@ -2214,6 +2252,10 @@ sync_learned_routes(struct ic_context *ctx,\n nbrec_logical_router_static_route_update_options_setkey(\n nb_route, \"origin\", isb_route->origin);\n free(uuid_s);\n+ if (override_connected) {\n+ nbrec_logical_router_static_route_update_options_setkey(\n+ nb_route, ROUTE_OVERRIDE_CONNECTED, \"true\");\n+ }\n nbrec_logical_router_update_static_routes_addvalue(ic_lr->lr,\n nb_route);\n }\n@@ -2300,9 +2342,11 @@ advertise_routes(struct ic_context *ctx,\n icsbrec_route_delete(isb_route);\n continue;\n }\n+ bool override_connected = get_override_connected(&isb_route->options);\n struct ic_route_info *route_adv =\n ic_route_find(routes_ad, &prefix, plen, &nexthop,\n- isb_route->origin, isb_route->route_table, NULL, 0);\n+ isb_route->origin, isb_route->route_table,\n+ NULL, override_connected, 0);\n if (!route_adv) {\n /* Delete the extra route from IC-SB. */\n VLOG_DBG(\"Delete route %s -> %s from IC-SB, which is not found\"\n@@ -2346,6 +2390,10 @@ advertise_routes(struct ic_context *ctx,\n icsbrec_route_set_route_table(isb_route, route_adv->route_table\n ? route_adv->route_table\n : \"\");\n+ if (route_adv->override_connected) {\n+ icsbrec_route_update_options_setkey(isb_route,\n+ ROUTE_OVERRIDE_CONNECTED, \"true\");\n+ }\n free(prefix_s);\n free(nexthop_s);\n \n@@ -2400,7 +2448,8 @@ build_ts_routes_to_adv(struct ic_context *ctx,\n add_network_to_routes_ad(routes_ad, lrp->networks[j], lrp,\n ts_port_addrs,\n &nb_global->options,\n- lr, route_tag, ts_lrp, false);\n+ lr, ts_lrp, route_tag,\n+ ts_route_table, false);\n }\n } else {\n /* The router port of the TS port is ignored. */\n@@ -2455,7 +2504,7 @@ build_ts_routes_to_adv(struct ic_context *ctx,\n add_network_to_routes_ad(routes_ad, sb_route->ip_prefix, NULL,\n ts_port_addrs,\n &nb_global->options,\n- lr, route_tag, ts_lrp, true);\n+ lr, ts_lrp, route_tag, ts_route_table, true);\n }\n sbrec_learned_route_index_destroy_row(filter);\n }\ndiff --git a/lib/ovn-util.h b/lib/ovn-util.h\nindex b44c9c770..4e8cf6f52 100644\n--- a/lib/ovn-util.h\n+++ b/lib/ovn-util.h\n@@ -34,6 +34,7 @@\n #define ROUTE_ORIGIN_STATIC \"static\"\n #define ROUTE_ORIGIN_LB \"loadbalancer\"\n #define ROUTE_ORIGIN_CONNECTED_DYNAMIC \"connected-dynamic\"\n+#define ROUTE_OVERRIDE_CONNECTED \"override-connected\"\n \n #define ETH_CRC_LENGTH 4\n #define ETHERNET_OVERHEAD (ETH_HEADER_LEN + ETH_CRC_LENGTH)\n@@ -43,6 +44,8 @@\n \n #define IDL_LOOP_MAX_DURATION_MS 500\n \n+#define MAX_PREFIX_LEN 128\n+\n struct eth_addr;\n struct nbrec_logical_router;\n struct nbrec_logical_router_port;\ndiff --git a/northd/en-learned-route-sync.c b/northd/en-learned-route-sync.c\nindex 4f7a12a28..0d1953276 100644\n--- a/northd/en-learned-route-sync.c\n+++ b/northd/en-learned-route-sync.c\n@@ -200,7 +200,7 @@ parse_route_from_sbrec_route(struct hmap *parsed_routes_out,\n }\n \n return parsed_route_add(od, nexthop, &prefix, plen, false, lrp_addr_s,\n- out_port, 0, false, false, NULL,\n+ out_port, 0, false, false, false, NULL,\n ROUTE_SOURCE_LEARNED, &route->header_, NULL,\n parsed_routes_out);\n }\ndiff --git a/northd/northd.c b/northd/northd.c\nindex 0b52db6cf..6028bb8d3 100644\n--- a/northd/northd.c\n+++ b/northd/northd.c\n@@ -377,14 +377,23 @@ static const char *reg_ct_state[] = {\n /*\n * Route offsets implement logic to prioritize traffic for routes with\n * same ip_prefix values:\n- * 1. (highest priority) connected routes\n- * 2. static routes\n- * 3. routes learned from the outside via ovn-controller (e.g. bgp)\n- * 4. (lowest priority) src-ip routes */\n-#define ROUTE_PRIO_OFFSET_MULTIPLIER 8\n-#define ROUTE_PRIO_OFFSET_LEARNED 2\n-#define ROUTE_PRIO_OFFSET_STATIC 4\n+ * 1. High-priority static routes,\n+ * (override-connected option is set), including ic-learned with\n+ * override-connected option set to true.\n+ * 2. ic-learned connected routes with route_table set.\n+ * 3. connected routes, including ic-learned.\n+ * 4. static routes, including ic-learned.\n+ * 5. routes learned from the outside via ovn-controller (e.g. bgp)\n+ * 6. (lowest priority) src-ip routes */\n+#define ROUTE_PRIO_OFFSET_MULTIPLIER 12\n+#define ROUTE_PRIO_OFFSET_PRIORITY_STATIC 10\n+#define ROUTE_PRIO_OFFSET_IC_LEARNED_CONNECTED_WITH_TABLEID 8\n #define ROUTE_PRIO_OFFSET_CONNECTED 6\n+#define ROUTE_PRIO_OFFSET_STATIC 4\n+#define ROUTE_PRIO_OFFSET_LEARNED 2\n+\n+#define ROUTE_PRIO_BASE_SHIFT ((MAX_PREFIX_LEN + 1) * \\\n+ ROUTE_PRIO_OFFSET_MULTIPLIER)\n \n /* ovn_stages used by northd for logical switches and logical routers.\n * The first three components are combined to form the constant stage's\n@@ -12145,6 +12154,10 @@ parsed_route_lookup(struct hmap *routes, size_t hash,\n continue;\n }\n \n+ if (pr->override_connected != new_pr->override_connected) {\n+ continue;\n+ }\n+\n if (pr->is_discard_route != new_pr->is_discard_route) {\n continue;\n }\n@@ -12175,6 +12188,7 @@ parsed_route_init(const struct ovn_datapath *od,\n uint32_t route_table_id,\n bool is_src_route,\n bool ecmp_symmetric_reply,\n+ bool override_connected,\n const struct sset *ecmp_selection_fields,\n enum route_source source,\n const struct ovn_port *tracked_port,\n@@ -12190,6 +12204,7 @@ parsed_route_init(const struct ovn_datapath *od,\n new_pr->is_src_route = is_src_route;\n new_pr->od = od;\n new_pr->ecmp_symmetric_reply = ecmp_symmetric_reply;\n+ new_pr->override_connected = override_connected;\n new_pr->is_discard_route = is_discard_route;\n new_pr->lrp_addr_s = nullable_xstrdup(lrp_addr_s);\n new_pr->out_port = out_port;\n@@ -12218,7 +12233,8 @@ parsed_route_clone(const struct parsed_route *pr)\n struct parsed_route *new_pr = parsed_route_init(\n pr->od, nexthop, pr->prefix, pr->plen, pr->is_discard_route,\n pr->lrp_addr_s, pr->out_port, pr->route_table_id, pr->is_src_route,\n- pr->ecmp_symmetric_reply, &pr->ecmp_selection_fields, pr->source,\n+ pr->ecmp_symmetric_reply, pr->override_connected,\n+ &pr->ecmp_selection_fields, pr->source,\n pr->tracked_port, pr->source_hint);\n \n new_pr->hash = pr->hash;\n@@ -12279,6 +12295,7 @@ parsed_route_add(const struct ovn_datapath *od,\n uint32_t route_table_id,\n bool is_src_route,\n bool ecmp_symmetric_reply,\n+ bool override_connected,\n const struct sset *ecmp_selection_fields,\n enum route_source source,\n const struct ovsdb_idl_row *source_hint,\n@@ -12286,10 +12303,12 @@ parsed_route_add(const struct ovn_datapath *od,\n struct hmap *routes)\n {\n \n- struct parsed_route *new_pr = parsed_route_init(\n- od, nexthop, *prefix, plen, is_discard_route, lrp_addr_s, out_port,\n- route_table_id, is_src_route, ecmp_symmetric_reply,\n- ecmp_selection_fields, source, tracked_port, source_hint);\n+ struct parsed_route *new_pr\n+ = parsed_route_init(od, nexthop, *prefix, plen, is_discard_route,\n+ lrp_addr_s, out_port, route_table_id,\n+ is_src_route, ecmp_symmetric_reply,\n+ override_connected, ecmp_selection_fields,\n+ source, tracked_port, source_hint);\n \n new_pr->hash = route_hash(new_pr);\n \n@@ -12417,6 +12436,8 @@ parsed_routes_add_static(const struct ovn_datapath *od,\n bool ecmp_symmetric_reply = smap_get_bool(&route->options,\n \"ecmp_symmetric_reply\",\n false);\n+ bool override_connected = smap_get_bool(&route->options,\n+ ROUTE_OVERRIDE_CONNECTED, false);\n \n const char *origin = smap_get_def(&route->options, \"origin\", \"\");\n enum route_source source;\n@@ -12430,7 +12451,8 @@ parsed_routes_add_static(const struct ovn_datapath *od,\n \n parsed_route_add(od, nexthop, &prefix, plen, is_discard_route, lrp_addr_s,\n out_port, route_table_id, is_src_route,\n- ecmp_symmetric_reply, &ecmp_selection_fields, source,\n+ ecmp_symmetric_reply, override_connected,\n+ &ecmp_selection_fields, source,\n &route->header_, NULL, routes);\n sset_destroy(&ecmp_selection_fields);\n }\n@@ -12446,8 +12468,7 @@ parsed_routes_add_connected(const struct ovn_datapath *od,\n \n in6_addr_set_mapped_ipv4(&prefix, addr->network);\n parsed_route_add(od, NULL, &prefix, addr->plen,\n- false, addr->addr_s, op,\n- 0, false,\n+ false, addr->addr_s, op, 0, false, false,\n false, NULL, ROUTE_SOURCE_CONNECTED,\n &op->nbrp->header_, NULL, routes);\n }\n@@ -12455,10 +12476,9 @@ parsed_routes_add_connected(const struct ovn_datapath *od,\n for (size_t i = 0; i < op->lrp_networks.n_ipv6_addrs; i++) {\n const struct ipv6_netaddr *addr = &op->lrp_networks.ipv6_addrs[i];\n \n- parsed_route_add(od, NULL, &addr->network, addr->plen,\n- false, addr->addr_s, op,\n- 0, false,\n- false, NULL, ROUTE_SOURCE_CONNECTED,\n+ parsed_route_add(od, NULL, &addr->network, addr->plen, false,\n+ addr->addr_s, op, 0, false, false, false,\n+ NULL, ROUTE_SOURCE_CONNECTED,\n &op->nbrp->header_, NULL, routes);\n }\n }\n@@ -12513,17 +12533,25 @@ build_route_prefix_s(const struct in6_addr *prefix, unsigned int plen)\n return prefix_s;\n }\n \n-static uint16_t\n-route_source_to_offset(enum route_source source)\n+static int\n+get_route_offset(enum route_source source,\n+ bool override_connected)\n {\n switch (source) {\n case ROUTE_SOURCE_CONNECTED:\n case ROUTE_SOURCE_IC_DYNAMIC:\n- return ROUTE_PRIO_OFFSET_CONNECTED;\n+ return (override_connected)\n+ ? ROUTE_PRIO_OFFSET_IC_LEARNED_CONNECTED_WITH_TABLEID\n+ : ROUTE_PRIO_OFFSET_CONNECTED;\n+\n case ROUTE_SOURCE_STATIC:\n- return ROUTE_PRIO_OFFSET_STATIC;\n+ return (override_connected)\n+ ? ROUTE_PRIO_OFFSET_PRIORITY_STATIC\n+ : ROUTE_PRIO_OFFSET_STATIC;\n+\n case ROUTE_SOURCE_LEARNED:\n return ROUTE_PRIO_OFFSET_LEARNED;\n+\n /* Dynamic route types (NAT, LB, and connected-as-host) are not used. */\n case ROUTE_SOURCE_NAT:\n case ROUTE_SOURCE_LB:\n@@ -12533,39 +12561,19 @@ route_source_to_offset(enum route_source source)\n }\n }\n \n-static void\n-build_route_match(const struct ovn_port *op_inport, uint32_t rtb_id,\n- const char *network_s, int plen, bool is_src_route,\n- bool is_ipv4, struct ds *match, uint16_t *priority,\n- enum route_source source, bool has_protocol_match)\n+static uint16_t\n+calc_priority(int plen,\n+ enum route_source source,\n+ bool override_connected,\n+ bool is_src_route,\n+ bool has_protocol_match)\n {\n- const char *dir;\n- int ofs = route_source_to_offset(source);\n-\n- /* The priority here is calculated to implement longest-prefix-match\n- * routing. */\n- if (is_src_route) {\n- dir = \"src\";\n- ofs = 0;\n- } else {\n- dir = \"dst\";\n- }\n+ int priority = is_src_route ? 0 :\n+ get_route_offset(source, override_connected);\n \n- if (op_inport) {\n- ds_put_format(match, \"inport == %s && \", op_inport->json_key);\n- }\n- if (rtb_id || source == ROUTE_SOURCE_STATIC ||\n- source == ROUTE_SOURCE_LEARNED) {\n- ds_put_format(match, \"%s == %d && \", REG_ROUTE_TABLE_ID, rtb_id);\n- }\n+ priority += (plen * ROUTE_PRIO_OFFSET_MULTIPLIER) + has_protocol_match;\n \n- if (has_protocol_match) {\n- ofs += 1;\n- }\n- *priority = (plen * ROUTE_PRIO_OFFSET_MULTIPLIER) + ofs;\n-\n- ds_put_format(match, \"ip%s.%s == %s/%d\", is_ipv4 ? \"4\" : \"6\", dir,\n- network_s, plen);\n+ return priority + ROUTE_PRIO_BASE_SHIFT;\n }\n \n bool\n@@ -12756,10 +12764,21 @@ build_ecmp_route_flow(struct lflow_table *lflows,\n struct ds route_match = DS_EMPTY_INITIALIZER;\n \n char *prefix_s = build_route_prefix_s(&eg->prefix, eg->plen);\n- build_route_match(NULL, eg->route_table_id, prefix_s, eg->plen,\n- eg->is_src_route, is_ipv4_prefix, &route_match,\n- &priority, eg->source,\n- protocol != NULL);\n+\n+ if (eg->route_table_id || eg->source == ROUTE_SOURCE_STATIC\n+ || eg->source == ROUTE_SOURCE_LEARNED) {\n+ ds_put_format(&route_match, \"%s == %d && \", REG_ROUTE_TABLE_ID,\n+ eg->route_table_id);\n+ }\n+\n+ ds_put_format(&route_match, \"ip%s.%s == %s/%d\",\n+ is_ipv4_prefix ? \"4\" : \"6\",\n+ eg->is_src_route ? \"src\" : \"dst\",\n+ prefix_s, eg->plen);\n+\n+ priority = calc_priority(eg->plen, eg->source, false,\n+ eg->is_src_route, protocol != NULL);\n+\n free(prefix_s);\n \n struct ds actions = DS_EMPTY_INITIALIZER;\n@@ -12886,10 +12905,12 @@ add_route(struct lflow_table *lflows, const struct ovn_datapath *od,\n const struct sset *bfd_ports,\n const struct ovsdb_idl_row *stage_hint, bool is_discard_route,\n enum route_source source, struct lflow_ref *lflow_ref,\n- bool is_ipv4_prefix, bool is_ipv4_nexthop)\n+ bool is_ipv4_prefix, bool is_ipv4_nexthop,\n+ bool override_connected)\n {\n struct ds match = DS_EMPTY_INITIALIZER;\n- uint16_t priority;\n+ uint16_t priority = calc_priority(plen, source, override_connected,\n+ is_src_route, false);\n const struct ovn_port *op_inport = NULL;\n \n /* IPv6 link-local addresses must be scoped to the local router port. */\n@@ -12900,8 +12921,19 @@ add_route(struct lflow_table *lflows, const struct ovn_datapath *od,\n op_inport = op;\n }\n }\n- build_route_match(op_inport, rtb_id, network_s, plen, is_src_route,\n- is_ipv4_prefix, &match, &priority, source, false);\n+\n+ if (op_inport) {\n+ ds_put_format(&match, \"inport == %s && \", op_inport->json_key);\n+ }\n+ if (rtb_id || source == ROUTE_SOURCE_STATIC ||\n+ source == ROUTE_SOURCE_LEARNED) {\n+ ds_put_format(&match, \"%s == %d && \", REG_ROUTE_TABLE_ID, rtb_id);\n+ }\n+\n+ ds_put_format(&match, \"ip%s.%s == %s/%d\",\n+ is_ipv4_prefix ? \"4\" : \"6\",\n+ is_src_route ? \"src\" : \"dst\",\n+ network_s, plen);\n \n struct ds common_actions = DS_EMPTY_INITIALIZER;\n struct ds actions = DS_EMPTY_INITIALIZER;\n@@ -12966,7 +12998,7 @@ build_route_flow(struct lflow_table *lflows, const struct ovn_datapath *od,\n route->route_table_id, bfd_ports,\n route->source_hint,\n route->is_discard_route, route->source, lflow_ref,\n- is_ipv4_prefix, is_ipv4_nexthop);\n+ is_ipv4_prefix, is_ipv4_nexthop, route->override_connected);\n \n free(prefix_s);\n }\n@@ -18706,7 +18738,7 @@ build_routable_flows_for_router_port(\n bfd_ports, &router_port->nbrp->header_,\n false, ROUTE_SOURCE_CONNECTED,\n lrp->stateful_lflow_ref,\n- true, is_ipv4_nexthop ? true : false);\n+ true, is_ipv4_nexthop ? true : false, false);\n }\n }\n }\ndiff --git a/northd/northd.h b/northd/northd.h\nindex e86d39f9a..22c752c8a 100644\n--- a/northd/northd.h\n+++ b/northd/northd.h\n@@ -840,15 +840,16 @@ enum route_source {\n struct parsed_route {\n struct hmap_node key_node;\n struct in6_addr prefix;\n- unsigned int plen;\n struct in6_addr *nexthop; /* NULL for ROUTE_SOURCE_CONNECTED */\n- bool is_src_route;\n+ unsigned int plen;\n uint32_t route_table_id;\n uint32_t hash;\n+ bool is_src_route;\n bool ecmp_symmetric_reply;\n+ bool override_connected;\n bool is_discard_route;\n- const struct ovn_datapath *od;\n bool stale;\n+ const struct ovn_datapath *od;\n struct sset ecmp_selection_fields;\n enum route_source source;\n const struct ovsdb_idl_row *source_hint;\n@@ -875,6 +876,7 @@ struct parsed_route *parsed_route_add(\n uint32_t route_table_id,\n bool is_src_route,\n bool ecmp_symmetric_reply,\n+ bool override_connected,\n const struct sset *ecmp_selection_fields,\n enum route_source source,\n const struct ovsdb_idl_row *source_hint,\ndiff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml\nindex 4d6370da6..1d9e6b587 100644\n--- a/northd/ovn-northd.8.xml\n+++ b/northd/ovn-northd.8.xml\n@@ -6293,6 +6293,50 @@ clone {\n </ul>\n </p>\n \n+ <h1>Route Administrative Distance in OVN</h1>\n+\n+ <p>\n+ In OVN, routes are selected based on an administrative distance, similar\n+ to traditional networking but with some differences.\n+ Routes with higher priority are preferred over those with lower priority.\n+ The priority order, from highest to lowest, is as follows:\n+ </p>\n+\n+ <p>\n+ <ol>\n+ <li>\n+ High-priority static routes - includes routes with\n+ <code>override-connected</code> option set, as well as ic-learned\n+ routes with <code>override-connected</code> option set to true.\n+ </li>\n+\n+ <li>\n+ Ic-learned connected routes with route_table - connected routes\n+ learned via IC that have the <code>route_table</code> parameter set.\n+ </li>\n+\n+ <li>\n+ Connected routes - directly connected routes, including ic-learned\n+ connected routes that do not have a <code>route_table</code> set.\n+ </li>\n+\n+ <li>\n+ Static routes - manually configured static routes.\n+ </li>\n+\n+ <li>\n+ Learned routes - routes learned from outside via ovn-controller.\n+ </li>\n+\n+ <li>\n+ Src-ip routes - source-based static IP routes.\n+ Please see the <code>OVN_Northbound</code> database\n+ <code>Logical_Router_Static_Route</code> table documentation in\n+ <code>ovn-nb</code> for details.\n+ </li>\n+ </ol>\n+ </p>\n+\n <h1>Drop sampling</h1>\n \n <p>\ndiff --git a/ovn-ic-sb.ovsschema b/ovn-ic-sb.ovsschema\nindex e0e0fef5e..9208e7ab5 100644\n--- a/ovn-ic-sb.ovsschema\n+++ b/ovn-ic-sb.ovsschema\n@@ -1,7 +1,7 @@\n {\n \"name\": \"OVN_IC_Southbound\",\n- \"version\": \"2.5.0\",\n- \"cksum\": \"1892994110 9713\",\n+ \"version\": \"2.6.0\",\n+ \"cksum\": \"2842701319 9868\",\n \"tables\": {\n \"IC_SB_Global\": {\n \"columns\": {\n@@ -118,6 +118,9 @@\n \"enum\": [\"set\",\n [\"connected\", \"static\", \"loadbalancer\",\n \"connected-dynamic\"]]}}},\n+ \"options\": {\n+ \"type\": {\"key\": \"string\", \"value\": \"string\",\n+ \"min\": 0, \"max\": \"unlimited\"}},\n \"external_ids\": {\n \"type\": {\"key\": \"string\", \"value\": \"string\",\n \"min\": 0, \"max\": \"unlimited\"}}},\ndiff --git a/ovn-ic-sb.xml b/ovn-ic-sb.xml\nindex f30760100..f0d450681 100644\n--- a/ovn-ic-sb.xml\n+++ b/ovn-ic-sb.xml\n@@ -358,6 +358,14 @@\n have more than one Transit Switch, which interconnects them,\n directly-connected routes will be added via each transit switch port\n and configured as ECMP routes.\n+ Additionally, these routes will be advertised to other AZ and learned\n+ into route table that has the same name in the remote logical router.\n+ When learned, these routes are automatically marked with\n+ the <code>override-connected</code> option, giving them higher priority\n+ than any local connected route with same prefix in that route table.\n+ This enables policy-based routing scenarios where traffic processed\n+ within a specific route table can be forcibly forwarded to remote AZ\n+ even when local connected route exists.\n </p>\n <p>\n Static routes within route tables will be advertised and learned only\n@@ -399,6 +407,25 @@\n </p>\n </column>\n </group>\n+\n+ <group title=\"Options\">\n+ <column name=\"options\">\n+ This column provides general key/value settings. The supported\n+ options are described individually below.\n+ </column>\n+\n+ <column name=\"options\" key=\"override-connected\"\n+ type='{\"type\": \"boolean\"}'>\n+ <p>\n+ This option is a copy of its Northbound DB counterpart.\n+ </p>\n+ <p>\n+ For connected routes this option is set to true if there is a route\n+ table associated with given connected route, i.e.\n+ <ref table=\"Route\" column=\"route_table\"/> is not empty.\n+ </p>\n+ </column>\n+ </group>\n </table>\n \n <table name=\"Connection\" title=\"OVSDB client connections.\">\ndiff --git a/ovn-nb.xml b/ovn-nb.xml\nindex 592008745..916ae811e 100644\n--- a/ovn-nb.xml\n+++ b/ovn-nb.xml\n@@ -5056,6 +5056,14 @@ or\n <li>static</li>\n </ol>\n </column>\n+ <column name=\"options\" key=\"override-connected\">\n+ This option can be manually set for local static routes and\n+ automatically set for ovn-interconnected learned routes.\n+ Default value: <code>false</code>.\n+\n+ This option raises route's priority to be highest among routes\n+ with same prefix.\n+ </column>\n </group>\n \n </table>\ndiff --git a/tests/ovn-ic.at b/tests/ovn-ic.at\nindex 0fa7c4f29..bf50da5de 100644\n--- a/tests/ovn-ic.at\n+++ b/tests/ovn-ic.at\n@@ -885,9 +885,10 @@ check ovn_as az1 ovn-nbctl lb-add lb_v6 [[4242::1]]:80 \"[[4242::2]]:80\"\n check ovn_as az1 ovn-nbctl lr-lb-add lr1 lb_v6\n OVS_WAIT_UNTIL([ovn_as az2 ovn-nbctl lr-route-list lr2 | grep learned | grep 4242])\n \n-AT_CHECK([ovn-ic-sbctl list route | grep 'ip_prefix.*4242' -A 2], [0], [dnl\n+AT_CHECK([ovn-ic-sbctl list route | grep 'ip_prefix.*4242' -A 3], [0], [dnl\n ip_prefix : \"4242::1/128\"\n nexthop : \"2001:db8:1::1\"\n+options : {}\n origin : loadbalancer\n ])\n \n@@ -1211,6 +1212,7 @@ Route Table <main>:\n Route Table rtb1:\n 10.11.1.0/24 169.254.100.1 dst-ip (learned)\n 10.11.2.0/24 169.254.0.1 dst-ip\n+ 192.168.0.0/24 169.254.100.1 dst-ip (learned) override-connected\n 10.22.2.0/24 169.254.0.2 src-ip\n 0.0.0.0/0 169.254.100.1 dst-ip (learned)\n ])\n@@ -1332,8 +1334,11 @@ check ovn-ic-nbctl --wait=sb sync\n OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl lr-route-list lr11 | grep 192.168 |\n grep learned | awk '{print $1, $2, $5}' | sort ], [0], [dnl\n 192.168.0.0/24 169.254.101.2 ecmp\n+192.168.0.0/24 169.254.101.2 override-connected\n 192.168.0.0/24 169.254.102.2 ecmp\n+192.168.0.0/24 169.254.102.2 override-connected\n 192.168.0.0/24 169.254.103.2 ecmp\n+192.168.0.0/24 169.254.103.2 override-connected\n ])\n \n # Test static routes from lr12 rtbs rtb1,rtb2,rtb3 were learned to lr11\n@@ -1341,22 +1346,27 @@ OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl --route-table=rtb1 lr-route-list lr11]\n IPv4 Routes\n Route Table rtb1:\n 10.10.10.0/24 169.254.101.2 dst-ip (learned)\n+ 192.168.0.0/24 169.254.101.2 dst-ip (learned) override-connected\n ])\n OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl --route-table=rtb2 lr-route-list lr11], [0], [dnl\n IPv4 Routes\n Route Table rtb2:\n 10.10.10.0/24 169.254.102.2 dst-ip (learned)\n+ 192.168.0.0/24 169.254.102.2 dst-ip (learned) override-connected\n ])\n OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl --route-table=rtb3 lr-route-list lr11], [0], [dnl\n IPv4 Routes\n Route Table rtb3:\n 10.10.10.0/24 169.254.103.2 dst-ip (learned)\n+ 192.168.0.0/24 169.254.103.2 dst-ip (learned) override-connected\n ])\n \n # Test routes from lr12 didn't leak as learned to lr21\n OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl lr-route-list lr21 | grep 192.168 | sort], [0], [dnl\n 192.168.0.0/24 169.254.101.2 dst-ip (learned) ecmp\n+ 192.168.0.0/24 169.254.101.2 dst-ip (learned) override-connected\n 192.168.0.0/24 169.254.102.2 dst-ip (learned) ecmp\n+ 192.168.0.0/24 169.254.102.2 dst-ip (learned) override-connected\n ])\n \n OVN_CLEANUP_IC([az1], [az2])\n@@ -1457,8 +1467,11 @@ check ovn-ic-nbctl --wait=sb sync\n AT_CHECK([ovn_as az1 ovn-nbctl lr-route-list lr11 | grep 2001:db8:200 |\n grep learned | awk '{print $1, $2, $5}' | sort], [0], [dnl\n 2001:db8:200::/64 2001:db8:1::2 ecmp\n+2001:db8:200::/64 2001:db8:1::2 override-connected\n 2001:db8:200::/64 2001:db8:2::2 ecmp\n+2001:db8:200::/64 2001:db8:2::2 override-connected\n 2001:db8:200::/64 2001:db8:3::2 ecmp\n+2001:db8:200::/64 2001:db8:3::2 override-connected\n ])\n \n # Test static routes from lr12 rtbs rtb1,rtb2,rtb3 were learned to lr11\n@@ -1466,18 +1479,21 @@ OVS_WAIT_UNTIL([ovn_as az1 ovn-nbctl --route-table=rtb1 lr-route-list lr11 | gre\n AT_CHECK([ovn_as az1 ovn-nbctl --route-table=rtb1 lr-route-list lr11], [0], [dnl\n IPv6 Routes\n Route Table rtb1:\n+ 2001:db8:200::/64 2001:db8:1::2 dst-ip (learned) override-connected\n 2001:db8:aaaa::/64 2001:db8:1::2 dst-ip (learned)\n ])\n OVS_WAIT_UNTIL([ovn_as az1 ovn-nbctl --route-table=rtb2 lr-route-list lr11 | grep learned])\n AT_CHECK([ovn_as az1 ovn-nbctl --route-table=rtb2 lr-route-list lr11], [0], [dnl\n IPv6 Routes\n Route Table rtb2:\n+ 2001:db8:200::/64 2001:db8:2::2 dst-ip (learned) override-connected\n 2001:db8:aaaa::/64 2001:db8:2::2 dst-ip (learned)\n ])\n OVS_WAIT_UNTIL([ovn_as az1 ovn-nbctl --route-table=rtb3 lr-route-list lr11 | grep learned])\n AT_CHECK([ovn_as az1 ovn-nbctl --route-table=rtb3 lr-route-list lr11], [0], [dnl\n IPv6 Routes\n Route Table rtb3:\n+ 2001:db8:200::/64 2001:db8:3::2 dst-ip (learned) override-connected\n 2001:db8:aaaa::/64 2001:db8:3::2 dst-ip (learned)\n ])\n \n@@ -1485,7 +1501,9 @@ Route Table rtb3:\n OVS_WAIT_UNTIL([ovn_as az1 ovn-nbctl lr-route-list lr21 | grep \"2001:db8:2::2\" | grep learned])\n AT_CHECK([ovn_as az1 ovn-nbctl lr-route-list lr21 | grep 2001 | sort], [0], [dnl\n 2001:db8:200::/64 2001:db8:1::2 dst-ip (learned) ecmp\n+ 2001:db8:200::/64 2001:db8:1::2 dst-ip (learned) override-connected\n 2001:db8:200::/64 2001:db8:2::2 dst-ip (learned) ecmp\n+ 2001:db8:200::/64 2001:db8:2::2 dst-ip (learned) override-connected\n ])\n \n OVN_CLEANUP_IC([az1], [az2])\n@@ -4839,3 +4857,165 @@ OVN_CLEANUP_IC\n \n AT_CLEANUP\n ])\n+\n+OVN_FOR_EACH_NORTHD([\n+AT_SETUP([ovn-ic -- east-west - 2az])\n+\n+ovn_init_ic_db\n+ovn-ic-nbctl ts-add rtb-1\n+ovn-ic-nbctl ts-add rtb-2\n+\n+ovn_start az1\n+ovn_as az1\n+\n+check ovn_as az1 ovn-ic-nbctl --wait=sb sync\n+check ovn_as az1 ovn-nbctl set nb_global . options:ic-route-learn=true\n+check ovn_as az1 ovn-nbctl set nb_global . options:ic-route-adv=true\n+\n+check ovn_as az1 ovn-nbctl ls-add subnet-A\n+check ovn_as az1 ovn-nbctl lsp-add subnet-A subnet-A-up -- lsp-set-type subnet-A-up router -- lsp-set-addresses subnet-A-up router -- lsp-set-options subnet-A-up router-port=subnet-A\n+check ovn_as az1 ovn-nbctl lsp-add subnet-A client -- lsp-set-addresses client \"0a:00:43:1e:92:20 172.31.0.4\"\n+\n+check ovn_as az1 ovn-nbctl ls-add subnet-B\n+check ovn_as az1 ovn-nbctl lsp-add subnet-B subnet-B-up -- lsp-set-type subnet-B-up router -- lsp-set-addresses subnet-B-up router -- lsp-set-options subnet-B-up router-port=subnet-B\n+check ovn_as az1 ovn-nbctl lsp-add subnet-B server -- lsp-set-addresses server \"0a:00:b9:86:a4:00 172.31.1.4\"\n+\n+check ovn_as az1 ovn-nbctl lsp-add rtb-1 rtb-1-down1 -- lsp-set-type rtb-1-down1 router -- lsp-set-addresses rtb-1-down1 router -- lsp-set-options rtb-1-down1 router-port=rtb-1\n+check ovn_as az1 ovn-nbctl lsp-add rtb-2 rtb-2-down1 -- lsp-set-type rtb-2-down1 router -- lsp-set-addresses rtb-2-down1 router -- lsp-set-options rtb-2-down1 router-port=rtb-2\n+\n+check ovn_as az1 ovn-nbctl lr-add rt1\n+check ovn_as az1 ovn-nbctl lrp-add rt1 subnet-A \"d0:fe:00:00:00:14\" \"172.31.0.1/24\" -- lrp-set-options subnet-A route_table=table1\n+check ovn_as az1 ovn-nbctl lrp-add rt1 subnet-B \"d0:fe:00:00:00:15\" \"172.31.1.1/24\" -- lrp-set-options subnet-B route_table=table1\n+check ovn_as az1 ovn-nbctl lrp-add rt1 rtb-1 \"00:00:a0:9e:9d:40\" \"169.254.100.1/27\" -- lrp-set-options rtb-1 route_table=table1\n+check ovn_as az1 ovn-nbctl lrp-add rt1 rtb-2 \"00:00:60:15:b8:20\" \"169.254.100.33/27\" -- lrp-set-options rtb-2 route_table=table2\n+\n+ovn_start az2\n+ovn_as az2\n+\n+check ovn_as az2 ovn-ic-nbctl --wait=sb sync\n+check ovn_as az2 ovn-nbctl set nb_global . options:ic-route-learn=true\n+check ovn_as az2 ovn-nbctl set nb_global . options:ic-route-adv=true\n+\n+check ovn_as az2 ovn-nbctl ls-add subnet-C\n+check ovn_as az2 ovn-nbctl lsp-add subnet-C subnet-C-up -- lsp-set-type subnet-C-up router -- lsp-set-addresses subnet-C-up router -- lsp-set-options subnet-C-up router-port=subnet-C\n+check ovn_as az2 ovn-nbctl lsp-add subnet-C filter1 -- lsp-set-addresses filter1 \"0a:01:4f:43:ce:e1 172.31.2.4\"\n+\n+check ovn_as az2 ovn-nbctl ls-add subnet-D\n+check ovn_as az2 ovn-nbctl lsp-add subnet-D subnet-D-up -- lsp-set-type subnet-D-up router -- lsp-set-addresses subnet-D-up router -- lsp-set-options subnet-D-up router-port=subnet-D\n+check ovn_as az2 ovn-nbctl lsp-add subnet-D filter2 -- lsp-set-addresses filter2 \"0a:01:39:eb:b1:41 172.31.3.4\"\n+\n+check ovn_as az2 ovn-nbctl lsp-add rtb-1 rtb-1-down2 -- lsp-set-type rtb-1-down2 router -- lsp-set-addresses rtb-1-down2 router -- lsp-set-options rtb-1-down2 router-port=rtb-1\n+check ovn_as az2 ovn-nbctl lsp-add rtb-2 rtb-2-down2 -- lsp-set-type rtb-2-down2 router -- lsp-set-addresses rtb-2-down2 router -- lsp-set-options rtb-2-down2 router-port=rtb-2\n+\n+check ovn_as az2 ovn-nbctl lr-add rt1\n+check ovn_as az2 ovn-nbctl lrp-add rt1 subnet-C \"d0:fe:00:00:00:16\" \"172.31.2.1/24\" -- lrp-set-options subnet-C route_table=table2\n+check ovn_as az2 ovn-nbctl lrp-add rt1 subnet-D \"d0:fe:00:00:00:17\" \"172.31.3.1/24\" -- lrp-set-options subnet-D route_table=table2\n+check ovn_as az2 ovn-nbctl lrp-add rt1 rtb-1 \"00:01:a0:9e:9d:40\" \"169.254.100.2/27\" -- lrp-set-options rtb-1 route_table=table1\n+check ovn_as az2 ovn-nbctl lrp-add rt1 rtb-2 \"00:01:60:15:b8:20\" \"169.254.100.34/27\" -- lrp-set-options rtb-2 route_table=table2\n+\n+check ovn_as az2 ovn-nbctl --route-table=table1 --override-connected lr-route-add rt1 \"172.31.0.0/24\" \"172.31.2.4\"\n+check ovn_as az2 ovn-nbctl --route-table=table1 --override-connected lr-route-add rt1 \"172.31.1.0/24\" \"172.31.3.4\"\n+\n+check ovn-ic-nbctl --wait=sb sync\n+\n+AT_CHECK([ovn_as az1 ovn-nbctl lr-route-list rt1], [0], [dnl\n+IPv4 Routes\n+Route Table <main>:\n+ 172.31.2.0/24 169.254.100.2 dst-ip (learned) ecmp\n+ 172.31.2.0/24 169.254.100.34 dst-ip (learned) ecmp\n+ 172.31.3.0/24 169.254.100.2 dst-ip (learned) ecmp\n+ 172.31.3.0/24 169.254.100.34 dst-ip (learned) ecmp\n+\n+Route Table table1:\n+ 172.31.0.0/24 169.254.100.2 dst-ip (learned) override-connected\n+ 172.31.1.0/24 169.254.100.2 dst-ip (learned) override-connected\n+ 172.31.2.0/24 169.254.100.2 dst-ip (learned) override-connected\n+ 172.31.3.0/24 169.254.100.2 dst-ip (learned) override-connected\n+\n+Route Table table2:\n+ 172.31.2.0/24 169.254.100.34 dst-ip (learned) override-connected\n+ 172.31.3.0/24 169.254.100.34 dst-ip (learned) override-connected\n+])\n+\n+AT_CHECK([ovn_as az2 ovn-nbctl lr-route-list rt1], [0], [dnl\n+IPv4 Routes\n+Route Table <main>:\n+ 172.31.0.0/24 169.254.100.1 dst-ip (learned) ecmp\n+ 172.31.0.0/24 169.254.100.33 dst-ip (learned) ecmp\n+ 172.31.1.0/24 169.254.100.1 dst-ip (learned) ecmp\n+ 172.31.1.0/24 169.254.100.33 dst-ip (learned) ecmp\n+\n+Route Table table1:\n+ 172.31.0.0/24 172.31.2.4 dst-ip override-connected\n+ 172.31.0.0/24 169.254.100.1 dst-ip (learned) override-connected\n+ 172.31.1.0/24 172.31.3.4 dst-ip override-connected\n+ 172.31.1.0/24 169.254.100.1 dst-ip (learned) override-connected\n+\n+Route Table table2:\n+ 172.31.0.0/24 169.254.100.33 dst-ip (learned) override-connected\n+ 172.31.1.0/24 169.254.100.33 dst-ip (learned) override-connected\n+])\n+\n+AZF1=\"az1/az1_flow.txt\"\n+AZF2=\"az2/az2_flow.txt\"\n+ovn_as az1 ovn-sbctl lflow-list rt1 > $AZF1\n+ovn_as az2 ovn-sbctl lflow-list rt1 > $AZF2\n+\n+VA1=$(grep \"ip_routing_pre.*rtb-1\" $AZF1 | sed -n 's/.*reg7 = \\([[0-9]]*\\).*/\\1/p')\n+VA2=$(grep \"ip_routing_pre.*rtb-2\" $AZF1 | sed -n 's/.*reg7 = \\([[0-9]]*\\).*/\\1/p')\n+\n+#grep \"ip_routing[[^_]]\" $AZF1 | sed \"s/reg7 == $VA1/reg7 == rtb-1/g\" | sed \"s/reg7 == $VA2/reg7 == rtb-2/g\" | ovn_strip_lflows > az1/az1_parsed.txt\n+\n+AT_CHECK([grep \"ip_routing[[^_]]\" $AZF1 | sed \"s/reg7 == $VA1/reg7 == rtb-1/g\" | sed \"s/reg7 == $VA2/reg7 == rtb-2/g\" | ovn_strip_lflows], [0], [dnl\n+ table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n+ table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 172.31.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 172.31.0.1; eth.src = d0:fe:00:00:00:14; outport = \"subnet-A\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 172.31.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 172.31.1.1; eth.src = d0:fe:00:00:00:15; outport = \"subnet-B\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 172.31.2.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.2; reg5 = 169.254.100.1; eth.src = 00:00:a0:9e:9d:40; outport = \"rtb-1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 172.31.2.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.34; reg5 = 169.254.100.33; eth.src = 00:00:60:15:b8:20; outport = \"rtb-2\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 172.31.3.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.2; reg5 = 169.254.100.1; eth.src = 00:00:a0:9e:9d:40; outport = \"rtb-1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 172.31.3.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.34; reg5 = 169.254.100.33; eth.src = 00:00:60:15:b8:20; outport = \"rtb-2\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1844 , match=(reg7 == rtb-1 && ip4.dst == 172.31.2.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.2; reg5 = 169.254.100.1; eth.src = 00:00:a0:9e:9d:40; outport = \"rtb-1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1844 , match=(reg7 == rtb-1 && ip4.dst == 172.31.3.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.2; reg5 = 169.254.100.1; eth.src = 00:00:a0:9e:9d:40; outport = \"rtb-1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1844 , match=(reg7 == rtb-2 && ip4.dst == 172.31.2.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.34; reg5 = 169.254.100.33; eth.src = 00:00:60:15:b8:20; outport = \"rtb-2\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1844 , match=(reg7 == rtb-2 && ip4.dst == 172.31.3.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.34; reg5 = 169.254.100.33; eth.src = 00:00:60:15:b8:20; outport = \"rtb-2\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1846 , match=(reg7 == rtb-1 && ip4.dst == 172.31.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.2; reg5 = 169.254.100.1; eth.src = 00:00:a0:9e:9d:40; outport = \"rtb-1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1846 , match=(reg7 == rtb-1 && ip4.dst == 172.31.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.2; reg5 = 169.254.100.1; eth.src = 00:00:a0:9e:9d:40; outport = \"rtb-1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1878 , match=(ip4.dst == 169.254.100.0/27), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 169.254.100.1; eth.src = 00:00:a0:9e:9d:40; outport = \"rtb-1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1878 , match=(ip4.dst == 169.254.100.32/27), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 169.254.100.33; eth.src = 00:00:60:15:b8:20; outport = \"rtb-2\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"rtb-1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:a0ff:fe9e:9d40; eth.src = 00:00:a0:9e:9d:40; outport = \"rtb-1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"rtb-2\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:60ff:fe15:b820; eth.src = 00:00:60:15:b8:20; outport = \"rtb-2\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"subnet-A\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::d2fe:ff:fe00:14; eth.src = d0:fe:00:00:00:14; outport = \"subnet-A\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"subnet-B\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::d2fe:ff:fe00:15; eth.src = d0:fe:00:00:00:15; outport = \"subnet-B\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+])\n+\n+VA1=$(grep \"ip_routing_pre.*rtb-1\" $AZF2 | sed -n 's/.*reg7 = \\([[0-9]]*\\).*/\\1/p')\n+VA2=$(grep \"ip_routing_pre.*rtb-2\" $AZF2 | sed -n 's/.*reg7 = \\([[0-9]]*\\).*/\\1/p')\n+\n+AT_CHECK([grep \"ip_routing[[^_]]\" $AZF2 | sed \"s/reg7 == $VA1/reg7 == rtb-1/g\" | sed \"s/reg7 == $VA2/reg7 == rtb-2/g\" | ovn_strip_lflows], [0], [dnl\n+ table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n+ table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 172.31.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.1; reg5 = 169.254.100.2; eth.src = 00:01:a0:9e:9d:40; outport = \"rtb-1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 172.31.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.33; reg5 = 169.254.100.34; eth.src = 00:01:60:15:b8:20; outport = \"rtb-2\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 172.31.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.1; reg5 = 169.254.100.2; eth.src = 00:01:a0:9e:9d:40; outport = \"rtb-1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 172.31.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.33; reg5 = 169.254.100.34; eth.src = 00:01:60:15:b8:20; outport = \"rtb-2\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 172.31.2.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 172.31.2.1; eth.src = d0:fe:00:00:00:16; outport = \"subnet-C\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 172.31.3.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 172.31.3.1; eth.src = d0:fe:00:00:00:17; outport = \"subnet-D\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1844 , match=(reg7 == rtb-1 && ip4.dst == 172.31.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.1; reg5 = 169.254.100.2; eth.src = 00:01:a0:9e:9d:40; outport = \"rtb-1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1844 , match=(reg7 == rtb-1 && ip4.dst == 172.31.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.1; reg5 = 169.254.100.2; eth.src = 00:01:a0:9e:9d:40; outport = \"rtb-1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1844 , match=(reg7 == rtb-2 && ip4.dst == 172.31.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.33; reg5 = 169.254.100.34; eth.src = 00:01:60:15:b8:20; outport = \"rtb-2\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1844 , match=(reg7 == rtb-2 && ip4.dst == 172.31.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 169.254.100.33; reg5 = 169.254.100.34; eth.src = 00:01:60:15:b8:20; outport = \"rtb-2\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1846 , match=(reg7 == rtb-1 && ip4.dst == 172.31.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 172.31.2.4; reg5 = 172.31.2.1; eth.src = d0:fe:00:00:00:16; outport = \"subnet-C\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1846 , match=(reg7 == rtb-1 && ip4.dst == 172.31.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 172.31.3.4; reg5 = 172.31.3.1; eth.src = d0:fe:00:00:00:17; outport = \"subnet-D\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1878 , match=(ip4.dst == 169.254.100.0/27), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 169.254.100.2; eth.src = 00:01:a0:9e:9d:40; outport = \"rtb-1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1878 , match=(ip4.dst == 169.254.100.32/27), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 169.254.100.34; eth.src = 00:01:60:15:b8:20; outport = \"rtb-2\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"rtb-1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::201:a0ff:fe9e:9d40; eth.src = 00:01:a0:9e:9d:40; outport = \"rtb-1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"rtb-2\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::201:60ff:fe15:b820; eth.src = 00:01:60:15:b8:20; outport = \"rtb-2\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"subnet-C\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::d2fe:ff:fe00:16; eth.src = d0:fe:00:00:00:16; outport = \"subnet-C\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"subnet-D\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::d2fe:ff:fe00:17; eth.src = d0:fe:00:00:00:17; outport = \"subnet-D\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+])\n+\n+OVN_CLEANUP_IC([az1], [az2])\n+\n+AT_CLEANUP\n+])\ndiff --git a/tests/ovn-northd.at b/tests/ovn-northd.at\nindex 1d7bd6c28..da023c260 100644\n--- a/tests/ovn-northd.at\n+++ b/tests/ovn-northd.at\n@@ -7278,9 +7278,9 @@ AT_CHECK([grep -w \"lr_in_ip_routing\" lr0flows | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10300, match=(ct_mark.ecmp_reply_port == 1 && reg7 == 0 && ip4.dst == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; eth.src = 00:00:20:20:12:13; reg5 = 192.168.0.1; outport = \"lr0-public\"; next;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=260 , match=(reg7 == 0 && ip4.dst == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-public\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1936 , match=(reg7 == 0 && ip4.dst == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-public\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n \n AT_CHECK([grep -e \"lr_in_ip_routing_ecmp\" lr0flows | ovn_strip_lflows], [0], [dnl\n@@ -7304,9 +7304,9 @@ AT_CHECK([grep -w \"lr_in_ip_routing\" lr0flows | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10300, match=(ct_mark.ecmp_reply_port == 1 && reg7 == 0 && ip4.dst == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; eth.src = 00:00:20:20:12:13; reg5 = 192.168.0.1; outport = \"lr0-public\"; next;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=260 , match=(reg7 == 0 && ip4.dst == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-public\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1936 , match=(reg7 == 0 && ip4.dst == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-public\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n AT_CHECK([grep -e \"lr_in_ip_routing_ecmp\" lr0flows | sed 's/192\\.168\\.0\\..0/192.168.0.??/' | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing_ecmp), priority=0 , match=(1), action=(drop;)\n@@ -7346,9 +7346,9 @@ AT_CHECK([grep -w \"lr_in_ip_routing\" lr0flows | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10300, match=(ct_mark.ecmp_reply_port == 1 && reg7 == 0 && ip4.dst == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; eth.src = 00:00:20:20:12:13; reg5 = 192.168.0.1; outport = \"lr0-public\"; next;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=260 , match=(reg7 == 0 && ip4.dst == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-public\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1936 , match=(reg7 == 0 && ip4.dst == 1.0.0.1/32), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-public\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n AT_CHECK([grep -e \"lr_in_ip_routing_ecmp\" lr0flows | sed 's/192\\.168\\.0\\..0/192.168.0.??/' | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing_ecmp), priority=0 , match=(1), action=(drop;)\n@@ -7370,14 +7370,14 @@ check ovn-nbctl --wait=sb lr-route-add lr0 1.0.0.0/24 192.168.0.10\n ovn-sbctl dump-flows lr0 > lr0flows\n \n AT_CHECK([grep -e \"lr_in_ip_routing.*192.168.0.10\" lr0flows | ovn_strip_lflows], [0], [dnl\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 1.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.10; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 1.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.10; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n ])\n \n check ovn-nbctl --wait=sb lr-route-add lr0 2.0.0.0/24 lr0-public\n \n ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -e \"lr_in_ip_routing.*2.0.0.0\" lr0flows | ovn_strip_lflows], [0], [dnl\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 2.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 2.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n ])\n \n check ovn-nbctl lr-route-add lr0 3.3.0.0/16 192.168.0.11\n@@ -7392,7 +7392,7 @@ check ovn-nbctl set logical_router_static_route $route2_uuid selection_fields=\"i\n check ovn-nbctl --wait=sb sync\n ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -e \"(lr_in_ip_routing ).*3.3.0.0\" lr0flows | sed 's/table=../table=??/' | sort], [0], [dnl\n- table=??(lr_in_ip_routing ), priority=132 , match=(reg7 == 0 && ip4.dst == 3.3.0.0/16), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(values=(1, 2); hash_fields=\"ip_dst,ip_proto,ip_src\");)\n+ table=??(lr_in_ip_routing ), priority=1744 , match=(reg7 == 0 && ip4.dst == 3.3.0.0/16), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(values=(1, 2); hash_fields=\"ip_dst,ip_proto,ip_src\");)\n ])\n \n check ovn-nbctl set logical_router_static_route $route1_uuid selection_fields=\"ip_src,ip_dst,tp_src,tp_dst\"\n@@ -7401,10 +7401,10 @@ check ovn-nbctl set logical_router_static_route $route2_uuid selection_fields=\"i\n check ovn-nbctl --wait=sb sync\n ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -e \"(lr_in_ip_routing ).*3.3.0.0\" lr0flows | sed 's/table=../table=??/' | sort], [0], [dnl\n- table=??(lr_in_ip_routing ), priority=132 , match=(reg7 == 0 && ip4.dst == 3.3.0.0/16), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(values=(1, 2); hash_fields=\"ip_dst,ip_proto,ip_src\");)\n- table=??(lr_in_ip_routing ), priority=133 , match=(reg7 == 0 && ip4.dst == 3.3.0.0/16 && sctp), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(values=(1, 2); hash_fields=\"ip_dst,ip_proto,ip_src,sctp_dst,sctp_src\");)\n- table=??(lr_in_ip_routing ), priority=133 , match=(reg7 == 0 && ip4.dst == 3.3.0.0/16 && tcp), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(values=(1, 2); hash_fields=\"ip_dst,ip_proto,ip_src,tcp_dst,tcp_src\");)\n- table=??(lr_in_ip_routing ), priority=133 , match=(reg7 == 0 && ip4.dst == 3.3.0.0/16 && udp), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(values=(1, 2); hash_fields=\"ip_dst,ip_proto,ip_src,udp_dst,udp_src\");)\n+ table=??(lr_in_ip_routing ), priority=1744 , match=(reg7 == 0 && ip4.dst == 3.3.0.0/16), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(values=(1, 2); hash_fields=\"ip_dst,ip_proto,ip_src\");)\n+ table=??(lr_in_ip_routing ), priority=1745 , match=(reg7 == 0 && ip4.dst == 3.3.0.0/16 && sctp), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(values=(1, 2); hash_fields=\"ip_dst,ip_proto,ip_src,sctp_dst,sctp_src\");)\n+ table=??(lr_in_ip_routing ), priority=1745 , match=(reg7 == 0 && ip4.dst == 3.3.0.0/16 && tcp), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(values=(1, 2); hash_fields=\"ip_dst,ip_proto,ip_src,tcp_dst,tcp_src\");)\n+ table=??(lr_in_ip_routing ), priority=1745 , match=(reg7 == 0 && ip4.dst == 3.3.0.0/16 && udp), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(values=(1, 2); hash_fields=\"ip_dst,ip_proto,ip_src,udp_dst,udp_src\");)\n ])\n \n AT_CHECK([grep -e \"lr_in_ecmp_stateful_egr\" lr0flows | ovn_strip_lflows], [0], [dnl\n@@ -7446,15 +7446,15 @@ ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -e \"lr_in_ip_routing \" lr0flows | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.10; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 11.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::10; xxreg1 = 2001:db8::1; eth.src = 00:00:20:20:12:14; outport = \"lr0-private\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=516 , match=(reg7 == 0 && ip6.dst == 2001:db8:1::/64), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.20; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=516 , match=(reg7 == 0 && ip6.dst == 2001:db8:2::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::20; xxreg1 = 2001:db8::1; eth.src = 00:00:20:20:12:14; outport = \"lr0-private\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=516 , match=(reg7 == 0 && ip6.dst == 2001:db8:3::/64), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.1.10; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-private\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1214; eth.src = 00:00:20:20:12:14; outport = \"lr0-private\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-public\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(ip6.dst == 2001:db8::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8::1; eth.src = 00:00:20:20:12:14; outport = \"lr0-private\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.10; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 11.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::10; xxreg1 = 2001:db8::1; eth.src = 00:00:20:20:12:14; outport = \"lr0-private\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2320 , match=(reg7 == 0 && ip6.dst == 2001:db8:1::/64), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.20; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2320 , match=(reg7 == 0 && ip6.dst == 2001:db8:2::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::20; xxreg1 = 2001:db8::1; eth.src = 00:00:20:20:12:14; outport = \"lr0-private\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2320 , match=(reg7 == 0 && ip6.dst == 2001:db8:3::/64), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.1.10; reg5 = 192.168.0.1; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-private\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1214; eth.src = 00:00:20:20:12:14; outport = \"lr0-private\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-public\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:20ff:fe20:1213; eth.src = 00:00:20:20:12:13; outport = \"lr0-public\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(ip6.dst == 2001:db8::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8::1; eth.src = 00:00:20:20:12:14; outport = \"lr0-private\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n \n AT_CHECK([grep -e \"lr_in_arp_resolve\" lr0flows | ovn_strip_lflows], [0], [dnl\n@@ -7970,16 +7970,16 @@ AT_CHECK([grep \"lr_in_ip_routing_pre\" lr0flows | ovn_strip_lflows], [0], [dnl\n grep -e \"(lr_in_ip_routing ).*outport\" lr0flows\n \n AT_CHECK([grep -e \"(lr_in_ip_routing ).*outport\" lr0flows | ovn_strip_lflows], [0], [dnl\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 1 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.1.10; reg5 = 192.168.1.1; eth.src = 00:00:00:00:01:01; outport = \"lrp1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = \"lrp0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 192.168.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.1.1; eth.src = 00:00:00:00:01:01; outport = \"lrp1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 192.168.2.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.2.1; eth.src = 00:00:00:00:02:01; outport = \"lrp2\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=260 , match=(reg7 == 2 && ip4.dst == 1.1.1.1/32), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.20; reg5 = 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = \"lrp0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=4 , match=(reg7 == 0 && ip4.dst == 0.0.0.0/0), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.10; reg5 = 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = \"lrp0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=4 , match=(reg7 == 2 && ip4.dst == 0.0.0.0/0), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.10; reg5 = 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = \"lrp0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lrp0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:1; eth.src = 00:00:00:00:00:01; outport = \"lrp0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lrp1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:101; eth.src = 00:00:00:00:01:01; outport = \"lrp1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lrp2\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:201; eth.src = 00:00:00:00:02:01; outport = \"lrp2\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1552 , match=(reg7 == 0 && ip4.dst == 0.0.0.0/0), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.10; reg5 = 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = \"lrp0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1552 , match=(reg7 == 2 && ip4.dst == 0.0.0.0/0), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.10; reg5 = 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = \"lrp0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 1 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.1.10; reg5 = 192.168.1.1; eth.src = 00:00:00:00:01:01; outport = \"lrp1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = \"lrp0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 192.168.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.1.1; eth.src = 00:00:00:00:01:01; outport = \"lrp1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 192.168.2.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 192.168.2.1; eth.src = 00:00:00:00:02:01; outport = \"lrp2\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1936 , match=(reg7 == 2 && ip4.dst == 1.1.1.1/32), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 192.168.0.20; reg5 = 192.168.0.1; eth.src = 00:00:00:00:00:01; outport = \"lrp0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lrp0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:1; eth.src = 00:00:00:00:00:01; outport = \"lrp0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lrp1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:101; eth.src = 00:00:00:00:01:01; outport = \"lrp1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lrp2\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:201; eth.src = 00:00:00:00:02:01; outport = \"lrp2\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n \n OVN_CLEANUP_NORTHD\n@@ -15879,12 +15879,12 @@ ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -w \"lr_in_ip_routing\" lr0flows | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.10; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=516 , match=(reg7 == 0 && ip6.dst == 2001:db8:1::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::10; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(ip6.dst == 2001:db8::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.10; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2320 , match=(reg7 == 0 && ip6.dst == 2001:db8:1::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::10; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(ip6.dst == 2001:db8::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n \n # Learn a route to 172.16.0.0/24 via 10.0.0.11 learned on lr0-sw0.\n@@ -15900,13 +15900,13 @@ ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -w \"lr_in_ip_routing\" lr0flows | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=194 , match=(reg7 == 0 && ip4.dst == 172.16.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.11; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.10; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=516 , match=(reg7 == 0 && ip6.dst == 2001:db8:1::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::10; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(ip6.dst == 2001:db8::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1838 , match=(reg7 == 0 && ip4.dst == 172.16.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.11; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.10; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2320 , match=(reg7 == 0 && ip6.dst == 2001:db8:1::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::10; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(ip6.dst == 2001:db8::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n \n # Learn a route to 2001:db8:2::/64 via 2001:db8:ffff::20 learned on lr0-sw1.\n@@ -15923,14 +15923,14 @@ ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -w \"lr_in_ip_routing\" lr0flows | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=194 , match=(reg7 == 0 && ip4.dst == 172.16.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.11; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.10; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=514 , match=(reg7 == 0 && ip6.dst == 2001:db8:2::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8:ffff::20; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=516 , match=(reg7 == 0 && ip6.dst == 2001:db8:1::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::10; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(ip6.dst == 2001:db8::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1838 , match=(reg7 == 0 && ip4.dst == 172.16.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.11; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.10; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2318 , match=(reg7 == 0 && ip6.dst == 2001:db8:2::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8:ffff::20; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2320 , match=(reg7 == 0 && ip6.dst == 2001:db8:1::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::10; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(ip6.dst == 2001:db8::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n \n # If we now add 2001:db8:ffff::1/64 as an additional network to lr0-sw1 we\n@@ -15944,15 +15944,15 @@ ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -w \"lr_in_ip_routing\" lr0flows | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=194 , match=(reg7 == 0 && ip4.dst == 172.16.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.11; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.10; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=514 , match=(reg7 == 0 && ip6.dst == 2001:db8:2::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8:ffff::20; xxreg1 = 2001:db8:ffff::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=516 , match=(reg7 == 0 && ip6.dst == 2001:db8:1::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::10; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(ip6.dst == 2001:db8::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(ip6.dst == 2001:db8:ffff::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8:ffff::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1838 , match=(reg7 == 0 && ip4.dst == 172.16.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.11; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.10; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2318 , match=(reg7 == 0 && ip6.dst == 2001:db8:2::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8:ffff::20; xxreg1 = 2001:db8:ffff::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2320 , match=(reg7 == 0 && ip6.dst == 2001:db8:1::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::10; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(ip6.dst == 2001:db8::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(ip6.dst == 2001:db8:ffff::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8:ffff::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n \n # Learn a route to 2001:db8:3::/64 via 10.0.0.20 learned on lr0-sw0.\n@@ -15968,16 +15968,16 @@ ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -w \"lr_in_ip_routing\" lr0flows | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=194 , match=(reg7 == 0 && ip4.dst == 172.16.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.11; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.10; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=514 , match=(reg7 == 0 && ip6.dst == 2001:db8:2::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8:ffff::20; xxreg1 = 2001:db8:ffff::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=514 , match=(reg7 == 0 && ip6.dst == 2001:db8:3::/64), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.20; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=516 , match=(reg7 == 0 && ip6.dst == 2001:db8:1::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::10; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(ip6.dst == 2001:db8::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(ip6.dst == 2001:db8:ffff::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8:ffff::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1838 , match=(reg7 == 0 && ip4.dst == 172.16.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.11; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.10; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2318 , match=(reg7 == 0 && ip6.dst == 2001:db8:2::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8:ffff::20; xxreg1 = 2001:db8:ffff::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2318 , match=(reg7 == 0 && ip6.dst == 2001:db8:3::/64), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.20; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2320 , match=(reg7 == 0 && ip6.dst == 2001:db8:1::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::10; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(ip6.dst == 2001:db8::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(ip6.dst == 2001:db8:ffff::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8:ffff::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n \n # Learn a route to 172.16.1.0/24 via 2001:db8:ffff::30 learned on lr0-sw1.\n@@ -15993,17 +15993,17 @@ ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -w \"lr_in_ip_routing\" lr0flows | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=194 , match=(reg7 == 0 && ip4.dst == 172.16.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.11; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=194 , match=(reg7 == 0 && ip4.dst == 172.16.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8:ffff::30; xxreg1 = 2001:db8:ffff::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.10; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=514 , match=(reg7 == 0 && ip6.dst == 2001:db8:2::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8:ffff::20; xxreg1 = 2001:db8:ffff::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=514 , match=(reg7 == 0 && ip6.dst == 2001:db8:3::/64), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.20; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=516 , match=(reg7 == 0 && ip6.dst == 2001:db8:1::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::10; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(ip6.dst == 2001:db8::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(ip6.dst == 2001:db8:ffff::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8:ffff::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1838 , match=(reg7 == 0 && ip4.dst == 172.16.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.11; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1838 , match=(reg7 == 0 && ip4.dst == 172.16.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8:ffff::30; xxreg1 = 2001:db8:ffff::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.10; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2318 , match=(reg7 == 0 && ip6.dst == 2001:db8:2::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8:ffff::20; xxreg1 = 2001:db8:ffff::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2318 , match=(reg7 == 0 && ip6.dst == 2001:db8:3::/64), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.20; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2320 , match=(reg7 == 0 && ip6.dst == 2001:db8:1::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = 2001:db8::10; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(ip6.dst == 2001:db8::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(ip6.dst == 2001:db8:ffff::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = 2001:db8:ffff::1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n \n # Deleting lr0-sw1 will remove the flows and also the learned route.\n@@ -16015,11 +16015,11 @@ ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -w \"lr_in_ip_routing\" lr0flows | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=194 , match=(reg7 == 0 && ip4.dst == 172.16.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.11; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.10; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=514 , match=(reg7 == 0 && ip6.dst == 2001:db8:3::/64), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.20; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1838 , match=(reg7 == 0 && ip4.dst == 172.16.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.11; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.10; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2318 , match=(reg7 == 0 && ip6.dst == 2001:db8:3::/64), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.20; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n \n OVN_CLEANUP_NORTHD\n@@ -16049,11 +16049,11 @@ ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -w \"lr_in_ip_routing\" lr0flows | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.1.1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.1.1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n AT_CHECK([grep -e \"lr_in_ip_routing_ecmp\" lr0flows | sed -e 's/10\\.0\\..\\./10.0.??./g' -e 's/lr0-sw./lr0-sw??/' -e 's/00:ff:0./00:ff:0?/' | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing_ecmp), priority=0 , match=(1), action=(drop;)\n@@ -16075,12 +16075,12 @@ ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -w \"lr_in_ip_routing\" lr0flows | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=194 , match=(reg7 == 0 && ip4.dst == 192.168.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.20; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.1.1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1838 , match=(reg7 == 0 && ip4.dst == 192.168.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = 10.0.0.20; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.1.1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n AT_CHECK([grep -e \"lr_in_ip_routing_ecmp\" lr0flows | sed -e 's/10\\.0\\..\\./10.0.??./g' -e 's/lr0-sw./lr0-sw??/' -e 's/00:ff:0./00:ff:0?/' | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing_ecmp), priority=0 , match=(1), action=(drop;)\n@@ -16103,12 +16103,12 @@ ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -w \"lr_in_ip_routing\" lr0flows | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=194 , match=(reg7 == 0 && ip4.dst == 192.168.1.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 2; reg8[[16..31]] = select(1, 2);)\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.1.1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1838 , match=(reg7 == 0 && ip4.dst == 192.168.1.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 2; reg8[[16..31]] = select(1, 2);)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.1.1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n AT_CHECK([grep -e \"lr_in_ip_routing_ecmp\" lr0flows | sed -e 's/10\\.0\\..\\./10.0.??./g' -e 's/lr0-sw./lr0-sw??/' -e 's/00:ff:0./00:ff:0?/' | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing_ecmp), priority=0 , match=(1), action=(drop;)\n@@ -16145,13 +16145,13 @@ ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep -w \"lr_in_ip_routing\" lr0flows | sed -e 's/reg8\\[[0..15\\]] = [[123]]/reg8\\[[0..15\\]] = ??/' | ovn_strip_lflows], [0], [dnl\n table=??(lr_in_ip_routing ), priority=0 , match=(1), action=(drop;)\n table=??(lr_in_ip_routing ), priority=10550, match=(nd_rs || nd_ra), action=(drop;)\n- table=??(lr_in_ip_routing ), priority=194 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = ??; reg8[[16..31]] = select(1, 2);)\n- table=??(lr_in_ip_routing ), priority=194 , match=(reg7 == 0 && ip4.dst == 192.168.1.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = ??; reg8[[16..31]] = select(1, 2);)\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = ??; reg8[[16..31]] = select(1, 2);)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=198 , match=(ip4.dst == 10.0.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.1.1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n- table=??(lr_in_ip_routing ), priority=518 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=1838 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = ??; reg8[[16..31]] = select(1, 2);)\n+ table=??(lr_in_ip_routing ), priority=1838 , match=(reg7 == 0 && ip4.dst == 192.168.1.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = ??; reg8[[16..31]] = select(1, 2);)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.0.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = ??; reg8[[16..31]] = select(1, 2);)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.0.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.0.1; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=1842 , match=(ip4.dst == 10.0.1.0/24), action=(ip.ttl--; reg8[[0..15]] = 0; reg0 = ip4.dst; reg5 = 10.0.1.1; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 1; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw0\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff01; eth.src = 00:00:00:00:ff:01; outport = \"lr0-sw0\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n+ table=??(lr_in_ip_routing ), priority=2322 , match=(inport == \"lr0-sw1\" && ip6.dst == fe80::/64), action=(ip.ttl--; reg8[[0..15]] = 0; xxreg0 = ip6.dst; xxreg1 = fe80::200:ff:fe00:ff02; eth.src = 00:00:00:00:ff:02; outport = \"lr0-sw1\"; flags.loopback = 1; reg9[[9]] = 0; next;)\n ])\n \n OVN_CLEANUP_NORTHD\n@@ -20473,7 +20473,7 @@ check ovn-nbctl --wait=sb sync\n \n ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep 'lr_in_ip_routing' lr0flows | grep 'select' | ovn_strip_lflows], [0], [dnl\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.10.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.10.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n ])\n \n AT_CHECK([grep 'lr_in_ip_routing_ecmp' lr0flows | sed -E 's/== [[1-9]]+\\)/== \\?)/' | ovn_strip_lflows], [0], [dnl\n@@ -20491,7 +20491,7 @@ check ovn-nbctl --wait=sb set Logical_Router_Static_Route $ecmp1 nexthop=\"discar\n \n ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep 'lr_in_ip_routing' lr0flows | grep 'select' | ovn_strip_lflows], [0], [dnl\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.10.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.10.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n ])\n \n AT_CHECK([grep 'lr_in_ip_routing_ecmp' lr0flows | sed -E 's/== [[1-9]]+\\)/== \\?)/' | ovn_strip_lflows], [0], [dnl\n@@ -20506,7 +20506,7 @@ check ovn-nbctl --wait=sb set Logical_Router_Static_Route $ecmp2 nexthop=\"discar\n \n ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep 'lr_in_ip_routing' lr0flows | grep 'select' | ovn_strip_lflows], [0], [dnl\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.10.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.10.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n ])\n \n AT_CHECK([grep 'lr_in_ip_routing_ecmp' lr0flows | sed -E 's/== [[1-9]]+\\)/== \\?)/' | ovn_strip_lflows], [0], [dnl\n@@ -20522,7 +20522,7 @@ check ovn-nbctl --wait=sb set Logical_Router_Static_Route $ecmp2 nexthop=\"10.0.2\n \n ovn-sbctl dump-flows lr0 > lr0flows\n AT_CHECK([grep 'lr_in_ip_routing' lr0flows | grep 'select' | ovn_strip_lflows], [0], [dnl\n- table=??(lr_in_ip_routing ), priority=196 , match=(reg7 == 0 && ip4.dst == 192.168.10.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n+ table=??(lr_in_ip_routing ), priority=1840 , match=(reg7 == 0 && ip4.dst == 192.168.10.0/24), action=(ip.ttl--; flags.loopback = 1; reg8[[0..15]] = 1; reg8[[16..31]] = select(1, 2);)\n ])\n \n AT_CHECK([grep 'lr_in_ip_routing_ecmp' lr0flows | sed -E 's/== [[1-9]]+\\)/== \\?)/' | ovn_strip_lflows], [0], [dnl\ndiff --git a/utilities/ovn-nbctl.8.xml b/utilities/ovn-nbctl.8.xml\nindex 4fbd0bb0e..1c67bbd1f 100644\n--- a/utilities/ovn-nbctl.8.xml\n+++ b/utilities/ovn-nbctl.8.xml\n@@ -1146,6 +1146,7 @@\n <dt>[<code>--may-exist</code>] [<code>--policy</code>=<var>POLICY</var>]\n [<code>--route-table</code>=<var>ROUTE_TABLE</var>]\n [<code>--ecmp</code>] [<code>--ecmp-symmetric-reply</code>]\n+ [<code>--override-connected</code>]\n [<code>--bfd[=<var>UUID</var></code>]]\n <code>lr-route-add</code> <var>router</var>\n <var>prefix</var> <var>nexthop</var> [<var>port</var>]</dt>\n@@ -1194,6 +1195,11 @@\n it is not necessary to set both.\n </p>\n \n+ <p>\n+ The <code>--override-connected</code> option makes it so that\n+ route's priority to be highest among routes with same prefix.\n+ </p>\n+\n <p>\n <code>--bfd</code> option is used to link a BFD session to the\n OVN route. If the BFD session UUID is provided, it will be used\ndiff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c\nindex 0ef207272..abc172b57 100644\n--- a/utilities/ovn-nbctl.c\n+++ b/utilities/ovn-nbctl.c\n@@ -448,6 +448,7 @@ Route commands:\\n\\\n [--policy=POLICY]\\n\\\n [--ecmp]\\n\\\n [--ecmp-symmetric-reply]\\n\\\n+ [--override-connected]\\n\\\n [--route-table=ROUTE_TABLE]\\n\\\n [--bfd]\\n\\\n lr-route-add ROUTER PREFIX NEXTHOP [PORT]\\n\\\n@@ -5236,6 +5237,8 @@ nbctl_lr_route_add(struct ctl_context *ctx)\n \"--ecmp-symmetric-reply\") != NULL;\n bool ecmp = shash_find(&ctx->options, \"--ecmp\") != NULL ||\n ecmp_symmetric_reply;\n+ bool override_connected = shash_find(&ctx->options,\n+ \"--override-connected\") != NULL;\n struct nbrec_logical_router_static_route *route =\n nbctl_lr_get_route(lr, prefix, next_hop, is_src_route, ecmp,\n route_table);\n@@ -5323,11 +5326,20 @@ nbctl_lr_route_add(struct ctl_context *ctx)\n nbrec_logical_router_static_route_set_route_table(route, route_table);\n }\n \n- if (ecmp_symmetric_reply) {\n- const struct smap options = SMAP_CONST1(&options,\n- \"ecmp_symmetric_reply\",\n- \"true\");\n+ if (ecmp_symmetric_reply || override_connected) {\n+ struct smap options = SMAP_INITIALIZER(&options);\n+\n+ if (ecmp_symmetric_reply) {\n+ smap_add(&options, \"ecmp_symmetric_reply\", \"true\");\n+ }\n+\n+ if (override_connected) {\n+ smap_add(&options, ROUTE_OVERRIDE_CONNECTED, \"true\");\n+ }\n+\n nbrec_logical_router_static_route_set_options(route, &options);\n+\n+ smap_destroy(&options);\n }\n \n nbrec_logical_router_update_static_routes_addvalue(lr, route);\n@@ -7437,6 +7449,10 @@ print_route(const struct nbrec_logical_router_static_route *route,\n ds_put_cstr(s, \" ecmp-symmetric-reply\");\n }\n \n+ if (smap_get_bool(&route->options, ROUTE_OVERRIDE_CONNECTED, false)) {\n+ ds_put_cstr(s, \" override-connected\");\n+ }\n+\n if (route->bfd) {\n ds_put_cstr(s, \" bfd\");\n }\n@@ -9420,8 +9436,8 @@ static const struct ctl_command_syntax nbctl_commands[] = {\n /* logical router route commands. */\n { \"lr-route-add\", 3, 4, \"ROUTER PREFIX NEXTHOP [PORT]\",\n nbctl_pre_lr_route_add, nbctl_lr_route_add, NULL,\n- \"--may-exist,--ecmp,--ecmp-symmetric-reply,--policy=,\"\n- \"--route-table=,--bfd?\", RW },\n+ \"--may-exist,--ecmp,--ecmp-symmetric-reply,--override-connected,\"\n+ \"--policy=,--route-table=,--bfd?\", RW },\n { \"lr-route-del\", 1, 4, \"ROUTER [PREFIX [NEXTHOP [PORT]]]\",\n nbctl_pre_lr_route_del, nbctl_lr_route_del, NULL,\n \"--if-exists,--policy=,--route-table=\", RW },\n", "prefixes": [ "ovs-dev", "v6" ] }