get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.1/patches/2227936/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2227936,
    "url": "http://patchwork.ozlabs.org/api/1.1/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/1.1/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": ""
    },
    "msgid": "<20260424141009.91977-1-ARukomoinikova@k2.cloud>",
    "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/1.1/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/1.1/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": {},
    "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"
    ]
}