[{"id":3678424,"web_url":"http://patchwork.ozlabs.org/comment/3678424/","msgid":"<20260416230526.4192692-1-robot@bytheb.org>","list_archive_url":null,"date":"2026-04-16T23:05:26","subject":"Re: [ovs-dev] [PATCH ovn v5] northd,\n ovn-ic: Add support for east-west traffic PBR.","submitter":{"id":74326,"url":"http://patchwork.ozlabs.org/api/people/74326/","name":"0-day Robot","email":"robot@bytheb.org"},"content":"Bleep bloop.  Greetings Alexandra Rukomoinikova, I am a robot and I have tried out your patch.\nThanks for your contribution.\n\nI encountered some error that I wasn't expecting.  See the details below.\n\n\ncheckpatch:\nERROR: Author Alexandra Rukomoinikova <ARukomoinikova@k2.cloud> needs to sign off.\nWARNING: Unexpected sign-offs from developers who are not authors or co-authors or committers: Alexandra Rukomoinikova <arukomoinikova@k2.cloud>\nWARNING: Line lacks whitespace around operator\n#1527 FILE: utilities/ovn-nbctl.c:451:\n  [--override-connected]\\n\\\n\nLines checked: 1590, Warnings: 2, Errors: 1\n\n\nPlease check this out.  If you feel there has been an error, please email aconole@redhat.com\n\nThanks,\n0-day Robot","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\" (2048-bit key;\n unprotected) header.d=bytheb-org.20251104.gappssmtp.com\n header.i=@bytheb-org.20251104.gappssmtp.com header.a=rsa-sha256\n header.s=20251104 header.b=OpUpndVK;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=2605:bc80:3010::138; helo=smtp1.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)","smtp1.osuosl.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key)\n header.d=bytheb-org.20251104.gappssmtp.com\n header.i=@bytheb-org.20251104.gappssmtp.com header.a=rsa-sha256\n header.s=20251104 header.b=OpUpndVK","smtp4.osuosl.org;\n dmarc=none (p=none dis=none) header.from=bytheb.org","smtp4.osuosl.org; dkim=pass (2048-bit key,\n unprotected) header.d=bytheb-org.20251104.gappssmtp.com\n header.i=@bytheb-org.20251104.gappssmtp.com header.a=rsa-sha256\n header.s=20251104 header.b=OpUpndVK"],"Received":["from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138])\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 4fxYWz5F1Cz1yCv\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 17 Apr 2026 09:05:35 +1000 (AEST)","from localhost (localhost [127.0.0.1])\n\tby smtp1.osuosl.org (Postfix) with ESMTP id E53E78119E;\n\tThu, 16 Apr 2026 23:05:33 +0000 (UTC)","from smtp1.osuosl.org ([127.0.0.1])\n by localhost (smtp1.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id PW5OWpxQbqBR; Thu, 16 Apr 2026 23:05:33 +0000 (UTC)","from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56])\n\tby smtp1.osuosl.org (Postfix) with ESMTPS id 018A080DC4;\n\tThu, 16 Apr 2026 23:05:33 +0000 (UTC)","from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id D9551C058E;\n\tThu, 16 Apr 2026 23:05:32 +0000 (UTC)","from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137])\n by lists.linuxfoundation.org (Postfix) with ESMTP id A5648C058D\n for <dev@openvswitch.org>; Thu, 16 Apr 2026 23:05:31 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp4.osuosl.org (Postfix) with ESMTP id 97BA140A00\n for <dev@openvswitch.org>; Thu, 16 Apr 2026 23:05:31 +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 qDzWXvocfTmQ for <dev@openvswitch.org>;\n Thu, 16 Apr 2026 23:05:30 +0000 (UTC)","from mail-qk1-x72e.google.com (mail-qk1-x72e.google.com\n [IPv6:2607:f8b0:4864:20::72e])\n by smtp4.osuosl.org (Postfix) with ESMTPS id 414AD409FC\n for <dev@openvswitch.org>; Thu, 16 Apr 2026 23:05:30 +0000 (UTC)","by mail-qk1-x72e.google.com with SMTP id\n af79cd13be357-8cb40149037so5594585a.2\n for <dev@openvswitch.org>; Thu, 16 Apr 2026 16:05:29 -0700 (PDT)","from upstream-bot-ci.anl.eng.rdu2.dc.redhat.com ([66.187.232.140])\n by smtp.gmail.com with ESMTPSA id\n d75a77b69052e-50e34a6e242sm5727791cf.31.2026.04.16.16.05.27\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Thu, 16 Apr 2026 16:05:28 -0700 (PDT)"],"X-Virus-Scanned":["amavis at osuosl.org","amavis at osuosl.org"],"X-Comment":"SPF check N/A for local connections - client-ip=140.211.9.56;\n helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ","DKIM-Filter":["OpenDKIM Filter v2.11.0 smtp1.osuosl.org 018A080DC4","OpenDKIM Filter v2.11.0 smtp4.osuosl.org 414AD409FC"],"Received-SPF":"Pass (mailfrom) identity=mailfrom;\n client-ip=2607:f8b0:4864:20::72e; helo=mail-qk1-x72e.google.com;\n envelope-from=robot@bytheb.org; receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp4.osuosl.org 414AD409FC","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=bytheb-org.20251104.gappssmtp.com; s=20251104; t=1776380729; x=1776985529;\n darn=openvswitch.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=HhVvj5Pds+isU4y4icsdYOLB1DENugQtXdeT7lvQQFo=;\n b=OpUpndVKEnwf0y0khjGVTiQ4IzDc0nqxNwAd9gsz+AWgwzOqwtRz0x1MOP3XiCan4u\n 0qReiEDOAfJxYKA3EFfNqvtF8j7iq/bVh9ZSW79YslnB6T2uT1XoEJGXmZQUVVwsknzV\n JTEl0E5M25tGR9kjItHJVoys81U+pidMVQdG9SsBYjO52RWXGffHI4Ejtr3FmqxJ5Xxb\n s45EYhQiRt/OiHx6eIHOqcWV0Gpbksmwe1Opbi/mf9G80+bW6AriL8tQ2fTVNCQZ+NuK\n Uk+ctXYkeN892N3NFB3qvHWxUBbUypU5m6Fite6RR1LOvsggDz1se3vWXmrP5K8sEYir\n jqZA==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776380729; x=1776985529;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=HhVvj5Pds+isU4y4icsdYOLB1DENugQtXdeT7lvQQFo=;\n b=skA+B1ivlw9kVW1YqQdbMulJQBR6hLxcyxAX12Lb0FYozSSEF/mlxBFT1RljNhDwtx\n s7W7vofdFlTNghwh68/TCdE8Wn06w7ZpfwDJJxkRyYvuxjYaC6jSQa9yr3T2d/Qvp3o7\n 8bcQ/5UBLYAgKaGBLAzjEHw08YWXds9gnTsN3AgHhNX2JtvRuPlsJvhkebBH8HFpnNqE\n /UBrcsPBrYExKFdk/Afzx8Gqmv1LMRqzWD+KPrimtvWCpA236CmrNPblUSCVNBiJvm/M\n yNf7WpiqNJDNyYCCSMiFJcwD4SyqzkNmKnZwjW8O7yOIk56nXbn37AyVnzgyqERIP5CO\n lWIw==","X-Gm-Message-State":"AOJu0YwLrmhIc0VPYtizRELqElQUF9AoQTB9/UvctDNmd8kZxWKtV/rD\n xB8TwFCmr2fV2PLzX1GxXUP+dOvGbHqVGX/nz+uxFB8zwO18l5ovg41zTMuUsnKbjTLMbfajm6J\n yzHBa","X-Gm-Gg":"AeBDiet+kl3NCG3x/w7MutuCEi2O6pg67DTABVbAZbR4a00vXaF7k/d7OBRVCTP+Ybe\n WkbUj+T6FDHlopCqs8/fvLR0Yi5HxNIjz1qcqasOMhGMt2LPCXA9fb4wnSUl+ip6Xz3Jz3C8j6X\n wJDaCAyQNWrUrKlNqSuC5AfSQrI3cgVwd43zYWSrgZGcqiNPYIxs+plZT9J96AFEMSJe3sB6wwW\n dVXIRzCpVoqwXaCce+buG3PEpuyhDUphw+4gomc8jk+XwIvuzQI1qjVb7FPD9nOV5jEsqhdkYWH\n TzVxAJFJDPT+UvqwPpoz8YHnzCLjey1xtbf6z07OCve/3XJvG+whNcQzz1Zaxai59u2NrLzAhyU\n 57g/jcatOcWH5pMT5k4PdgfkHF+VTCdVse8fWMIiB7e+n9gaTrvFFzO1v45n4pDNAU4yta7zRmQ\n N6+dHCIatKK2/fFs1KnZkDJjrnCLrPUEbnhkvhBR9WWG9PNkOd5L70CEw8zNQHXOMZ6HG0CA==","X-Received":"by 2002:a05:622a:4a11:b0:50d:6ef4:b399 with SMTP id\n d75a77b69052e-50e3682180emr5929961cf.6.1776380728635;\n Thu, 16 Apr 2026 16:05:28 -0700 (PDT)","From":"0-day Robot <robot@bytheb.org>","To":"Alexandra Rukomoinikova <ARukomoinikova@k2.cloud>","Cc":"dev@openvswitch.org","Date":"Thu, 16 Apr 2026 19:05:26 -0400","Message-ID":"<20260416230526.4192692-1-robot@bytheb.org>","X-Mailer":"git-send-email 2.43.0","In-Reply-To":"<20260416224258.50261-1-arukomoinikova@k2.cloud>","References":"<20260416224258.50261-1-arukomoinikova@k2.cloud>","MIME-Version":"1.0","Subject":"Re: [ovs-dev] [PATCH ovn v5] 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>","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>"}},{"id":3681356,"web_url":"http://patchwork.ozlabs.org/comment/3681356/","msgid":"<dd771cec-2787-424d-9e14-19e3c9372006@redhat.com>","list_archive_url":null,"date":"2026-04-23T09:50:15","subject":"Re: [ovs-dev] [PATCH ovn v5] northd,\n ovn-ic: Add support for east-west traffic PBR.","submitter":{"id":76591,"url":"http://patchwork.ozlabs.org/api/people/76591/","name":"Dumitru Ceara","email":"dceara@redhat.com"},"content":"On 4/17/26 12:42 AM, Alexandra Rukomoinikova via dev wrote:\n> Enable east-west traffic rerouting for locally connected networks between\n> Availability Zones (AZs). This allows traffic destined to a locally connected\n> network to be forcibly forwarded to a remote AZ for processing (e.g.,\n> firewalling, inspection, service chaining) and then delivered back.\n> \n> Introduce new option (override-connected) for static routes. Static route with\n> this option set overrides local directly connected route. ovn-ic is extended to\n> pass this option during advertise-learn processing. Also, route_table column in\n> ic database now used for connected routes too.\n> \n> IC route priorities are changed to raise the priority of learned connected\n> routes that have a route table set. The new priority order for the same\n> prefix (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> \n> Signed-off-by: Alexandra Rukomoinikova <arukomoinikova@k2.cloud>\n> ---\n\nHi Alexandra,\n\nI think this breaks backwards compatibility for routing in some\nscenarios.  I didn't dig too deep but the ovnkube CI fails consistently\nwith this patch applied:\n\nhttps://github.com/ovsrobot/ovn/actions/runs/24538488651/job/71740202322\n\nThe failing tests are all related to static routes with policy=src-ip.\n\nIf you need to debug this further, the databases for each of the failing\ntest cases are stored in the GitHub actions artifact we saved during the\nrun, e.g.:\n\nhttps://github.com/ovsrobot/ovn/actions/runs/24538488651/artifacts/6486865832\n\nin the relative path\nkind-logs-external-gateway-noHA-shared-ipv4-noSnatGW-2br-24538488651/<NODE>/e2e-dbs\n\nPlease see some more comments below.\n\n> v4 (https://patchwork.ozlabs.org/project/ovn/patch/20251128154550.4840-1-arukomoinikova@k2.cloud/)\n> --> v5: Rebased, added documentation to ovn-northd manpage AD for routing\n> ---\n>  NEWS                           |   2 +\n>  ic/ovn-ic.c                    |  81 ++++++++---\n>  lib/ovn-util.h                 |   2 +\n>  northd/en-learned-route-sync.c |   2 +-\n>  northd/northd.c                | 162 +++++++++++++---------\n>  northd/northd.h                |   8 +-\n>  northd/ovn-northd.8.xml        |  42 ++++++\n>  ovn-ic-sb.ovsschema            |   7 +-\n>  ovn-ic-sb.xml                  |  28 ++++\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, 582 insertions(+), 214 deletions(-)\n> \n> diff --git a/NEWS b/NEWS\n> index 8633ba8bb..dc1305bd3 100644\n> --- a/NEWS\n> +++ b/NEWS\n> @@ -3,6 +3,8 @@ 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> +    - Changed administrative distance for specific route types. Please see\n> +      section Route Administrative Distance ovn-northd manpage.\n\ns/section /the section\n\nAnd maybe quotes for the section name.\n\n>  \n>  OVN v26.03.0 - xxx xx xxxx\n>  --------------------------\n> diff --git a/ic/ovn-ic.c b/ic/ovn-ic.c\n> index ba9490658..187719cd3 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\nNit: double space after '='.\n\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>  }\n> diff --git a/lib/ovn-util.h b/lib/ovn-util.h\n> index bcb344de4..ab45f559e 100644\n> --- a/lib/ovn-util.h\n> +++ b/lib/ovn-util.h\n> @@ -35,6 +35,8 @@\n>  #define ROUTE_ORIGIN_LB \"loadbalancer\"\n>  #define ROUTE_ORIGIN_CONNECTED_DYNAMIC \"connected-dynamic\"\n>  \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>  \n> diff --git a/northd/en-learned-route-sync.c b/northd/en-learned-route-sync.c\n> index 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>  }\n> diff --git a/northd/northd.c b/northd/northd.c\n> index 0b52db6cf..009724922 100644\n> --- a/northd/northd.c\n> +++ b/northd/northd.c\n> @@ -377,14 +377,20 @@ 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>  /* 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 +12151,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 +12185,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 +12201,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 +12230,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 +12292,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 +12300,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 +12433,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 +12448,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 +12465,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 +12473,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> @@ -12514,16 +12531,36 @@ build_route_prefix_s(const struct in6_addr *prefix, unsigned int plen)\n>  }\n>  \n>  static uint16_t\n> -route_source_to_offset(enum route_source source)\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\nI think the problem is in this function, the new way of calculating\npriority will _never_ allow a policy=src route to be selected over a\npolicy=dst route that has a _shorter_ prefix.\n\nThe way OVN currently works is (as documented):\n\n<p>\n  When multiple routes match a packet, the longest-prefix match is chosen.\n  For a given prefix length, a <code>dst-ip</code> route is preferred over\n  a <code>src-ip</code> route.\n</p>\n\nBut with your code, if we have two routes:\na. policy=src-ip, prefix=1.1.1.1/32 => calc_priority() returns 384\nb. policy=dst-ip, prefix=0.0.0.0/0  => calc_priority() returns 1552\n\nSo \"a\" will never be preferred over \"b\", breaking the way routing\ncurrently works.  More details in:\n\nhttps://mail.openvswitch.org/pipermail/ovs-dev/2025-September/426004.html\n\n> +    uint16_t pri = (plen * ROUTE_PRIO_OFFSET_MULTIPLIER) + has_protocol_match;\n> +\n> +    if (is_src_route) {\n> +        return pri;\n> +    }\n> +\n>      switch (source) {\n>      case ROUTE_SOURCE_CONNECTED:\n>      case ROUTE_SOURCE_IC_DYNAMIC:\n> -        return ROUTE_PRIO_OFFSET_CONNECTED;\n> +        pri += (override_connected)\n> +               ? ROUTE_PRIO_OFFSET_IC_LEARNED_CONNECTED_WITH_TABLEID\n> +               : ROUTE_PRIO_OFFSET_CONNECTED;\n> +        break;\n> +\n>      case ROUTE_SOURCE_STATIC:\n> -        return ROUTE_PRIO_OFFSET_STATIC;\n> +        pri += (override_connected)\n> +               ? ROUTE_PRIO_OFFSET_PRIORITY_STATIC\n> +               : ROUTE_PRIO_OFFSET_STATIC;\n> +        break;\n> +\n>      case ROUTE_SOURCE_LEARNED:\n> -        return ROUTE_PRIO_OFFSET_LEARNED;\n> +        pri += ROUTE_PRIO_OFFSET_LEARNED;\n> +        break;\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> @@ -12531,41 +12568,8 @@ route_source_to_offset(enum route_source source)\n>      default:\n>          OVS_NOT_REACHED();\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> -{\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>  \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> -    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 pri + (128 + 1) * ROUTE_PRIO_OFFSET_MULTIPLIER;\n>  }\n>  \n>  bool\n> @@ -12756,10 +12760,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,7 +12901,8 @@ 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> @@ -12900,8 +12916,22 @@ 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> +    priority = calc_priority(plen, source, override_connected, is_src_route,\n> +                             false);\n>  \n>      struct ds common_actions = DS_EMPTY_INITIALIZER;\n>      struct ds actions = DS_EMPTY_INITIALIZER;\n> @@ -12966,7 +12996,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 +18736,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>          }\n> diff --git a/northd/northd.h b/northd/northd.h\n> index 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,\n> diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml\n> index 4d6370da6..2fa5f59f3 100644\n> --- a/northd/ovn-northd.8.xml\n> +++ b/northd/ovn-northd.8.xml\n> @@ -6293,6 +6293,48 @@ 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,\n> +      similar AD concept in traditional networking, but with some custom\n\nNit: I'd rephrase to \"similar to traditional networking but with some\ndifferences\"\n\n> +      extensions. Routes with higher priority are preferred over those with\n> +      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\nPlease check the encoding you're using, please use plain ASCII dashes\ninstead of \"—\".\n\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 IP routes.\n> +        </li>\n> +      </ol>\n> +    </p>\n> +\n>      <h1>Drop sampling</h1>\n>  \n>      <p>\n> diff --git a/ovn-ic-sb.ovsschema b/ovn-ic-sb.ovsschema\n> index 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\"}}},\n> diff --git a/ovn-ic-sb.xml b/ovn-ic-sb.xml\n> index f30760100..51448c932 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,26 @@\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> +            For static routes this options is a copy of same option\n\nNit: should be \"this option is a copy of its Northbound DB counterpart\".\n\n> +            from Northbound DB.\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.\">\n> diff --git a/ovn-nb.xml b/ovn-nb.xml\n> index 7324e8656..b43727a01 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>\n> diff --git a/tests/ovn-ic.at b/tests/ovn-ic.at\n> index 0fa7c4f29..272393548 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> +])\n> \\ No newline at end of file\n\nNo newline at end of file.\n\n> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at\n> index 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\n> diff --git a/utilities/ovn-nbctl.8.xml b/utilities/ovn-nbctl.8.xml\n> index 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\n> diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c\n> index 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\nRegards,\nDumitru","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=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=TLv+puTY;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=140.211.166.136; helo=smtp3.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)","smtp3.osuosl.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=TLv+puTY","smtp2.osuosl.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com","smtp2.osuosl.org; dkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=TLv+puTY"],"Received":["from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136])\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 4g1WYc6pggz1y2d\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 23 Apr 2026 19:50:43 +1000 (AEST)","from localhost (localhost [127.0.0.1])\n\tby smtp3.osuosl.org (Postfix) with ESMTP id D031360D9E;\n\tThu, 23 Apr 2026 09:50:40 +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 dv8FQ2q4ngMp; Thu, 23 Apr 2026 09:50:38 +0000 (UTC)","from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56])\n\tby smtp3.osuosl.org (Postfix) with ESMTPS id 0D35B60D88;\n\tThu, 23 Apr 2026 09:50:38 +0000 (UTC)","from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id F2BC4C058E;\n\tThu, 23 Apr 2026 09:50:37 +0000 (UTC)","from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 70BBFC058D\n for <dev@openvswitch.org>; Thu, 23 Apr 2026 09:50:36 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp2.osuosl.org (Postfix) with ESMTP id 6239140082\n for <dev@openvswitch.org>; Thu, 23 Apr 2026 09:50:36 +0000 (UTC)","from smtp2.osuosl.org ([127.0.0.1])\n by localhost (smtp2.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id KtFAyfxkL7vL for <dev@openvswitch.org>;\n Thu, 23 Apr 2026 09:50:34 +0000 (UTC)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.129.124])\n by smtp2.osuosl.org (Postfix) with ESMTPS id 905C54005E\n for <dev@openvswitch.org>; Thu, 23 Apr 2026 09:50:32 +0000 (UTC)","from mail-pl1-f200.google.com (mail-pl1-f200.google.com\n [209.85.214.200]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-27-cHWPwudpM8W8PYOLDK37zQ-1; Thu, 23 Apr 2026 05:50:28 -0400","by mail-pl1-f200.google.com with SMTP id\n d9443c01a7336-2b7867bb92dso56390965ad.3\n for <dev@openvswitch.org>; Thu, 23 Apr 2026 02:50:28 -0700 (PDT)","from ?IPV6:2001:1c05:1417:d800:d1ef:9817:2a26:625d?\n (2001-1c05-1417-d800-d1ef-9817-2a26-625d.cable.dynamic.v6.ziggo.nl.\n [2001:1c05:1417:d800:d1ef:9817:2a26:625d])\n by smtp.gmail.com with ESMTPSA id\n d9443c01a7336-2b5faa34ea7sm189822555ad.34.2026.04.23.02.50.19\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Thu, 23 Apr 2026 02:50:22 -0700 (PDT)"],"X-Virus-Scanned":["amavis at osuosl.org","amavis at osuosl.org"],"X-Comment":"SPF check N/A for local connections - client-ip=140.211.9.56;\n helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ","DKIM-Filter":["OpenDKIM Filter v2.11.0 smtp3.osuosl.org 0D35B60D88","OpenDKIM Filter v2.11.0 smtp2.osuosl.org 905C54005E"],"Received-SPF":"Pass (mailfrom) identity=mailfrom; client-ip=170.10.129.124;\n helo=us-smtp-delivery-124.mimecast.com; envelope-from=dceara@redhat.com;\n receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp2.osuosl.org 905C54005E","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1776937831;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=8XzAUJm0RYcmYolXJsJX2ShWymAMXWQR1JClq0wnV0g=;\n b=TLv+puTY9hRWUWUHHoaGjxWz8iph8lIdrPU/OeJuIkCRn/DH6DyuBcb1tGi6BbqMFkT/mx\n rVq86Kf6I9xeoKadcIos+JPl7upkfs/oKYDj42/391BctLlmbnnJG7W2Eq1iO56gFK4K/7\n W8RjnOp4gdQLBvfgqo5xEnTEmb2jY1Y=","X-MC-Unique":"cHWPwudpM8W8PYOLDK37zQ-1","X-Mimecast-MFC-AGG-ID":"cHWPwudpM8W8PYOLDK37zQ_1776937828","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776937828; x=1777542628;\n h=content-transfer-encoding:in-reply-to:content-language:references\n :to:subject:from:user-agent:mime-version:date:message-id:x-gm-gg\n :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to;\n bh=8XzAUJm0RYcmYolXJsJX2ShWymAMXWQR1JClq0wnV0g=;\n b=SyNlfVzrr0iVmpWHCLwbVRYGZZnh0HFbjjqUxmvPg1AYrlFVawHzlZzX+EY79Ehczz\n LGkcapZoQ5e9QopZ98sIsIDRO+OwVha5YGBgXWPLwL3+MmnUCIVwqPYgIJJRGIqrnZR/\n o7QxkMo0K7NXkGZDzRPZ5nqIlen6dWqIQvjlDjRLcjcoM+G2Hh+iVXmHdai0lxuAGfM+\n LKvL108evvVjeaoG9Yz2vsuSJDjzmLbfjaJDTJY87hclms3uRj3PqGdeqwzwAHzaxsHZ\n IKS27Gjr62acdyghik/AGCJpzMEykxPfhJkKid+Gb21pfVwF9JZnlw8jcWF1NdZt4Y3V\n MICw==","X-Forwarded-Encrypted":"i=1;\n AFNElJ8P7McZ9LihLiMGug6YcabrheFLQfCYI8OKSPXZlKkbYc6YMIm3lDRkX8M40sX1ujpUwDw=@openvswitch.org","X-Gm-Message-State":"AOJu0YylHnfeLrKE+PHegl0mEwi0+EMgY0Jy7asFngrQz+Cka1buC8TA\n jGnHVC+7cvP9U7zQM/3OgWISpWff+fIGqAjXW71zPASnJZEXX/FcQ//vvrh/MWFvvhfoN13N2Dt\n hRjkQ/UjPixiX5OcM9NiXH7VZkNnecJnHyQ/RWkNTG5AlDOmH9GqLsw==","X-Gm-Gg":"AeBDieu9pK3pSPk3tNivAh9A3NcmeRfOIoux3Y/hwYZ9jXzUYfQidGBMJWXkU2OBNIz\n YxoRg80AeW8mIwpxDJ5zpdJjW1adtPqTxqs7UrTw48MTy92gW+zPOWMkwsuvPLMoj1Mdzq2sGJg\n 776dBareK/tCAzYwlGwh2lZgh19KNu6U7H1zcf1R4i4sm246PW97JvIyAUyo5jhUGv0BNrlTb8/\n kp1xZEUbdZA1PhbKWSHyiv+Axzm+rJqdLmciCjNstdHA15h5rU1teYJIUCZVJII9xBixb47ckjJ\n 8dh5iiWeHpDbRXP1Lj2/zw67BV3/Y3YSoXfAM7Dn++Qxmn0N8SkUSMRZT8VmyViLQB3uH76TTbF\n ipBE8q1m7xN86A7XkQmZVmP9b3d2HtoDN2rAmrNk1reG+CY1ciFHWFT248sYEz9frK2dFz9Jp4e\n VlssiVdCHoHEkkgR2SB3BZL051XQOCOCNvHF/jputx8S2KRCgvrEmzwG/PZ8W9yQGAtZY7NSFSs\n qGzRtmAOB4=","X-Received":["by 2002:a17:903:fa3:b0:2b2:53f5:4627 with SMTP id\n d9443c01a7336-2b5f9e64dd5mr289564825ad.4.1776937826078;\n Thu, 23 Apr 2026 02:50:26 -0700 (PDT)","by 2002:a17:903:fa3:b0:2b2:53f5:4627 with SMTP id\n d9443c01a7336-2b5f9e64dd5mr289563385ad.4.1776937823581;\n Thu, 23 Apr 2026 02:50:23 -0700 (PDT)"],"Message-ID":"<dd771cec-2787-424d-9e14-19e3c9372006@redhat.com>","Date":"Thu, 23 Apr 2026 11:50:15 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","To":"Alexandra Rukomoinikova <arukomoinikova@k2.cloud>, dev@openvswitch.org","References":"<20260416224258.50261-1-arukomoinikova@k2.cloud>","In-Reply-To":"<20260416224258.50261-1-arukomoinikova@k2.cloud>","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"m3DT6PVW76yyknmTK3U-2f3MAwLyeBHApff_UekgfLY_1776937828","X-Mimecast-Originator":"redhat.com","Content-Language":"en-US","Subject":"Re: [ovs-dev] [PATCH ovn v5] 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":"Dumitru Ceara via dev <ovs-dev@openvswitch.org>","Reply-To":"Dumitru Ceara <dceara@redhat.com>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"ovs-dev-bounces@openvswitch.org","Sender":"\"dev\" <ovs-dev-bounces@openvswitch.org>"}},{"id":3681969,"web_url":"http://patchwork.ozlabs.org/comment/3681969/","msgid":"<57f1fdf6-28c3-46f9-b34f-6b355addb879@k2.cloud>","list_archive_url":null,"date":"2026-04-24T10:48:30","subject":"Re: [ovs-dev] [PATCH ovn v5] northd,\n ovn-ic: Add support for east-west traffic PBR.","submitter":{"id":89461,"url":"http://patchwork.ozlabs.org/api/people/89461/","name":"Rukomoinikova Aleksandra","email":"ARukomoinikova@k2.cloud"},"content":"On 23.04.2026 12:50, Dumitru Ceara wrote:\n> On 4/17/26 12:42 AM, Alexandra Rukomoinikova via dev wrote:\n>> Enable east-west traffic rerouting for locally connected networks between\n>> Availability Zones (AZs). This allows traffic destined to a locally connected\n>> network to be forcibly forwarded to a remote AZ for processing (e.g.,\n>> firewalling, inspection, service chaining) and then delivered back.\n>>\n>> Introduce new option (override-connected) for static routes. Static route with\n>> this option set overrides local directly connected route. ovn-ic is extended to\n>> pass this option during advertise-learn processing. Also, route_table column in\n>> ic database now used for connected routes too.\n>>\n>> IC route priorities are changed to raise the priority of learned connected\n>> routes that have a route table set. The new priority order for the same\n>> prefix (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>>\n>> Signed-off-by: Alexandra Rukomoinikova <arukomoinikova@k2.cloud>\n>> ---\n> Hi Alexandra,\n>\n> I think this breaks backwards compatibility for routing in some\n> scenarios.  I didn't dig too deep but the ovnkube CI fails consistently\n> with this patch applied:\n>\n> https://github.com/ovsrobot/ovn/actions/runs/24538488651/job/71740202322\n>\n> The failing tests are all related to static routes with policy=src-ip.\n>\n> If you need to debug this further, the databases for each of the failing\n> test cases are stored in the GitHub actions artifact we saved during the\n> run, e.g.:\n>\n> https://github.com/ovsrobot/ovn/actions/runs/24538488651/artifacts/6486865832\n>\n> in the relative path\n> kind-logs-external-gateway-noHA-shared-ipv4-noSnatGW-2br-24538488651/<NODE>/e2e-dbs\n>\n> Please see some more comments below.\n>\n>> v4 (https://patchwork.ozlabs.org/project/ovn/patch/20251128154550.4840-1-arukomoinikova@k2.cloud/)\n>> --> v5: Rebased, added documentation to ovn-northd manpage AD for routing\n>> ---\n>>   NEWS                           |   2 +\n>>   ic/ovn-ic.c                    |  81 ++++++++---\n>>   lib/ovn-util.h                 |   2 +\n>>   northd/en-learned-route-sync.c |   2 +-\n>>   northd/northd.c                | 162 +++++++++++++---------\n>>   northd/northd.h                |   8 +-\n>>   northd/ovn-northd.8.xml        |  42 ++++++\n>>   ovn-ic-sb.ovsschema            |   7 +-\n>>   ovn-ic-sb.xml                  |  28 ++++\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, 582 insertions(+), 214 deletions(-)\n>>\n>> diff --git a/NEWS b/NEWS\n>> index 8633ba8bb..dc1305bd3 100644\n>> --- a/NEWS\n>> +++ b/NEWS\n>> @@ -3,6 +3,8 @@ 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>> +    - Changed administrative distance for specific route types. Please see\n>> +      section Route Administrative Distance ovn-northd manpage.\n> s/section /the section\n>\n> And maybe quotes for the section name.\n>\n>>   \n>>   OVN v26.03.0 - xxx xx xxxx\n>>   --------------------------\n>> diff --git a/ic/ovn-ic.c b/ic/ovn-ic.c\n>> index ba9490658..187719cd3 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> Nit: double space after '='.\n>\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>>   }\n>> diff --git a/lib/ovn-util.h b/lib/ovn-util.h\n>> index bcb344de4..ab45f559e 100644\n>> --- a/lib/ovn-util.h\n>> +++ b/lib/ovn-util.h\n>> @@ -35,6 +35,8 @@\n>>   #define ROUTE_ORIGIN_LB \"loadbalancer\"\n>>   #define ROUTE_ORIGIN_CONNECTED_DYNAMIC \"connected-dynamic\"\n>>   \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>>   \n>> diff --git a/northd/en-learned-route-sync.c b/northd/en-learned-route-sync.c\n>> index 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>>   }\n>> diff --git a/northd/northd.c b/northd/northd.c\n>> index 0b52db6cf..009724922 100644\n>> --- a/northd/northd.c\n>> +++ b/northd/northd.c\n>> @@ -377,14 +377,20 @@ 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>>   /* 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 +12151,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 +12185,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 +12201,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 +12230,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 +12292,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 +12300,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 +12433,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 +12448,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 +12465,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 +12473,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>> @@ -12514,16 +12531,36 @@ build_route_prefix_s(const struct in6_addr *prefix, unsigned int plen)\n>>   }\n>>   \n>>   static uint16_t\n>> -route_source_to_offset(enum route_source source)\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> I think the problem is in this function, the new way of calculating\n> priority will _never_ allow a policy=src route to be selected over a\n> policy=dst route that has a _shorter_ prefix.\n>\n> The way OVN currently works is (as documented):\n>\n> <p>\n>    When multiple routes match a packet, the longest-prefix match is chosen.\n>    For a given prefix length, a <code>dst-ip</code> route is preferred over\n>    a <code>src-ip</code> route.\n> </p>\n>\n> But with your code, if we have two routes:\n> a. policy=src-ip, prefix=1.1.1.1/32 => calc_priority() returns 384\n> b. policy=dst-ip, prefix=0.0.0.0/0  => calc_priority() returns 1552\n>\n> So \"a\" will never be preferred over \"b\", breaking the way routing\n> currently works.  More details in:\n>\n> https://mail.openvswitch.org/pipermail/ovs-dev/2025-September/426004.html\n\n\nHi Dumitru! Thanks a lot for that suggestion; it would have been much \nharder for me to figure this out without it. I'm thinking about adding a \ntest or changing the original tests for routes so that they don't just \nprint the priority in logical rules, but compare these priorities to \nmake it easier to track down such issues. I can prepare a separate patch \nfor this.\n\n\n>> +    uint16_t pri = (plen * ROUTE_PRIO_OFFSET_MULTIPLIER) + has_protocol_match;\n>> +\n>> +    if (is_src_route) {\n>> +        return pri;\n>> +    }\n>> +\n>>       switch (source) {\n>>       case ROUTE_SOURCE_CONNECTED:\n>>       case ROUTE_SOURCE_IC_DYNAMIC:\n>> -        return ROUTE_PRIO_OFFSET_CONNECTED;\n>> +        pri += (override_connected)\n>> +               ? ROUTE_PRIO_OFFSET_IC_LEARNED_CONNECTED_WITH_TABLEID\n>> +               : ROUTE_PRIO_OFFSET_CONNECTED;\n>> +        break;\n>> +\n>>       case ROUTE_SOURCE_STATIC:\n>> -        return ROUTE_PRIO_OFFSET_STATIC;\n>> +        pri += (override_connected)\n>> +               ? ROUTE_PRIO_OFFSET_PRIORITY_STATIC\n>> +               : ROUTE_PRIO_OFFSET_STATIC;\n>> +        break;\n>> +\n>>       case ROUTE_SOURCE_LEARNED:\n>> -        return ROUTE_PRIO_OFFSET_LEARNED;\n>> +        pri += ROUTE_PRIO_OFFSET_LEARNED;\n>> +        break;\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>> @@ -12531,41 +12568,8 @@ route_source_to_offset(enum route_source source)\n>>       default:\n>>           OVS_NOT_REACHED();\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>> -{\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>>   \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>> -    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 pri + (128 + 1) * ROUTE_PRIO_OFFSET_MULTIPLIER;\n>>   }\n>>   \n>>   bool\n>> @@ -12756,10 +12760,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,7 +12901,8 @@ 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>> @@ -12900,8 +12916,22 @@ 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>> +    priority = calc_priority(plen, source, override_connected, is_src_route,\n>> +                             false);\n>>   \n>>       struct ds common_actions = DS_EMPTY_INITIALIZER;\n>>       struct ds actions = DS_EMPTY_INITIALIZER;\n>> @@ -12966,7 +12996,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 +18736,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>>           }\n>> diff --git a/northd/northd.h b/northd/northd.h\n>> index 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,\n>> diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml\n>> index 4d6370da6..2fa5f59f3 100644\n>> --- a/northd/ovn-northd.8.xml\n>> +++ b/northd/ovn-northd.8.xml\n>> @@ -6293,6 +6293,48 @@ 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,\n>> +      similar AD concept in traditional networking, but with some custom\n> Nit: I'd rephrase to \"similar to traditional networking but with some\n> differences\"\n>\n>> +      extensions. Routes with higher priority are preferred over those with\n>> +      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> Please check the encoding you're using, please use plain ASCII dashes\n> instead of \"—\".\n>\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 IP routes.\n>> +        </li>\n>> +      </ol>\n>> +    </p>\n>> +\n>>       <h1>Drop sampling</h1>\n>>   \n>>       <p>\n>> diff --git a/ovn-ic-sb.ovsschema b/ovn-ic-sb.ovsschema\n>> index 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\"}}},\n>> diff --git a/ovn-ic-sb.xml b/ovn-ic-sb.xml\n>> index f30760100..51448c932 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,26 @@\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>> +            For static routes this options is a copy of same option\n> Nit: should be \"this option is a copy of its Northbound DB counterpart\".\n>\n>> +            from Northbound DB.\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.\">\n>> diff --git a/ovn-nb.xml b/ovn-nb.xml\n>> index 7324e8656..b43727a01 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>\n>> diff --git a/tests/ovn-ic.at b/tests/ovn-ic.at\n>> index 0fa7c4f29..272393548 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>> +])\n>> \\ No newline at end of file\n> No newline at end of file.\n>\n>> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at\n>> index 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\n>> diff --git a/utilities/ovn-nbctl.8.xml b/utilities/ovn-nbctl.8.xml\n>> index 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\n>> diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c\n>> index 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> Regards,\n> Dumitru\n>","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\" (2048-bit key;\n unprotected) header.d=k2.cloud header.i=@k2.cloud header.a=rsa-sha256\n header.s=mail header.b=MH+Lhfug;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=140.211.166.136; helo=smtp3.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)","smtp3.osuosl.org;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key,\n unprotected) header.d=k2.cloud header.i=@k2.cloud header.a=rsa-sha256\n header.s=mail header.b=MH+Lhfug","smtp1.osuosl.org; dmarc=pass (p=quarantine dis=none)\n header.from=k2.cloud","smtp1.osuosl.org; dkim=pass (2048-bit key,\n unprotected) header.d=k2.cloud header.i=@k2.cloud header.a=rsa-sha256\n header.s=mail header.b=MH+Lhfug"],"Received":["from smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136])\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 4g28p655NYz1yDD\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 24 Apr 2026 20:48:46 +1000 (AEST)","from localhost (localhost [127.0.0.1])\n\tby smtp3.osuosl.org (Postfix) with ESMTP id 1BF1F616A0;\n\tFri, 24 Apr 2026 10:48:44 +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 zZ7-UdoaQqDB; Fri, 24 Apr 2026 10:48:41 +0000 (UTC)","from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56])\n\tby smtp3.osuosl.org (Postfix) with ESMTPS id 5009B61695;\n\tFri, 24 Apr 2026 10:48:41 +0000 (UTC)","from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id E4F04C04FB;\n\tFri, 24 Apr 2026 10:48:40 +0000 (UTC)","from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 03E09C04FA\n for <dev@openvswitch.org>; Fri, 24 Apr 2026 10:48:40 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp1.osuosl.org (Postfix) with ESMTP id D9300848C4\n for <dev@openvswitch.org>; Fri, 24 Apr 2026 10:48:39 +0000 (UTC)","from smtp1.osuosl.org ([127.0.0.1])\n by localhost (smtp1.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id sHxVpXhqVjoW for <dev@openvswitch.org>;\n Fri, 24 Apr 2026 10:48:37 +0000 (UTC)","from ksmg2.croc.ru (ksmg2.croc.ru [195.38.23.102])\n by smtp1.osuosl.org (Postfix) with ESMTPS id 18D0A848C3\n for <dev@openvswitch.org>; Fri, 24 Apr 2026 10:48:34 +0000 (UTC)","from ksmg2 (localhost [127.0.0.1])\n by ksmg2.croc.ru (Postfix) with ESMTP id 830A71E0011;\n Fri, 24 Apr 2026 13:48:31 +0300 (MSK)","from MXONE (unknown [195.38.23.35])\n by ksmg2.croc.ru (Postfix) with ESMTP;\n Fri, 24 Apr 2026 13:48:31 +0300 (MSK)"],"X-Virus-Scanned":["amavis at osuosl.org","amavis at osuosl.org"],"X-Comment":"SPF check N/A for local connections - client-ip=140.211.9.56;\n helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ","DKIM-Filter":["OpenDKIM Filter v2.11.0 smtp3.osuosl.org 5009B61695","OpenDKIM Filter v2.11.0 smtp1.osuosl.org 18D0A848C3","OpenDKIM Filter v2.11.0 ksmg2.croc.ru 830A71E0011"],"Received-SPF":"Pass (mailfrom) identity=mailfrom; client-ip=195.38.23.102;\n helo=ksmg2.croc.ru; envelope-from=arukomoinikova@k2.cloud;\n receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp1.osuosl.org 18D0A848C3","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=k2.cloud; s=mail;\n t=1777027711; bh=pE0M9l6rDf95vvRhKiQsKkKCUrTcj7Kv4sX9ILNPoVU=;\n h=From:To:Subject:Date:Message-ID:Content-Type:MIME-Version:From;\n b=MH+Lhfug0Xm4rvzL7lL7aSojvrdBRvqwnbeMreoq9da/mGSqiTn1S58rx8WOr1Ny9\n m3XxKYb3t2TyWLirLd8qf4rXwvy/pMS4IpMze6FWbj4BN14sa7lcYmIzFWScu1+fQS\n lJQQbK3NP8YPfHi7eZAMlGF1G1lDeiELN1dT1bvAm01FkQXUZvLBInL/TeFJfhGSpM\n eznPs7DvNXdJav7Xrxu/g0U8jdTYaH/1DI0mhqxJzjt0iBefllqLM4g7NA3WF4nO+7\n dWqom6whm9n2/I2MND5ingM2F7shabbgXOH/vpVS0skI4Nw0JSS8kU25zh1Yq3bRnI\n vgay8gb57OPBQ==","To":"Dumitru Ceara <dceara@redhat.com>, Rukomoinikova Aleksandra\n <ARukomoinikova@k2.cloud>, \"dev@openvswitch.org\" <dev@openvswitch.org>","Thread-Topic":"[ovs-dev] [PATCH ovn v5] northd, ovn-ic: Add support for\n east-west traffic PBR.","Thread-Index":"AQHczfJhI2IMY066vUiFIHpA00yd97XsPvyAgAGimwA=","Date":"Fri, 24 Apr 2026 10:48:30 +0000","Message-ID":"<57f1fdf6-28c3-46f9-b34f-6b355addb879@k2.cloud>","References":"<20260416224258.50261-1-arukomoinikova@k2.cloud>\n <dd771cec-2787-424d-9e14-19e3c9372006@redhat.com>","In-Reply-To":"<dd771cec-2787-424d-9e14-19e3c9372006@redhat.com>","Accept-Language":"en-US","Content-Language":"en-US","X-MS-Has-Attach":"","X-MS-TNEF-Correlator":"","dlp-except":"1","Content-ID":"<C8AB40A315F99D4ABB77C8CDD30D6FC0@croc.ru>","MIME-Version":"1.0","X-SEG-SpamProfiler-Score":"-1","X-KSMG-Rule-ID":"4","X-KSMG-Message-Action":"skipped","X-KSMG-AntiSpam-Status":"not scanned, allowlist","X-KSMG-AntiPhishing":"not scanned, allowlist","X-KSMG-LinksScanning":"not scanned, allowlist","X-KSMG-AntiVirus":"Kaspersky Secure Mail Gateway, version 2.0.1.6960,\n not scanned, allowlist","Subject":"Re: [ovs-dev] [PATCH ovn v5] 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":"Rukomoinikova Aleksandra via dev <ovs-dev@openvswitch.org>","Reply-To":"Rukomoinikova Aleksandra <ARukomoinikova@k2.cloud>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"ovs-dev-bounces@openvswitch.org","Sender":"\"dev\" <ovs-dev-bounces@openvswitch.org>"}},{"id":3681970,"web_url":"http://patchwork.ozlabs.org/comment/3681970/","msgid":"<213e7e21-cdc2-49a5-b1eb-2225f8c95ebd@redhat.com>","list_archive_url":null,"date":"2026-04-24T10:51:17","subject":"Re: [ovs-dev] [PATCH ovn v5] northd,\n ovn-ic: Add support for east-west traffic PBR.","submitter":{"id":76591,"url":"http://patchwork.ozlabs.org/api/people/76591/","name":"Dumitru Ceara","email":"dceara@redhat.com"},"content":"On 4/24/26 12:48 PM, Rukomoinikova Aleksandra wrote:\n>>>   static uint16_t\n>>> -route_source_to_offset(enum route_source source)\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>> I think the problem is in this function, the new way of calculating\n>> priority will never allow a policy=src route to be selected over a\n>> policy=dst route that has a shorter prefix.\n>>\n>> The way OVN currently works is (as documented):\n>>\n>> <p>\n>>    When multiple routes match a packet, the longest-prefix match is chosen.\n>>    For a given prefix length, a <code>dst-ip</code> route is preferred over\n>>    a <code>src-ip</code> route.\n>> </p>\n>>\n>> But with your code, if we have two routes:\n>> a. policy=src-ip, prefix=1.1.1.1/32 => calc_priority() returns 384\n>> b. policy=dst-ip, prefix=0.0.0.0/0  => calc_priority() returns 1552\n>>\n>> So \"a\" will never be preferred over \"b\", breaking the way routing\n>> currently works.  More details in:\n>>\n>> https://mail.openvswitch.org/pipermail/ovs-dev/2025-September/426004.html\n> \n> Hi Dumitru! Thanks a lot for that suggestion; it would have been much \n> harder for me to figure this out without it. I'm thinking about adding a \n> test or changing the original tests for routes so that they don't just \n> print the priority in logical rules, but compare these priorities to \n> make it easier to track down such issues. I can prepare a separate patch \n> for this.\n\nHi Alexandra,\n\nYes, a test for this would be ideal.  It would prevent us from breaking\nthe behavior in the future.\n\nThanks,\nDumitru","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=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=G/br7fA+;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=140.211.166.133; helo=smtp2.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)","smtp2.osuosl.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key)\n header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=G/br7fA+","smtp1.osuosl.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com","smtp1.osuosl.org; dkim=pass (1024-bit key,\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=G/br7fA+"],"Received":["from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133])\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 4g28sQ6Hs1z1yD5\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 24 Apr 2026 20:51:38 +1000 (AEST)","from localhost (localhost [127.0.0.1])\n\tby smtp2.osuosl.org (Postfix) with ESMTP id 4198A42239;\n\tFri, 24 Apr 2026 10:51:36 +0000 (UTC)","from smtp2.osuosl.org ([127.0.0.1])\n by localhost (smtp2.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id P-ehsaIuLyIa; Fri, 24 Apr 2026 10:51:35 +0000 (UTC)","from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56])\n\tby smtp2.osuosl.org (Postfix) with ESMTPS id 5C3244222E;\n\tFri, 24 Apr 2026 10:51:35 +0000 (UTC)","from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id 35973C04FB;\n\tFri, 24 Apr 2026 10:51:35 +0000 (UTC)","from smtp1.osuosl.org (smtp1.osuosl.org [IPv6:2605:bc80:3010::138])\n by lists.linuxfoundation.org (Postfix) with ESMTP id E79F1C04FA\n for <dev@openvswitch.org>; Fri, 24 Apr 2026 10:51:33 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp1.osuosl.org (Postfix) with ESMTP id CD879848CC\n for <dev@openvswitch.org>; Fri, 24 Apr 2026 10:51:33 +0000 (UTC)","from smtp1.osuosl.org ([127.0.0.1])\n by localhost (smtp1.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id VR0NiLNiLAf3 for <dev@openvswitch.org>;\n Fri, 24 Apr 2026 10:51:33 +0000 (UTC)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.133.124])\n by smtp1.osuosl.org (Postfix) with ESMTPS id B4053848C7\n for <dev@openvswitch.org>; Fri, 24 Apr 2026 10:51:31 +0000 (UTC)","from mail-pf1-f198.google.com (mail-pf1-f198.google.com\n [209.85.210.198]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-328-oIuPCjJ1MUq5m-fvf6dSRw-1; Fri, 24 Apr 2026 06:51:28 -0400","by mail-pf1-f198.google.com with SMTP id\n d2e1a72fcca58-82f803658d5so9347506b3a.1\n for <dev@openvswitch.org>; Fri, 24 Apr 2026 03:51:27 -0700 (PDT)","from ?IPV6:2001:1c05:1417:d800:d1ef:9817:2a26:625d?\n (2001-1c05-1417-d800-d1ef-9817-2a26-625d.cable.dynamic.v6.ziggo.nl.\n [2001:1c05:1417:d800:d1ef:9817:2a26:625d])\n by smtp.gmail.com with ESMTPSA id\n d2e1a72fcca58-82f8e9d35acsm23840143b3a.15.2026.04.24.03.51.21\n (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128);\n Fri, 24 Apr 2026 03:51:23 -0700 (PDT)"],"X-Virus-Scanned":["amavis at osuosl.org","amavis at osuosl.org"],"X-Comment":"SPF check N/A for local connections - client-ip=140.211.9.56;\n helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ","DKIM-Filter":["OpenDKIM Filter v2.11.0 smtp2.osuosl.org 5C3244222E","OpenDKIM Filter v2.11.0 smtp1.osuosl.org B4053848C7"],"Received-SPF":"Pass (mailfrom) identity=mailfrom; client-ip=170.10.133.124;\n helo=us-smtp-delivery-124.mimecast.com; envelope-from=dceara@redhat.com;\n receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp1.osuosl.org B4053848C7","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1777027891;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=Ptv6p1YzTsZMnqQja6/AZyWyF4ZL7E020jPSzxRvIJM=;\n b=G/br7fA+vgF/mAj2QLYE4TyFl2LU59lxVLJBqHoiAk81klZi2InG/5kUO2caZBqkhHZNsw\n 2lBHqMRSvkL5jOxjGX46VKH/GO/s4LWSMOTUkTP12fPppL+1kYBACOnfrde37yMAsvrliW\n Bw29lh8nh6Eux4hLSUBn+4QnKfnV6fs=","X-MC-Unique":"oIuPCjJ1MUq5m-fvf6dSRw-1","X-Mimecast-MFC-AGG-ID":"oIuPCjJ1MUq5m-fvf6dSRw_1777027886","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1777027885; x=1777632685;\n h=content-transfer-encoding:in-reply-to:content-language:from\n :references:to:subject:user-agent:mime-version:date:message-id\n :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=Ptv6p1YzTsZMnqQja6/AZyWyF4ZL7E020jPSzxRvIJM=;\n b=mil2xnyaZliE55i7PKjTmuhoyaFZY7+upk7l2nkWmzJGo9UKmgCFROD7UvhVSFF7Gk\n 3QoFm3SY4dMNQzlJ0hOtxFGB5hsujUp/0nWCcz/hERKmWPpxumFDwI3o4TyZiZPntVrJ\n wsDaRL4NQbbyiXxpl5N1seQpYcZ7i2Y/aFl3jELYaVg7GW/93o83Sh0f525OpD0RWpn9\n 8LKnZhYEhx49KQwGSpXVWxpSWjcKV6lAx6BoNONbH0dRHmuuyu1hyGTx75dK8WfnXWeY\n 8O8Phogry2wxMYfNoDQqvUMXDP9vqbSJ6MMKuTJIdpBonIkbSskCGQo1iKNk+KbnQrZv\n MJMQ==","X-Forwarded-Encrypted":"i=1;\n AFNElJ8JObqmOUpkE9nVWnc1tr0oWYPi2H7EK0ZoFVGehVEuQIQYkFix0Wy6Lwuz+UjKMmyVFw0=@openvswitch.org","X-Gm-Message-State":"AOJu0Yz1esralE/sFYDv+/tFSNWyBN6HMNL0zYOpzlWsB0RuwY4zrzif\n wxNBwjEbtFm8+35Egjz+OHaURcgJSRrYU7Z/pmPySFE9V8JSU1H4t4y1Uf7Cl8n65I2tLsUt6tQ\n RTHI6avQs4tB8bg6jG60gGpSdP1HTzs96v9Qtvl4fMiAFCeo0m8EPcVfyg9/7rg==","X-Gm-Gg":"AeBDievF/T0C2Up7QUyMnz3fBcqMNh0kp5pS+61tZDr2U7PHsIkLrF/kLtRRt2Fycgl\n h3wUH8eHJ+IiVAmHZOfrhlEop0NKjZOdC0gzZtvnJoHQ/b2C8T9JC3dxMxUWplhEvvGCQidrnMR\n QCSqWuf2u6LxTPvS8oK+EfCw9ilMN6MZwpgbZLOt79DiYPQipvMkAK558c75dvzL966A8BFfdcW\n jtSt4yW2TDUDnBk+GS2akfK12zoTiDB8R+MyVuLKK5Ww/H8fcWJ6iD0DbCsEzbbKV7s1LxVQKbs\n XusQVD8pAS+gUdaDMnCvgAZiPYNnWeB36ImcTUlvAaTp9oRZWSCXFsYY6h8byhAFbjyn6dlu8A0\n TKf7IJv01RNswYepT2i41ycwyMonAI8k7mW8COYSaQm0Wz8aXv5bxl7fGmn5qr6jdY2yeaJdkUF\n TMfEi5rCs0C5l5xqvlmHUk7Z1BEr+FmyjtqS4QIv+PDzU0JAMImxOKhEIE91njSPqDy8rcAIMUv\n oOieXJ0wVo=","X-Received":["by 2002:a05:6a00:18a8:b0:81f:3fa0:8c38 with SMTP id\n d2e1a72fcca58-82f8c84add7mr35437317b3a.20.1777027885205;\n Fri, 24 Apr 2026 03:51:25 -0700 (PDT)","by 2002:a05:6a00:18a8:b0:81f:3fa0:8c38 with SMTP id\n d2e1a72fcca58-82f8c84add7mr35437279b3a.20.1777027884585;\n Fri, 24 Apr 2026 03:51:24 -0700 (PDT)"],"Message-ID":"<213e7e21-cdc2-49a5-b1eb-2225f8c95ebd@redhat.com>","Date":"Fri, 24 Apr 2026 12:51:17 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","To":"Rukomoinikova Aleksandra <ARukomoinikova@k2.cloud>,\n \"dev@openvswitch.org\" <dev@openvswitch.org>","References":"<20260416224258.50261-1-arukomoinikova@k2.cloud>\n <dd771cec-2787-424d-9e14-19e3c9372006@redhat.com>\n <57f1fdf6-28c3-46f9-b34f-6b355addb879@k2.cloud>","In-Reply-To":"<57f1fdf6-28c3-46f9-b34f-6b355addb879@k2.cloud>","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"KYtDn1QZ6pIWhSJSY_n5zEF2JNdX6VV6UP1w-Y8G1dY_1777027886","X-Mimecast-Originator":"redhat.com","Content-Language":"en-US","Subject":"Re: [ovs-dev] [PATCH ovn v5] 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":"Dumitru Ceara via dev <ovs-dev@openvswitch.org>","Reply-To":"Dumitru Ceara <dceara@redhat.com>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"ovs-dev-bounces@openvswitch.org","Sender":"\"dev\" <ovs-dev-bounces@openvswitch.org>"}}]