On 28.04.2026 10:39, Dumitru Ceara wrote:
> On 4/27/26 2:28 PM, Rukomoinikova Aleksandra via dev wrote:
>> The tests that crashed before are green, but new suite crashed, I don't
>> really understand what's going on, but the tests in my fork are green =(
>> https://github.com/Sashhkaa/ovn/actions/runs/24987155755
>>
> Hi Alexandra,
>
> I had a quick look and the failures might not be related to your
> changes.  Let's do another run to see what happens, I'll try to have a
> closer look when I review v6 properly (probably next week as I'm mostly
> out this week).
>
> Recheck-request: github-robot-_ovn-kubernetes
>
> Regards,
> Dumitru

Hi Dumitru! Thanks a lot!

>> On 25.04.2026 15:15, Rukomoinikova Aleksandra wrote:
>>> Recheck-request: github-robot-_ovn-kubernetes
>>>
>>>
>>>
>>> On 24.04.2026 17:10, Alexandra Rukomoinikova wrote:
>>>> Enable east-west traffic rerouting for locally connected networks between
>>>> Availability Zones (AZs). This allows traffic destined to a locally 
>>>> connected
>>>> network to be forcibly forwarded to a remote AZ for processing (e.g.,
>>>> firewalling, inspection, service chaining) and then delivered back.
>>>>
>>>> Introduce new option (override-connected) for static routes. Static route 
>>>> with
>>>> this option set overrides local directly connected route. ovn-ic is 
>>>> extended to
>>>> pass this option during advertise-learn processing. Also, route_table 
>>>> column in
>>>> ic database now used for connected routes too.
>>>>
>>>> IC route priorities are changed to raise the priority of learned connected
>>>> routes that have a route table set. The new priority order for the same
>>>> prefix (highest to lowest) is:
>>>>
>>>>      1. Static routes (local or IC-learned) with override-connected=true
>>>>      2. IC-learned connected routes with route_table set (auto-marked)
>>>>      3. All other connected routes (local and learned)
>>>>      4. All other static routes
>>>>      5. Routes learned from external sources (e.g., BGP)
>>>>      6. Source-IP routes (lowest priority)
>>>>
>>>> (It's also now described in ovn-northd manpage)
>>>>
>>>> Signed-off-by: Alexandra Rukomoinikova <[email protected]>
>>>> ---
>>>> v5 --> v6: 1) fixed review comments in docs
>>>>               2) fixed ovn-k test: problem was in the incorrect
>>>>                  calculation of metrics for src-ip static routes
>>>> v4 --> v5: Rebased, added documentation to ovn-northd manpage AD for 
>>>> routing
>>>> v4 
>>>> (https://patchwork.ozlabs.org/project/ovn/patch/[email protected]/)
>>>> ---
>>>>     NEWS                           |   4 +
>>>>     ic/ovn-ic.c                    |  81 ++++++++---
>>>>     lib/ovn-util.h                 |   3 +
>>>>     northd/en-learned-route-sync.c |   2 +-
>>>>     northd/northd.c                | 158 +++++++++++++---------
>>>>     northd/northd.h                |   8 +-
>>>>     northd/ovn-northd.8.xml        |  44 ++++++
>>>>     ovn-ic-sb.ovsschema            |   7 +-
>>>>     ovn-ic-sb.xml                  |  27 ++++
>>>>     ovn-nb.xml                     |   8 ++
>>>>     tests/ovn-ic.at                | 182 ++++++++++++++++++++++++-
>>>>     tests/ovn-northd.at            | 238 ++++++++++++++++-----------------
>>>>     utilities/ovn-nbctl.8.xml      |   6 +
>>>>     utilities/ovn-nbctl.c          |  28 +++-
>>>>     14 files changed, 585 insertions(+), 211 deletions(-)
>>>>
>>>> diff --git a/NEWS b/NEWS
>>>> index 8633ba8bb..fdc02b4a8 100644
>>>> --- a/NEWS
>>>> +++ b/NEWS
>>>> @@ -3,6 +3,10 @@ Post v26.03.0
>>>>        - Dynamic Routing:
>>>>          * Add support for hub-and-spoke propagation via the "hub-spoke" 
>>>> option
>>>>            in dynamic-routing-redistribute settings.
>>>> +   - Added "override-connected" option to Logical Router Static Routes to 
>>>> mark
>>>> +     static routes as higher-priority than connected routes, which in 
>>>> turn led
>>>> +     to changes in administrative distance for specific route types. 
>>>> Please see
>>>> +     the "Route Administrative Distance" section of the ovn-northd 
>>>> manpage.
>>>>     
>>>>     OVN v26.03.0 - xxx xx xxxx
>>>>     --------------------------
>>>> diff --git a/ic/ovn-ic.c b/ic/ovn-ic.c
>>>> index ba9490658..fb7723641 100644
>>>> --- a/ic/ovn-ic.c
>>>> +++ b/ic/ovn-ic.c
>>>> @@ -1309,6 +1309,7 @@ struct ic_route_info {
>>>>         const char *origin;
>>>>         const char *route_table;
>>>>         const char *route_tag;
>>>> +    bool override_connected;
>>>>         struct uuid ic_route_uuid;
>>>>     
>>>>         const struct nbrec_logical_router *nb_lr;
>>>> @@ -1326,16 +1327,25 @@ struct ic_route_info {
>>>>         const struct nbrec_load_balancer *nb_lb;
>>>>     };
>>>>     
>>>> +static inline bool
>>>> +get_override_connected(const struct smap *options)
>>>> +{
>>>> +    return smap_get_bool(options, ROUTE_OVERRIDE_CONNECTED, false);
>>>> +}
>>>> +
>>>>     static uint32_t
>>>>     ic_route_hash(const struct in6_addr *prefix, unsigned int plen,
>>>>                   const struct in6_addr *nexthop, const char *origin,
>>>> -              const char *route_table, const struct uuid *ic_route_uuid)
>>>> +              const char *route_table,
>>>> +              const struct uuid *ic_route_uuid,
>>>> +              bool override_connected)
>>>>     {
>>>>         uint32_t basis = ic_route_uuid ? uuid_hash(ic_route_uuid) : 0;
>>>>         basis = hash_bytes(prefix, sizeof *prefix, basis);
>>>>         basis = hash_int((uint32_t) plen, basis);
>>>>         basis = hash_string(origin, basis);
>>>>         basis = hash_string(route_table, basis);
>>>> +    basis = hash_boolean(override_connected, basis);
>>>>         return hash_bytes(nexthop, sizeof *nexthop, basis);
>>>>     }
>>>>     
>>>> @@ -1343,16 +1353,18 @@ static struct ic_route_info *
>>>>     ic_route_find(struct hmap *routes, const struct in6_addr *prefix,
>>>>                   unsigned int plen, const struct in6_addr *nexthop,
>>>>                   const char *origin, const char *route_table,
>>>> -              const struct uuid *ic_route_uuid, uint32_t hash)
>>>> +              const struct uuid *ic_route_uuid,
>>>> +              bool override_connected, uint32_t hash)
>>>>     {
>>>>         struct ic_route_info *r;
>>>>         if (!hash) {
>>>>             hash = ic_route_hash(prefix, plen, nexthop, origin, 
>>>> route_table,
>>>> -                             ic_route_uuid);
>>>> +                             ic_route_uuid, override_connected);
>>>>         }
>>>>         HMAP_FOR_EACH_WITH_HASH (r, node, hash, routes) {
>>>>             if (ipv6_addr_equals(&r->prefix, prefix) &&
>>>>                 r->plen == plen &&
>>>> +            r->override_connected == override_connected &&
>>>>                 ipv6_addr_equals(&r->nexthop, nexthop) &&
>>>>                 !strcmp(r->origin, origin) &&
>>>>                 !strcmp(r->route_table ? r->route_table : "", route_table) 
>>>> &&
>>>> @@ -1410,11 +1422,14 @@ add_to_routes_learned(struct hmap *routes_learned,
>>>>             return false;
>>>>         }
>>>>         const char *origin = smap_get_def(&nb_route->options, "origin", 
>>>> "");
>>>> +    bool override_connected = get_override_connected(&nb_route->options);
>>>>     
>>>>         uint32_t hash = ic_route_hash(&prefix, plen, &nexthop, origin,
>>>> -                                  nb_route->route_table, ic_route_uuid);
>>>> +                                  nb_route->route_table, ic_route_uuid,
>>>> +                                  override_connected);
>>>>         if (ic_route_find(routes_learned, &prefix, plen, &nexthop, origin,
>>>> -                      nb_route->route_table, ic_route_uuid, hash)) {
>>>> +                      nb_route->route_table, ic_route_uuid,
>>>> +                      override_connected, hash)) {
>>>>             /* Route was added to learned on previous iteration. */
>>>>             return true;
>>>>         }
>>>> @@ -1428,6 +1443,7 @@ add_to_routes_learned(struct hmap *routes_learned,
>>>>         ic_route->route_table = nb_route->route_table;
>>>>         ic_route->nb_lr = nb_lr;
>>>>         ic_route->ic_route_uuid = *ic_route_uuid;
>>>> +    ic_route->override_connected = override_connected;
>>>>         hmap_insert(routes_learned, &ic_route->node, hash);
>>>>     
>>>>         return true;
>>>> @@ -1588,7 +1604,7 @@ add_to_routes_ad(struct hmap *routes_ad, const 
>>>> struct in6_addr prefix,
>>>>                      const struct nbrec_logical_router_static_route 
>>>> *nb_route,
>>>>                      const struct nbrec_logical_router *nb_lr,
>>>>                      const struct nbrec_load_balancer *nb_lb,
>>>> -                 const char *route_tag)
>>>> +                 const char *route_tag, bool override_connected)
>>>>     {
>>>>         ovs_assert(nb_route || nb_lrp || nb_lb || nb_lr);
>>>>     
>>>> @@ -1597,10 +1613,10 @@ add_to_routes_ad(struct hmap *routes_ad, const 
>>>> struct in6_addr prefix,
>>>>         }
>>>>     
>>>>         uint hash = ic_route_hash(&prefix, plen, &nexthop, origin,
>>>> -                              route_table, NULL);
>>>> +                              route_table, NULL, override_connected);
>>>>     
>>>>         if (!ic_route_find(routes_ad, &prefix, plen, &nexthop, origin, 
>>>> route_table,
>>>> -                       NULL, hash)) {
>>>> +                       NULL, override_connected, hash)) {
>>>>             struct ic_route_info *ic_route = xzalloc(sizeof *ic_route);
>>>>             ic_route->prefix = prefix;
>>>>             ic_route->plen = plen;
>>>> @@ -1612,6 +1628,7 @@ add_to_routes_ad(struct hmap *routes_ad, const 
>>>> struct in6_addr prefix,
>>>>             ic_route->nb_lr = nb_lr;
>>>>             ic_route->nb_lb = nb_lb;
>>>>             ic_route->route_tag = route_tag;
>>>> +        ic_route->override_connected = override_connected;
>>>>             hmap_insert(routes_ad, &ic_route->node, hash);
>>>>         } else {
>>>>             static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
>>>> @@ -1645,6 +1662,8 @@ add_static_to_routes_ad(
>>>>     {
>>>>         struct in6_addr prefix, nexthop;
>>>>         unsigned int plen;
>>>> +    bool override_connected = get_override_connected(&nb_route->options);
>>>> +
>>>>         if (!parse_route(nb_route->ip_prefix, nb_route->nexthop,
>>>>                          &prefix, &plen, &nexthop)) {
>>>>             return;
>>>> @@ -1684,7 +1703,7 @@ add_static_to_routes_ad(
>>>>     
>>>>         add_to_routes_ad(routes_ad, prefix, plen, nexthop, 
>>>> ROUTE_ORIGIN_STATIC,
>>>>                          nb_route->route_table, NULL, nb_route, nb_lr,
>>>> -                     NULL, route_tag);
>>>> +                     NULL, route_tag, override_connected);
>>>>     }
>>>>     
>>>>     static void
>>>> @@ -1693,8 +1712,9 @@ add_network_to_routes_ad(struct hmap *routes_ad, 
>>>> const char *network,
>>>>                              const struct lport_addresses 
>>>> *nexthop_addresses,
>>>>                              const struct smap *nb_options,
>>>>                              const struct nbrec_logical_router *nb_lr,
>>>> -                         const char *route_tag,
>>>>                              const struct nbrec_logical_router_port 
>>>> *ts_lrp,
>>>> +                         const char *route_tag,
>>>> +                         const char *ts_route_table,
>>>>                              bool is_src_dynamic)
>>>>     {
>>>>         struct in6_addr prefix, nexthop;
>>>> @@ -1745,11 +1765,25 @@ add_network_to_routes_ad(struct hmap *routes_ad, 
>>>> const char *network,
>>>>             ds_destroy(&msg);
>>>>         }
>>>>     
>>>> +    /* Create additional route to local and remote networks that have
>>>> +     * common route table name with port attached to transit switch having
>>>> +     * same route table name.
>>>> +     * As a result, traffic that is processed within such route table and 
>>>> is
>>>> +     * routed cross az will select port attached to transit switch 
>>>> specially
>>>> +     * allocated to process traffic within that route table.
>>>> +     */
>>>> +
>>>> +    if (*ts_route_table) {
>>>> +        add_to_routes_ad(routes_ad, prefix, plen, nexthop,
>>>> +                         ROUTE_ORIGIN_CONNECTED, ts_route_table,
>>>> +                         nb_lrp, NULL, nb_lr, NULL, route_tag, true);
>>>> +    }
>>>> +
>>>>         const char *origin = is_src_dynamic ? 
>>>> ROUTE_ORIGIN_CONNECTED_DYNAMIC :
>>>>                                               ROUTE_ORIGIN_CONNECTED;
>>>>         /* directly-connected routes go to <main> route table */
>>>>         add_to_routes_ad(routes_ad, prefix, plen, nexthop, origin,
>>>> -                     NULL, nb_lrp, NULL, nb_lr, NULL, route_tag);
>>>> +                     NULL, nb_lrp, NULL, nb_lr, NULL, route_tag, false);
>>>>     }
>>>>     
>>>>     static void
>>>> @@ -1807,7 +1841,7 @@ add_lb_vip_to_routes_ad(struct hmap *routes_ad, 
>>>> const char *vip_key,
>>>>     
>>>>         /* Lb vip routes go to <main> route table */
>>>>         add_to_routes_ad(routes_ad, vip_ip, plen, nexthop, ROUTE_ORIGIN_LB,
>>>> -                     NULL, NULL, NULL, nb_lr, nb_lb, route_tag);
>>>> +                     NULL, NULL, NULL, nb_lr, nb_lb, route_tag, false);
>>>>     out:
>>>>         free(vip_str);
>>>>     }
>>>> @@ -2189,11 +2223,15 @@ sync_learned_routes(struct ic_context *ctx,
>>>>                     continue;
>>>>                 }
>>>>     
>>>> +            bool override_connected =
>>>> +                get_override_connected(&isb_route->options);
>>>>                 struct ic_route_info *route_learned
>>>>                     = ic_route_find(&ic_lr->routes_learned, &prefix, plen,
>>>>                                     &nexthop, isb_route->origin,
>>>>                                     isb_route->route_table,
>>>> -                                &isb_route->header_.uuid, 0);
>>>> +                                &isb_route->header_.uuid,
>>>> +                                override_connected, 0);
>>>> +
>>>>                 if (route_learned) {
>>>>                     hmap_remove(&ic_lr->routes_learned, 
>>>> &route_learned->node);
>>>>                     free(route_learned);
>>>> @@ -2214,6 +2252,10 @@ sync_learned_routes(struct ic_context *ctx,
>>>>                     
>>>> nbrec_logical_router_static_route_update_options_setkey(
>>>>                         nb_route, "origin", isb_route->origin);
>>>>                     free(uuid_s);
>>>> +                if (override_connected) {
>>>> +                    
>>>> nbrec_logical_router_static_route_update_options_setkey(
>>>> +                        nb_route, ROUTE_OVERRIDE_CONNECTED, "true");
>>>> +                }
>>>>                     
>>>> nbrec_logical_router_update_static_routes_addvalue(ic_lr->lr,
>>>>                         nb_route);
>>>>                 }
>>>> @@ -2300,9 +2342,11 @@ advertise_routes(struct ic_context *ctx,
>>>>                 icsbrec_route_delete(isb_route);
>>>>                 continue;
>>>>             }
>>>> +        bool override_connected = 
>>>> get_override_connected(&isb_route->options);
>>>>             struct ic_route_info *route_adv =
>>>>                 ic_route_find(routes_ad, &prefix, plen, &nexthop,
>>>> -                          isb_route->origin, isb_route->route_table, 
>>>> NULL, 0);
>>>> +                          isb_route->origin, isb_route->route_table,
>>>> +                          NULL, override_connected, 0);
>>>>             if (!route_adv) {
>>>>                 /* Delete the extra route from IC-SB. */
>>>>                 VLOG_DBG("Delete route %s -> %s from IC-SB, which is not 
>>>> found"
>>>> @@ -2346,6 +2390,10 @@ advertise_routes(struct ic_context *ctx,
>>>>             icsbrec_route_set_route_table(isb_route, route_adv->route_table
>>>>                                                      ? 
>>>> route_adv->route_table
>>>>                                                      : "");
>>>> +        if (route_adv->override_connected) {
>>>> +            icsbrec_route_update_options_setkey(isb_route,
>>>> +                ROUTE_OVERRIDE_CONNECTED, "true");
>>>> +        }
>>>>             free(prefix_s);
>>>>             free(nexthop_s);
>>>>     
>>>> @@ -2400,7 +2448,8 @@ build_ts_routes_to_adv(struct ic_context *ctx,
>>>>                     add_network_to_routes_ad(routes_ad, lrp->networks[j], 
>>>> lrp,
>>>>                                              ts_port_addrs,
>>>>                                              &nb_global->options,
>>>> -                                         lr, route_tag, ts_lrp, false);
>>>> +                                         lr, ts_lrp, route_tag,
>>>> +                                         ts_route_table, false);
>>>>                 }
>>>>             } else {
>>>>                 /* The router port of the TS port is ignored. */
>>>> @@ -2455,7 +2504,7 @@ build_ts_routes_to_adv(struct ic_context *ctx,
>>>>             add_network_to_routes_ad(routes_ad, sb_route->ip_prefix, NULL,
>>>>                                      ts_port_addrs,
>>>>                                      &nb_global->options,
>>>> -                                 lr, route_tag, ts_lrp, true);
>>>> +                                 lr, ts_lrp, route_tag, ts_route_table, 
>>>> true);
>>>>         }
>>>>         sbrec_learned_route_index_destroy_row(filter);
>>>>     }
>>>> diff --git a/lib/ovn-util.h b/lib/ovn-util.h
>>>> index b44c9c770..4e8cf6f52 100644
>>>> --- a/lib/ovn-util.h
>>>> +++ b/lib/ovn-util.h
>>>> @@ -34,6 +34,7 @@
>>>>     #define ROUTE_ORIGIN_STATIC "static"
>>>>     #define ROUTE_ORIGIN_LB "loadbalancer"
>>>>     #define ROUTE_ORIGIN_CONNECTED_DYNAMIC "connected-dynamic"
>>>> +#define ROUTE_OVERRIDE_CONNECTED "override-connected"
>>>>     
>>>>     #define ETH_CRC_LENGTH 4
>>>>     #define ETHERNET_OVERHEAD (ETH_HEADER_LEN + ETH_CRC_LENGTH)
>>>> @@ -43,6 +44,8 @@
>>>>     
>>>>     #define IDL_LOOP_MAX_DURATION_MS 500
>>>>     
>>>> +#define MAX_PREFIX_LEN 128
>>>> +
>>>>     struct eth_addr;
>>>>     struct nbrec_logical_router;
>>>>     struct nbrec_logical_router_port;
>>>> diff --git a/northd/en-learned-route-sync.c 
>>>> b/northd/en-learned-route-sync.c
>>>> index 4f7a12a28..0d1953276 100644
>>>> --- a/northd/en-learned-route-sync.c
>>>> +++ b/northd/en-learned-route-sync.c
>>>> @@ -200,7 +200,7 @@ parse_route_from_sbrec_route(struct hmap 
>>>> *parsed_routes_out,
>>>>         }
>>>>     
>>>>         return parsed_route_add(od, nexthop, &prefix, plen, false, 
>>>> lrp_addr_s,
>>>> -                            out_port, 0, false, false, NULL,
>>>> +                            out_port, 0, false, false, false, NULL,
>>>>                                 ROUTE_SOURCE_LEARNED, &route->header_, 
>>>> NULL,
>>>>                                 parsed_routes_out);
>>>>     }
>>>> diff --git a/northd/northd.c b/northd/northd.c
>>>> index 0b52db6cf..6028bb8d3 100644
>>>> --- a/northd/northd.c
>>>> +++ b/northd/northd.c
>>>> @@ -377,14 +377,23 @@ static const char *reg_ct_state[] = {
>>>>     /*
>>>>      * Route offsets implement logic to prioritize traffic for routes with
>>>>      * same ip_prefix values:
>>>> - *  1. (highest priority) connected routes
>>>> - *  2. static routes
>>>> - *  3. routes learned from the outside via ovn-controller (e.g. bgp)
>>>> - *  4. (lowest priority) src-ip routes */
>>>> -#define ROUTE_PRIO_OFFSET_MULTIPLIER 8
>>>> -#define ROUTE_PRIO_OFFSET_LEARNED 2
>>>> -#define ROUTE_PRIO_OFFSET_STATIC 4
>>>> + *  1. High-priority static routes,
>>>> + *     (override-connected option is set), including ic-learned with
>>>> + *     override-connected option set to true.
>>>> + *  2. ic-learned connected routes with route_table set.
>>>> + *  3. connected routes, including ic-learned.
>>>> + *  4. static routes, including ic-learned.
>>>> + *  5. routes learned from the outside via ovn-controller (e.g. bgp)
>>>> + *  6. (lowest priority) src-ip routes */
>>>> +#define ROUTE_PRIO_OFFSET_MULTIPLIER 12
>>>> +#define ROUTE_PRIO_OFFSET_PRIORITY_STATIC 10
>>>> +#define ROUTE_PRIO_OFFSET_IC_LEARNED_CONNECTED_WITH_TABLEID 8
>>>>     #define ROUTE_PRIO_OFFSET_CONNECTED 6
>>>> +#define ROUTE_PRIO_OFFSET_STATIC 4
>>>> +#define ROUTE_PRIO_OFFSET_LEARNED 2
>>>> +
>>>> +#define ROUTE_PRIO_BASE_SHIFT ((MAX_PREFIX_LEN + 1) * \
>>>> +                              ROUTE_PRIO_OFFSET_MULTIPLIER)
>>>>     
>>>>     /* ovn_stages used by northd for logical switches and logical routers.
>>>>      * The first three components are combined to form the constant stage's
>>>> @@ -12145,6 +12154,10 @@ parsed_route_lookup(struct hmap *routes, size_t 
>>>> hash,
>>>>                 continue;
>>>>             }
>>>>     
>>>> +        if (pr->override_connected != new_pr->override_connected) {
>>>> +            continue;
>>>> +        }
>>>> +
>>>>             if (pr->is_discard_route != new_pr->is_discard_route) {
>>>>                 continue;
>>>>             }
>>>> @@ -12175,6 +12188,7 @@ parsed_route_init(const struct ovn_datapath *od,
>>>>                       uint32_t route_table_id,
>>>>                       bool is_src_route,
>>>>                       bool ecmp_symmetric_reply,
>>>> +                  bool override_connected,
>>>>                       const struct sset *ecmp_selection_fields,
>>>>                       enum route_source source,
>>>>                       const struct ovn_port *tracked_port,
>>>> @@ -12190,6 +12204,7 @@ parsed_route_init(const struct ovn_datapath *od,
>>>>         new_pr->is_src_route = is_src_route;
>>>>         new_pr->od = od;
>>>>         new_pr->ecmp_symmetric_reply = ecmp_symmetric_reply;
>>>> +    new_pr->override_connected = override_connected;
>>>>         new_pr->is_discard_route = is_discard_route;
>>>>         new_pr->lrp_addr_s = nullable_xstrdup(lrp_addr_s);
>>>>         new_pr->out_port = out_port;
>>>> @@ -12218,7 +12233,8 @@ parsed_route_clone(const struct parsed_route *pr)
>>>>         struct parsed_route *new_pr = parsed_route_init(
>>>>             pr->od, nexthop, pr->prefix, pr->plen, pr->is_discard_route,
>>>>             pr->lrp_addr_s, pr->out_port, pr->route_table_id, 
>>>> pr->is_src_route,
>>>> -        pr->ecmp_symmetric_reply, &pr->ecmp_selection_fields, pr->source,
>>>> +        pr->ecmp_symmetric_reply, pr->override_connected,
>>>> +        &pr->ecmp_selection_fields, pr->source,
>>>>             pr->tracked_port, pr->source_hint);
>>>>     
>>>>         new_pr->hash = pr->hash;
>>>> @@ -12279,6 +12295,7 @@ parsed_route_add(const struct ovn_datapath *od,
>>>>                      uint32_t route_table_id,
>>>>                      bool is_src_route,
>>>>                      bool ecmp_symmetric_reply,
>>>> +                 bool override_connected,
>>>>                      const struct sset *ecmp_selection_fields,
>>>>                      enum route_source source,
>>>>                      const struct ovsdb_idl_row *source_hint,
>>>> @@ -12286,10 +12303,12 @@ parsed_route_add(const struct ovn_datapath *od,
>>>>                      struct hmap *routes)
>>>>     {
>>>>     
>>>> -    struct parsed_route *new_pr = parsed_route_init(
>>>> -        od, nexthop, *prefix, plen, is_discard_route, lrp_addr_s, 
>>>> out_port,
>>>> -        route_table_id, is_src_route, ecmp_symmetric_reply,
>>>> -        ecmp_selection_fields, source, tracked_port, source_hint);
>>>> +    struct parsed_route *new_pr
>>>> +        = parsed_route_init(od, nexthop, *prefix, plen, is_discard_route,
>>>> +                            lrp_addr_s, out_port, route_table_id,
>>>> +                            is_src_route, ecmp_symmetric_reply,
>>>> +                            override_connected, ecmp_selection_fields,
>>>> +                            source, tracked_port, source_hint);
>>>>     
>>>>         new_pr->hash = route_hash(new_pr);
>>>>     
>>>> @@ -12417,6 +12436,8 @@ parsed_routes_add_static(const struct ovn_datapath 
>>>> *od,
>>>>         bool ecmp_symmetric_reply = smap_get_bool(&route->options,
>>>>                                              "ecmp_symmetric_reply",
>>>>                                              false);
>>>> +    bool override_connected = smap_get_bool(&route->options,
>>>> +                                            ROUTE_OVERRIDE_CONNECTED, 
>>>> false);
>>>>     
>>>>         const char *origin = smap_get_def(&route->options, "origin", "");
>>>>         enum route_source source;
>>>> @@ -12430,7 +12451,8 @@ parsed_routes_add_static(const struct ovn_datapath 
>>>> *od,
>>>>     
>>>>         parsed_route_add(od, nexthop, &prefix, plen, is_discard_route, 
>>>> lrp_addr_s,
>>>>                          out_port, route_table_id, is_src_route,
>>>> -                     ecmp_symmetric_reply, &ecmp_selection_fields, source,
>>>> +                     ecmp_symmetric_reply, override_connected,
>>>> +                     &ecmp_selection_fields, source,
>>>>                          &route->header_, NULL, routes);
>>>>         sset_destroy(&ecmp_selection_fields);
>>>>     }
>>>> @@ -12446,8 +12468,7 @@ parsed_routes_add_connected(const struct 
>>>> ovn_datapath *od,
>>>>     
>>>>             in6_addr_set_mapped_ipv4(&prefix, addr->network);
>>>>             parsed_route_add(od, NULL, &prefix, addr->plen,
>>>> -                         false, addr->addr_s, op,
>>>> -                         0, false,
>>>> +                         false, addr->addr_s, op, 0, false, false,
>>>>                              false, NULL, ROUTE_SOURCE_CONNECTED,
>>>>                              &op->nbrp->header_, NULL, routes);
>>>>         }
>>>> @@ -12455,10 +12476,9 @@ parsed_routes_add_connected(const struct 
>>>> ovn_datapath *od,
>>>>         for (size_t i = 0; i < op->lrp_networks.n_ipv6_addrs; i++) {
>>>>             const struct ipv6_netaddr *addr = 
>>>> &op->lrp_networks.ipv6_addrs[i];
>>>>     
>>>> -        parsed_route_add(od, NULL, &addr->network, addr->plen,
>>>> -                         false, addr->addr_s, op,
>>>> -                         0, false,
>>>> -                         false, NULL, ROUTE_SOURCE_CONNECTED,
>>>> +        parsed_route_add(od, NULL, &addr->network, addr->plen, false,
>>>> +                         addr->addr_s, op, 0, false, false, false,
>>>> +                         NULL, ROUTE_SOURCE_CONNECTED,
>>>>                              &op->nbrp->header_, NULL, routes);
>>>>         }
>>>>     }
>>>> @@ -12513,17 +12533,25 @@ build_route_prefix_s(const struct in6_addr 
>>>> *prefix, unsigned int plen)
>>>>         return prefix_s;
>>>>     }
>>>>     
>>>> -static uint16_t
>>>> -route_source_to_offset(enum route_source source)
>>>> +static int
>>>> +get_route_offset(enum route_source source,
>>>> +                 bool override_connected)
>>>>     {
>>>>         switch (source) {
>>>>         case ROUTE_SOURCE_CONNECTED:
>>>>         case ROUTE_SOURCE_IC_DYNAMIC:
>>>> -        return ROUTE_PRIO_OFFSET_CONNECTED;
>>>> +        return (override_connected)
>>>> +               ? ROUTE_PRIO_OFFSET_IC_LEARNED_CONNECTED_WITH_TABLEID
>>>> +               : ROUTE_PRIO_OFFSET_CONNECTED;
>>>> +
>>>>         case ROUTE_SOURCE_STATIC:
>>>> -        return ROUTE_PRIO_OFFSET_STATIC;
>>>> +        return (override_connected)
>>>> +               ? ROUTE_PRIO_OFFSET_PRIORITY_STATIC
>>>> +               : ROUTE_PRIO_OFFSET_STATIC;
>>>> +
>>>>         case ROUTE_SOURCE_LEARNED:
>>>>             return ROUTE_PRIO_OFFSET_LEARNED;
>>>> +
>>>>         /* Dynamic route types (NAT, LB, and connected-as-host) are not 
>>>> used. */
>>>>         case ROUTE_SOURCE_NAT:
>>>>         case ROUTE_SOURCE_LB:
>>>> @@ -12533,39 +12561,19 @@ route_source_to_offset(enum route_source source)
>>>>         }
>>>>     }
>>>>     
>>>> -static void
>>>> -build_route_match(const struct ovn_port *op_inport, uint32_t rtb_id,
>>>> -                  const char *network_s, int plen, bool is_src_route,
>>>> -                  bool is_ipv4, struct ds *match, uint16_t *priority,
>>>> -                  enum route_source source, bool has_protocol_match)
>>>> +static uint16_t
>>>> +calc_priority(int plen,
>>>> +              enum route_source source,
>>>> +              bool override_connected,
>>>> +              bool is_src_route,
>>>> +              bool has_protocol_match)
>>>>     {
>>>> -    const char *dir;
>>>> -    int ofs = route_source_to_offset(source);
>>>> -
>>>> -    /* The priority here is calculated to implement longest-prefix-match
>>>> -     * routing. */
>>>> -    if (is_src_route) {
>>>> -        dir = "src";
>>>> -        ofs = 0;
>>>> -    } else {
>>>> -        dir = "dst";
>>>> -    }
>>>> +    int priority = is_src_route ? 0 :
>>>> +                   get_route_offset(source, override_connected);
>>>>     
>>>> -    if (op_inport) {
>>>> -        ds_put_format(match, "inport == %s && ", op_inport->json_key);
>>>> -    }
>>>> -    if (rtb_id || source == ROUTE_SOURCE_STATIC ||
>>>> -            source == ROUTE_SOURCE_LEARNED) {
>>>> -        ds_put_format(match, "%s == %d && ", REG_ROUTE_TABLE_ID, rtb_id);
>>>> -    }
>>>> +    priority += (plen * ROUTE_PRIO_OFFSET_MULTIPLIER) + 
>>>> has_protocol_match;
>>>>     
>>>> -    if (has_protocol_match) {
>>>> -        ofs += 1;
>>>> -    }
>>>> -    *priority = (plen * ROUTE_PRIO_OFFSET_MULTIPLIER) + ofs;
>>>> -
>>>> -    ds_put_format(match, "ip%s.%s == %s/%d", is_ipv4 ? "4" : "6", dir,
>>>> -                  network_s, plen);
>>>> +    return priority + ROUTE_PRIO_BASE_SHIFT;
>>>>     }
>>>>     
>>>>     bool
>>>> @@ -12756,10 +12764,21 @@ build_ecmp_route_flow(struct lflow_table *lflows,
>>>>         struct ds route_match = DS_EMPTY_INITIALIZER;
>>>>     
>>>>         char *prefix_s = build_route_prefix_s(&eg->prefix, eg->plen);
>>>> -    build_route_match(NULL, eg->route_table_id, prefix_s, eg->plen,
>>>> -                      eg->is_src_route, is_ipv4_prefix, &route_match,
>>>> -                      &priority, eg->source,
>>>> -                      protocol != NULL);
>>>> +
>>>> +    if (eg->route_table_id || eg->source == ROUTE_SOURCE_STATIC
>>>> +        || eg->source == ROUTE_SOURCE_LEARNED) {
>>>> +        ds_put_format(&route_match, "%s == %d && ", REG_ROUTE_TABLE_ID,
>>>> +                      eg->route_table_id);
>>>> +    }
>>>> +
>>>> +    ds_put_format(&route_match, "ip%s.%s == %s/%d",
>>>> +                  is_ipv4_prefix ? "4" : "6",
>>>> +                  eg->is_src_route ? "src" : "dst",
>>>> +                  prefix_s, eg->plen);
>>>> +
>>>> +    priority = calc_priority(eg->plen, eg->source, false,
>>>> +                             eg->is_src_route, protocol != NULL);
>>>> +
>>>>         free(prefix_s);
>>>>     
>>>>         struct ds actions = DS_EMPTY_INITIALIZER;
>>>> @@ -12886,10 +12905,12 @@ add_route(struct lflow_table *lflows, const 
>>>> struct ovn_datapath *od,
>>>>               const struct sset *bfd_ports,
>>>>               const struct ovsdb_idl_row *stage_hint, bool 
>>>> is_discard_route,
>>>>               enum route_source source, struct lflow_ref *lflow_ref,
>>>> -          bool is_ipv4_prefix, bool is_ipv4_nexthop)
>>>> +          bool is_ipv4_prefix, bool is_ipv4_nexthop,
>>>> +          bool override_connected)
>>>>     {
>>>>         struct ds match = DS_EMPTY_INITIALIZER;
>>>> -    uint16_t priority;
>>>> +    uint16_t priority = calc_priority(plen, source, override_connected,
>>>> +                                      is_src_route, false);
>>>>         const struct ovn_port *op_inport = NULL;
>>>>     
>>>>         /* IPv6 link-local addresses must be scoped to the local router 
>>>> port. */
>>>> @@ -12900,8 +12921,19 @@ add_route(struct lflow_table *lflows, const 
>>>> struct ovn_datapath *od,
>>>>                 op_inport = op;
>>>>             }
>>>>         }
>>>> -    build_route_match(op_inport, rtb_id, network_s, plen, is_src_route,
>>>> -                      is_ipv4_prefix, &match, &priority, source, false);
>>>> +
>>>> +    if (op_inport) {
>>>> +        ds_put_format(&match, "inport == %s && ", op_inport->json_key);
>>>> +    }
>>>> +    if (rtb_id || source == ROUTE_SOURCE_STATIC ||
>>>> +        source == ROUTE_SOURCE_LEARNED) {
>>>> +        ds_put_format(&match, "%s == %d && ", REG_ROUTE_TABLE_ID, rtb_id);
>>>> +    }
>>>> +
>>>> +    ds_put_format(&match, "ip%s.%s == %s/%d",
>>>> +                  is_ipv4_prefix ? "4" : "6",
>>>> +                  is_src_route ? "src" : "dst",
>>>> +                  network_s, plen);
>>>>     
>>>>         struct ds common_actions = DS_EMPTY_INITIALIZER;
>>>>         struct ds actions = DS_EMPTY_INITIALIZER;
>>>> @@ -12966,7 +12998,7 @@ build_route_flow(struct lflow_table *lflows, const 
>>>> struct ovn_datapath *od,
>>>>                   route->route_table_id, bfd_ports,
>>>>                   route->source_hint,
>>>>                   route->is_discard_route, route->source, lflow_ref,
>>>> -              is_ipv4_prefix, is_ipv4_nexthop);
>>>> +              is_ipv4_prefix, is_ipv4_nexthop, route->override_connected);
>>>>     
>>>>         free(prefix_s);
>>>>     }
>>>> @@ -18706,7 +18738,7 @@ build_routable_flows_for_router_port(
>>>>                                   bfd_ports, &router_port->nbrp->header_,
>>>>                                   false, ROUTE_SOURCE_CONNECTED,
>>>>                                   lrp->stateful_lflow_ref,
>>>> -                              true, is_ipv4_nexthop ? true : false);
>>>> +                              true, is_ipv4_nexthop ? true : false, 
>>>> false);
>>>>                     }
>>>>                 }
>>>>             }
>>>> diff --git a/northd/northd.h b/northd/northd.h
>>>> index e86d39f9a..22c752c8a 100644
>>>> --- a/northd/northd.h
>>>> +++ b/northd/northd.h
>>>> @@ -840,15 +840,16 @@ enum route_source {
>>>>     struct parsed_route {
>>>>         struct hmap_node key_node;
>>>>         struct in6_addr prefix;
>>>> -    unsigned int plen;
>>>>         struct in6_addr *nexthop; /* NULL for ROUTE_SOURCE_CONNECTED */
>>>> -    bool is_src_route;
>>>> +    unsigned int plen;
>>>>         uint32_t route_table_id;
>>>>         uint32_t hash;
>>>> +    bool is_src_route;
>>>>         bool ecmp_symmetric_reply;
>>>> +    bool override_connected;
>>>>         bool is_discard_route;
>>>> -    const struct ovn_datapath *od;
>>>>         bool stale;
>>>> +    const struct ovn_datapath *od;
>>>>         struct sset ecmp_selection_fields;
>>>>         enum route_source source;
>>>>         const struct ovsdb_idl_row *source_hint;
>>>> @@ -875,6 +876,7 @@ struct parsed_route *parsed_route_add(
>>>>         uint32_t route_table_id,
>>>>         bool is_src_route,
>>>>         bool ecmp_symmetric_reply,
>>>> +    bool override_connected,
>>>>         const struct sset *ecmp_selection_fields,
>>>>         enum route_source source,
>>>>         const struct ovsdb_idl_row *source_hint,
>>>> diff --git a/northd/ovn-northd.8.xml b/northd/ovn-northd.8.xml
>>>> index 4d6370da6..1d9e6b587 100644
>>>> --- a/northd/ovn-northd.8.xml
>>>> +++ b/northd/ovn-northd.8.xml
>>>> @@ -6293,6 +6293,50 @@ clone {
>>>>           </ul>
>>>>         </p>
>>>>     
>>>> +    <h1>Route Administrative Distance in OVN</h1>
>>>> +
>>>> +    <p>
>>>> +      In OVN, routes are selected based on an administrative distance, 
>>>> similar
>>>> +      to traditional networking but with some differences.
>>>> +      Routes with higher priority are preferred over those with lower 
>>>> priority.
>>>> +      The priority order, from highest to lowest, is as follows:
>>>> +    </p>
>>>> +
>>>> +    <p>
>>>> +      <ol>
>>>> +        <li>
>>>> +          High-priority static routes - includes routes with
>>>> +          <code>override-connected</code> option set, as well as 
>>>> ic-learned
>>>> +          routes with <code>override-connected</code> option set to true.
>>>> +        </li>
>>>> +
>>>> +        <li>
>>>> +          Ic-learned connected routes with route_table - connected routes
>>>> +          learned via IC that have the <code>route_table</code> parameter 
>>>> set.
>>>> +        </li>
>>>> +
>>>> +        <li>
>>>> +          Connected routes - directly connected routes, including 
>>>> ic-learned
>>>> +          connected routes that do not have a <code>route_table</code> 
>>>> set.
>>>> +        </li>
>>>> +
>>>> +        <li>
>>>> +          Static routes - manually configured static routes.
>>>> +        </li>
>>>> +
>>>> +        <li>
>>>> +          Learned routes - routes learned from outside via ovn-controller.
>>>> +        </li>
>>>> +
>>>> +        <li>
>>>> +          Src-ip routes - source-based static IP routes.
>>>> +          Please see the <code>OVN_Northbound</code> database
>>>> +          <code>Logical_Router_Static_Route</code> table documentation in
>>>> +          <code>ovn-nb</code> for details.
>>>> +        </li>
>>>> +      </ol>
>>>> +    </p>
>>>> +
>>>>         <h1>Drop sampling</h1>
>>>>     
>>>>         <p>
>>>> diff --git a/ovn-ic-sb.ovsschema b/ovn-ic-sb.ovsschema
>>>> index e0e0fef5e..9208e7ab5 100644
>>>> --- a/ovn-ic-sb.ovsschema
>>>> +++ b/ovn-ic-sb.ovsschema
>>>> @@ -1,7 +1,7 @@
>>>>     {
>>>>         "name": "OVN_IC_Southbound",
>>>> -    "version": "2.5.0",
>>>> -    "cksum": "1892994110 9713",
>>>> +    "version": "2.6.0",
>>>> +    "cksum": "2842701319 9868",
>>>>         "tables": {
>>>>             "IC_SB_Global": {
>>>>                 "columns": {
>>>> @@ -118,6 +118,9 @@
>>>>                         "enum": ["set",
>>>>                                  ["connected", "static", "loadbalancer",
>>>>                                   "connected-dynamic"]]}}},
>>>> +                "options": {
>>>> +                    "type": {"key": "string", "value": "string",
>>>> +                             "min": 0, "max": "unlimited"}},
>>>>                     "external_ids": {
>>>>                         "type": {"key": "string", "value": "string",
>>>>                                  "min": 0, "max": "unlimited"}}},
>>>> diff --git a/ovn-ic-sb.xml b/ovn-ic-sb.xml
>>>> index f30760100..f0d450681 100644
>>>> --- a/ovn-ic-sb.xml
>>>> +++ b/ovn-ic-sb.xml
>>>> @@ -358,6 +358,14 @@
>>>>             have more than one Transit Switch, which interconnects them,
>>>>             directly-connected routes will be added via each transit 
>>>> switch port
>>>>             and configured as ECMP routes.
>>>> +        Additionally, these routes will be advertised to other AZ and 
>>>> learned
>>>> +        into route table that has the same name in the remote logical 
>>>> router.
>>>> +        When learned, these routes are automatically marked with
>>>> +        the <code>override-connected</code> option, giving them higher 
>>>> priority
>>>> +        than any local connected route with same prefix in that route 
>>>> table.
>>>> +        This enables policy-based routing scenarios where traffic 
>>>> processed
>>>> +        within a specific route table can be forcibly forwarded to remote 
>>>> AZ
>>>> +        even when local connected route exists.
>>>>             </p>
>>>>             <p>
>>>>             Static routes within route tables will be advertised and 
>>>> learned only
>>>> @@ -399,6 +407,25 @@
>>>>             </p>
>>>>           </column>
>>>>         </group>
>>>> +
>>>> +    <group title="Options">
>>>> +      <column name="options">
>>>> +        This column provides general key/value settings. The supported
>>>> +        options are described individually below.
>>>> +      </column>
>>>> +
>>>> +      <column name="options" key="override-connected"
>>>> +              type='{"type": "boolean"}'>
>>>> +        <p>
>>>> +            This option is a copy of its Northbound DB counterpart.
>>>> +        </p>
>>>> +        <p>
>>>> +            For connected routes this option is set to true if there is a 
>>>> route
>>>> +            table associated with given connected route, i.e.
>>>> +            <ref table="Route" column="route_table"/> is not empty.
>>>> +        </p>
>>>> +     </column>
>>>> +    </group>
>>>>       </table>
>>>>     
>>>>       <table name="Connection" title="OVSDB client connections.">
>>>> diff --git a/ovn-nb.xml b/ovn-nb.xml
>>>> index 592008745..916ae811e 100644
>>>> --- a/ovn-nb.xml
>>>> +++ b/ovn-nb.xml
>>>> @@ -5056,6 +5056,14 @@ or
>>>>               <li>static</li>
>>>>             </ol>
>>>>           </column>
>>>> +      <column name="options" key="override-connected">
>>>> +        This option can be manually set for local static routes and
>>>> +        automatically set for ovn-interconnected learned routes.
>>>> +        Default value: <code>false</code>.
>>>> +
>>>> +        This option raises route's priority to be highest among routes
>>>> +        with same prefix.
>>>> +      </column>
>>>>         </group>
>>>>     
>>>>       </table>
>>>> diff --git a/tests/ovn-ic.at b/tests/ovn-ic.at
>>>> index 0fa7c4f29..bf50da5de 100644
>>>> --- a/tests/ovn-ic.at
>>>> +++ b/tests/ovn-ic.at
>>>> @@ -885,9 +885,10 @@ check ovn_as az1 ovn-nbctl lb-add lb_v6 
>>>> [[4242::1]]:80 "[[4242::2]]:80"
>>>>     check ovn_as az1 ovn-nbctl lr-lb-add lr1 lb_v6
>>>>     OVS_WAIT_UNTIL([ovn_as az2 ovn-nbctl lr-route-list lr2 | grep learned 
>>>> | grep 4242])
>>>>     
>>>> -AT_CHECK([ovn-ic-sbctl list route | grep 'ip_prefix.*4242' -A 2], [0], 
>>>> [dnl
>>>> +AT_CHECK([ovn-ic-sbctl list route | grep 'ip_prefix.*4242' -A 3], [0], 
>>>> [dnl
>>>>     ip_prefix           : "4242::1/128"
>>>>     nexthop             : "2001:db8:1::1"
>>>> +options             : {}
>>>>     origin              : loadbalancer
>>>>     ])
>>>>     
>>>> @@ -1211,6 +1212,7 @@ Route Table <main>:
>>>>     Route Table rtb1:
>>>>                  10.11.1.0/24             169.254.100.1 dst-ip (learned)
>>>>                  10.11.2.0/24               169.254.0.1 dst-ip
>>>> +           192.168.0.0/24             169.254.100.1 dst-ip (learned) 
>>>> override-connected
>>>>                  10.22.2.0/24               169.254.0.2 src-ip
>>>>                     0.0.0.0/0             169.254.100.1 dst-ip (learned)
>>>>     ])
>>>> @@ -1332,8 +1334,11 @@ check ovn-ic-nbctl --wait=sb sync
>>>>     OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl lr-route-list lr11 | grep 
>>>> 192.168 |
>>>>                  grep learned | awk '{print $1, $2, $5}' | sort ], [0], 
>>>> [dnl
>>>>     192.168.0.0/24 169.254.101.2 ecmp
>>>> +192.168.0.0/24 169.254.101.2 override-connected
>>>>     192.168.0.0/24 169.254.102.2 ecmp
>>>> +192.168.0.0/24 169.254.102.2 override-connected
>>>>     192.168.0.0/24 169.254.103.2 ecmp
>>>> +192.168.0.0/24 169.254.103.2 override-connected
>>>>     ])
>>>>     
>>>>     # Test static routes from lr12 rtbs rtb1,rtb2,rtb3 were learned to lr11
>>>> @@ -1341,22 +1346,27 @@ OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl 
>>>> --route-table=rtb1 lr-route-list lr11]
>>>>     IPv4 Routes
>>>>     Route Table rtb1:
>>>>                 10.10.10.0/24             169.254.101.2 dst-ip (learned)
>>>> +           192.168.0.0/24             169.254.101.2 dst-ip (learned) 
>>>> override-connected
>>>>     ])
>>>>     OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl --route-table=rtb2 
>>>> lr-route-list lr11], [0], [dnl
>>>>     IPv4 Routes
>>>>     Route Table rtb2:
>>>>                 10.10.10.0/24             169.254.102.2 dst-ip (learned)
>>>> +           192.168.0.0/24             169.254.102.2 dst-ip (learned) 
>>>> override-connected
>>>>     ])
>>>>     OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl --route-table=rtb3 
>>>> lr-route-list lr11], [0], [dnl
>>>>     IPv4 Routes
>>>>     Route Table rtb3:
>>>>                 10.10.10.0/24             169.254.103.2 dst-ip (learned)
>>>> +           192.168.0.0/24             169.254.103.2 dst-ip (learned) 
>>>> override-connected
>>>>     ])
>>>>     
>>>>     # Test routes from lr12 didn't leak as learned to lr21
>>>>     OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl lr-route-list lr21 | grep 
>>>> 192.168 | sort], [0], [dnl
>>>>                192.168.0.0/24             169.254.101.2 dst-ip (learned) 
>>>> ecmp
>>>> +           192.168.0.0/24             169.254.101.2 dst-ip (learned) 
>>>> override-connected
>>>>                192.168.0.0/24             169.254.102.2 dst-ip (learned) 
>>>> ecmp
>>>> +           192.168.0.0/24             169.254.102.2 dst-ip (learned) 
>>>> override-connected
>>>>     ])
>>>>     
>>>>     OVN_CLEANUP_IC([az1], [az2])
>>>> @@ -1457,8 +1467,11 @@ check ovn-ic-nbctl --wait=sb sync
>>>>     AT_CHECK([ovn_as az1 ovn-nbctl lr-route-list lr11 | grep 2001:db8:200 |
>>>>                  grep learned | awk '{print $1, $2, $5}' | sort], [0], [dnl
>>>>     2001:db8:200::/64 2001:db8:1::2 ecmp
>>>> +2001:db8:200::/64 2001:db8:1::2 override-connected
>>>>     2001:db8:200::/64 2001:db8:2::2 ecmp
>>>> +2001:db8:200::/64 2001:db8:2::2 override-connected
>>>>     2001:db8:200::/64 2001:db8:3::2 ecmp
>>>> +2001:db8:200::/64 2001:db8:3::2 override-connected
>>>>     ])
>>>>     
>>>>     # Test static routes from lr12 rtbs rtb1,rtb2,rtb3 were learned to lr11
>>>> @@ -1466,18 +1479,21 @@ OVS_WAIT_UNTIL([ovn_as az1 ovn-nbctl 
>>>> --route-table=rtb1 lr-route-list lr11 | gre
>>>>     AT_CHECK([ovn_as az1 ovn-nbctl --route-table=rtb1 lr-route-list lr11], 
>>>> [0], [dnl
>>>>     IPv6 Routes
>>>>     Route Table rtb1:
>>>> +        2001:db8:200::/64             2001:db8:1::2 dst-ip (learned) 
>>>> override-connected
>>>>            2001:db8:aaaa::/64             2001:db8:1::2 dst-ip (learned)
>>>>     ])
>>>>     OVS_WAIT_UNTIL([ovn_as az1 ovn-nbctl --route-table=rtb2 lr-route-list 
>>>> lr11 | grep learned])
>>>>     AT_CHECK([ovn_as az1 ovn-nbctl --route-table=rtb2 lr-route-list lr11], 
>>>> [0], [dnl
>>>>     IPv6 Routes
>>>>     Route Table rtb2:
>>>> +        2001:db8:200::/64             2001:db8:2::2 dst-ip (learned) 
>>>> override-connected
>>>>            2001:db8:aaaa::/64             2001:db8:2::2 dst-ip (learned)
>>>>     ])
>>>>     OVS_WAIT_UNTIL([ovn_as az1 ovn-nbctl --route-table=rtb3 lr-route-list 
>>>> lr11 | grep learned])
>>>>     AT_CHECK([ovn_as az1 ovn-nbctl --route-table=rtb3 lr-route-list lr11], 
>>>> [0], [dnl
>>>>     IPv6 Routes
>>>>     Route Table rtb3:
>>>> +        2001:db8:200::/64             2001:db8:3::2 dst-ip (learned) 
>>>> override-connected
>>>>            2001:db8:aaaa::/64             2001:db8:3::2 dst-ip (learned)
>>>>     ])
>>>>     
>>>> @@ -1485,7 +1501,9 @@ Route Table rtb3:
>>>>     OVS_WAIT_UNTIL([ovn_as az1 ovn-nbctl lr-route-list lr21 | grep 
>>>> "2001:db8:2::2" | grep learned])
>>>>     AT_CHECK([ovn_as az1 ovn-nbctl lr-route-list lr21 | grep 2001 | sort], 
>>>> [0], [dnl
>>>>             2001:db8:200::/64             2001:db8:1::2 dst-ip (learned) 
>>>> ecmp
>>>> +        2001:db8:200::/64             2001:db8:1::2 dst-ip (learned) 
>>>> override-connected
>>>>             2001:db8:200::/64             2001:db8:2::2 dst-ip (learned) 
>>>> ecmp
>>>> +        2001:db8:200::/64             2001:db8:2::2 dst-ip (learned) 
>>>> override-connected
>>>>     ])
>>>>     
>>>>     OVN_CLEANUP_IC([az1], [az2])
>>>> @@ -4839,3 +4857,165 @@ OVN_CLEANUP_IC
>>>>     
>>>>     AT_CLEANUP
>>>>     ])
>>>> +
>>>> +OVN_FOR_EACH_NORTHD([
>>>> +AT_SETUP([ovn-ic -- east-west - 2az])
>>>> +
>>>> +ovn_init_ic_db
>>>> +ovn-ic-nbctl ts-add rtb-1
>>>> +ovn-ic-nbctl ts-add rtb-2
>>>> +
>>>> +ovn_start az1
>>>> +ovn_as az1
>>>> +
>>>> +check ovn_as az1 ovn-ic-nbctl --wait=sb sync
>>>> +check ovn_as az1 ovn-nbctl set nb_global . options:ic-route-learn=true
>>>> +check ovn_as az1 ovn-nbctl set nb_global . options:ic-route-adv=true
>>>> +
>>>> +check ovn_as az1 ovn-nbctl ls-add subnet-A
>>>> +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
>>>> +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"
>>>> +
>>>> +check ovn_as az1 ovn-nbctl ls-add subnet-B
>>>> +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
>>>> +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"
>>>> +
>>>> +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
>>>> +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
>>>> +
>>>> +check ovn_as az1 ovn-nbctl lr-add rt1
>>>> +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
>>>> +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
>>>> +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
>>>> +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
>>>> +
>>>> +ovn_start az2
>>>> +ovn_as az2
>>>> +
>>>> +check ovn_as az2 ovn-ic-nbctl --wait=sb sync
>>>> +check ovn_as az2 ovn-nbctl set nb_global . options:ic-route-learn=true
>>>> +check ovn_as az2 ovn-nbctl set nb_global . options:ic-route-adv=true
>>>> +
>>>> +check ovn_as az2 ovn-nbctl ls-add subnet-C
>>>> +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
>>>> +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"
>>>> +
>>>> +check ovn_as az2 ovn-nbctl ls-add subnet-D
>>>> +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
>>>> +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"
>>>> +
>>>> +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
>>>> +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
>>>> +
>>>> +check ovn_as az2 ovn-nbctl lr-add rt1
>>>> +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
>>>> +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
>>>> +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
>>>> +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
>>>> +
>>>> +check ovn_as az2 ovn-nbctl --route-table=table1 --override-connected 
>>>> lr-route-add rt1 "172.31.0.0/24" "172.31.2.4"
>>>> +check ovn_as az2 ovn-nbctl --route-table=table1 --override-connected 
>>>> lr-route-add rt1 "172.31.1.0/24" "172.31.3.4"
>>>> +
>>>> +check ovn-ic-nbctl --wait=sb sync
>>>> +
>>>> +AT_CHECK([ovn_as az1 ovn-nbctl lr-route-list rt1], [0], [dnl
>>>> +IPv4 Routes
>>>> +Route Table <main>:
>>>> +            172.31.2.0/24             169.254.100.2 dst-ip (learned) ecmp
>>>> +            172.31.2.0/24            169.254.100.34 dst-ip (learned) ecmp
>>>> +            172.31.3.0/24             169.254.100.2 dst-ip (learned) ecmp
>>>> +            172.31.3.0/24            169.254.100.34 dst-ip (learned) ecmp
>>>> +
>>>> +Route Table table1:
>>>> +            172.31.0.0/24             169.254.100.2 dst-ip (learned) 
>>>> override-connected
>>>> +            172.31.1.0/24             169.254.100.2 dst-ip (learned) 
>>>> override-connected
>>>> +            172.31.2.0/24             169.254.100.2 dst-ip (learned) 
>>>> override-connected
>>>> +            172.31.3.0/24             169.254.100.2 dst-ip (learned) 
>>>> override-connected
>>>> +
>>>> +Route Table table2:
>>>> +            172.31.2.0/24            169.254.100.34 dst-ip (learned) 
>>>> override-connected
>>>> +            172.31.3.0/24            169.254.100.34 dst-ip (learned) 
>>>> override-connected
>>>> +])
>>>> +
>>>> +AT_CHECK([ovn_as az2 ovn-nbctl lr-route-list rt1], [0], [dnl
>>>> +IPv4 Routes
>>>> +Route Table <main>:
>>>> +            172.31.0.0/24             169.254.100.1 dst-ip (learned) ecmp
>>>> +            172.31.0.0/24            169.254.100.33 dst-ip (learned) ecmp
>>>> +            172.31.1.0/24             169.254.100.1 dst-ip (learned) ecmp
>>>> +            172.31.1.0/24            169.254.100.33 dst-ip (learned) ecmp
>>>> +
>>>> +Route Table table1:
>>>> +            172.31.0.0/24                172.31.2.4 dst-ip 
>>>> override-connected
>>>> +            172.31.0.0/24             169.254.100.1 dst-ip (learned) 
>>>> override-connected
>>>> +            172.31.1.0/24                172.31.3.4 dst-ip 
>>>> override-connected
>>>> +            172.31.1.0/24             169.254.100.1 dst-ip (learned) 
>>>> override-connected
>>>> +
>>>> +Route Table table2:
>>>> +            172.31.0.0/24            169.254.100.33 dst-ip (learned) 
>>>> override-connected
>>>> +            172.31.1.0/24            169.254.100.33 dst-ip (learned) 
>>>> override-connected
>>>> +])
>>>> +
>>>> +AZF1="az1/az1_flow.txt"
>>>> +AZF2="az2/az2_flow.txt"
>>>> +ovn_as az1 ovn-sbctl lflow-list rt1 > $AZF1
>>>> +ovn_as az2 ovn-sbctl lflow-list rt1 > $AZF2
>>>> +
>>>> +VA1=$(grep "ip_routing_pre.*rtb-1" $AZF1 | sed -n 's/.*reg7 = 
>>>> \([[0-9]]*\).*/\1/p')
>>>> +VA2=$(grep "ip_routing_pre.*rtb-2" $AZF1 | sed -n 's/.*reg7 = 
>>>> \([[0-9]]*\).*/\1/p')
>>>> +
>>>> +#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
>>>> +
>>>> +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
>>>> +  table=??(lr_in_ip_routing   ), priority=0    , match=(1), action=(drop;)
>>>> +  table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || nd_ra), 
>>>> action=(drop;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +])
>>>> +
>>>> +VA1=$(grep "ip_routing_pre.*rtb-1" $AZF2 | sed -n 's/.*reg7 = 
>>>> \([[0-9]]*\).*/\1/p')
>>>> +VA2=$(grep "ip_routing_pre.*rtb-2" $AZF2 | sed -n 's/.*reg7 = 
>>>> \([[0-9]]*\).*/\1/p')
>>>> +
>>>> +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
>>>> +  table=??(lr_in_ip_routing   ), priority=0    , match=(1), action=(drop;)
>>>> +  table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || nd_ra), 
>>>> action=(drop;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +])
>>>> +
>>>> +OVN_CLEANUP_IC([az1], [az2])
>>>> +
>>>> +AT_CLEANUP
>>>> +])
>>>> diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at
>>>> index 1d7bd6c28..da023c260 100644
>>>> --- a/tests/ovn-northd.at
>>>> +++ b/tests/ovn-northd.at
>>>> @@ -7278,9 +7278,9 @@ AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | 
>>>> ovn_strip_lflows], [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       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;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>>     ])
>>>>     
>>>>     AT_CHECK([grep -e "lr_in_ip_routing_ecmp" lr0flows | 
>>>> ovn_strip_lflows], [0], [dnl
>>>> @@ -7304,9 +7304,9 @@ AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | 
>>>> ovn_strip_lflows], [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       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;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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;)
>>>> -  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);)
>>>> -  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;)
>>>> +  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;)
>>>> +  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);)
>>>> +  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;)
>>>>     ])
>>>>     AT_CHECK([grep -e "lr_in_ip_routing_ecmp" lr0flows | sed 
>>>> 's/192\.168\.0\..0/192.168.0.??/' | ovn_strip_lflows], [0], [dnl
>>>>       table=??(lr_in_ip_routing_ecmp), priority=0    , match=(1), 
>>>> action=(drop;)
>>>> @@ -7346,9 +7346,9 @@ AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | 
>>>> ovn_strip_lflows], [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       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;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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;)
>>>> -  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);)
>>>> -  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;)
>>>> +  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;)
>>>> +  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);)
>>>> +  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;)
>>>>     ])
>>>>     AT_CHECK([grep -e "lr_in_ip_routing_ecmp" lr0flows | sed 
>>>> 's/192\.168\.0\..0/192.168.0.??/' | ovn_strip_lflows], [0], [dnl
>>>>       table=??(lr_in_ip_routing_ecmp), priority=0    , match=(1), 
>>>> action=(drop;)
>>>> @@ -7370,14 +7370,14 @@ check ovn-nbctl --wait=sb lr-route-add lr0 
>>>> 1.0.0.0/24 192.168.0.10
>>>>     ovn-sbctl dump-flows lr0 > lr0flows
>>>>     
>>>>     AT_CHECK([grep -e "lr_in_ip_routing.*192.168.0.10" lr0flows | 
>>>> ovn_strip_lflows], [0], [dnl
>>>> -  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;)
>>>> +  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;)
>>>>     ])
>>>>     
>>>>     check ovn-nbctl --wait=sb lr-route-add lr0 2.0.0.0/24 lr0-public
>>>>     
>>>>     ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -e "lr_in_ip_routing.*2.0.0.0" lr0flows | 
>>>> ovn_strip_lflows], [0], [dnl
>>>> -  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;)
>>>> +  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;)
>>>>     ])
>>>>     
>>>>     check ovn-nbctl lr-route-add lr0 3.3.0.0/16 192.168.0.11
>>>> @@ -7392,7 +7392,7 @@ check ovn-nbctl set logical_router_static_route 
>>>> $route2_uuid selection_fields="i
>>>>     check ovn-nbctl --wait=sb sync
>>>>     ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -e "(lr_in_ip_routing   ).*3.3.0.0" lr0flows | sed 
>>>> 's/table=../table=??/' | sort], [0], [dnl
>>>> -  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");)
>>>> +  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");)
>>>>     ])
>>>>     
>>>>     check ovn-nbctl set logical_router_static_route $route1_uuid 
>>>> selection_fields="ip_src,ip_dst,tp_src,tp_dst"
>>>> @@ -7401,10 +7401,10 @@ check ovn-nbctl set logical_router_static_route 
>>>> $route2_uuid selection_fields="i
>>>>     check ovn-nbctl --wait=sb sync
>>>>     ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -e "(lr_in_ip_routing   ).*3.3.0.0" lr0flows | sed 
>>>> 's/table=../table=??/' | sort], [0], [dnl
>>>> -  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");)
>>>> -  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");)
>>>> -  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");)
>>>> -  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");)
>>>> +  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");)
>>>> +  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");)
>>>> +  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");)
>>>> +  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");)
>>>>     ])
>>>>     
>>>>     AT_CHECK([grep -e "lr_in_ecmp_stateful_egr" lr0flows | 
>>>> ovn_strip_lflows], [0], [dnl
>>>> @@ -7446,15 +7446,15 @@ ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -e "lr_in_ip_routing " lr0flows | ovn_strip_lflows], 
>>>> [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>>     ])
>>>>     
>>>>     AT_CHECK([grep -e "lr_in_arp_resolve" lr0flows | ovn_strip_lflows], 
>>>> [0], [dnl
>>>> @@ -7970,16 +7970,16 @@ AT_CHECK([grep "lr_in_ip_routing_pre" lr0flows | 
>>>> ovn_strip_lflows], [0], [dnl
>>>>     grep -e "(lr_in_ip_routing   ).*outport" lr0flows
>>>>     
>>>>     AT_CHECK([grep -e "(lr_in_ip_routing   ).*outport" lr0flows | 
>>>> ovn_strip_lflows], [0], [dnl
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>>     ])
>>>>     
>>>>     OVN_CLEANUP_NORTHD
>>>> @@ -15879,12 +15879,12 @@ ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | ovn_strip_lflows], 
>>>> [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>>     ])
>>>>     
>>>>     # Learn a route to 172.16.0.0/24 via 10.0.0.11 learned on lr0-sw0.
>>>> @@ -15900,13 +15900,13 @@ ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | ovn_strip_lflows], 
>>>> [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>>     ])
>>>>     
>>>>     # Learn a route to 2001:db8:2::/64 via 2001:db8:ffff::20 learned on 
>>>> lr0-sw1.
>>>> @@ -15923,14 +15923,14 @@ ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | ovn_strip_lflows], 
>>>> [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>>     ])
>>>>     
>>>>     # If we now add 2001:db8:ffff::1/64 as an additional network to 
>>>> lr0-sw1 we
>>>> @@ -15944,15 +15944,15 @@ ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | ovn_strip_lflows], 
>>>> [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>>     ])
>>>>     
>>>>     # Learn a route to 2001:db8:3::/64 via 10.0.0.20 learned on lr0-sw0.
>>>> @@ -15968,16 +15968,16 @@ ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | ovn_strip_lflows], 
>>>> [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>>     ])
>>>>     
>>>>     # Learn a route to 172.16.1.0/24 via 2001:db8:ffff::30 learned on 
>>>> lr0-sw1.
>>>> @@ -15993,17 +15993,17 @@ ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | ovn_strip_lflows], 
>>>> [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>>     ])
>>>>     
>>>>     # Deleting lr0-sw1 will remove the flows and also the learned route.
>>>> @@ -16015,11 +16015,11 @@ ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | ovn_strip_lflows], 
>>>> [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>>     ])
>>>>     
>>>>     OVN_CLEANUP_NORTHD
>>>> @@ -16049,11 +16049,11 @@ ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | ovn_strip_lflows], 
>>>> [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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);)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> +  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);)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>>     ])
>>>>     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
>>>>       table=??(lr_in_ip_routing_ecmp), priority=0    , match=(1), 
>>>> action=(drop;)
>>>> @@ -16075,12 +16075,12 @@ ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | ovn_strip_lflows], 
>>>> [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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;)
>>>> -  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);)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> +  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;)
>>>> +  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);)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>>     ])
>>>>     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
>>>>       table=??(lr_in_ip_routing_ecmp), priority=0    , match=(1), 
>>>> action=(drop;)
>>>> @@ -16103,12 +16103,12 @@ ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | ovn_strip_lflows], 
>>>> [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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);)
>>>> -  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);)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> +  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);)
>>>> +  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);)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>>     ])
>>>>     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
>>>>       table=??(lr_in_ip_routing_ecmp), priority=0    , match=(1), 
>>>> action=(drop;)
>>>> @@ -16145,13 +16145,13 @@ ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep -w "lr_in_ip_routing" lr0flows | sed -e 
>>>> 's/reg8\[[0..15\]] = [[123]]/reg8\[[0..15\]] = ??/' | ovn_strip_lflows], 
>>>> [0], [dnl
>>>>       table=??(lr_in_ip_routing   ), priority=0    , match=(1), 
>>>> action=(drop;)
>>>>       table=??(lr_in_ip_routing   ), priority=10550, match=(nd_rs || 
>>>> nd_ra), action=(drop;)
>>>> -  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);)
>>>> -  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);)
>>>> -  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);)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> -  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;)
>>>> +  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);)
>>>> +  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);)
>>>> +  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);)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>> +  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;)
>>>>     ])
>>>>     
>>>>     OVN_CLEANUP_NORTHD
>>>> @@ -20473,7 +20473,7 @@ check ovn-nbctl --wait=sb sync
>>>>     
>>>>     ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep 'lr_in_ip_routing' lr0flows | grep 'select' | 
>>>> ovn_strip_lflows], [0], [dnl
>>>> -  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);)
>>>> +  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);)
>>>>     ])
>>>>     
>>>>     AT_CHECK([grep 'lr_in_ip_routing_ecmp' lr0flows | sed -E 's/== 
>>>> [[1-9]]+\)/== \?)/' | ovn_strip_lflows], [0], [dnl
>>>> @@ -20491,7 +20491,7 @@ check ovn-nbctl --wait=sb set 
>>>> Logical_Router_Static_Route $ecmp1 nexthop="discar
>>>>     
>>>>     ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep 'lr_in_ip_routing' lr0flows | grep 'select' | 
>>>> ovn_strip_lflows], [0], [dnl
>>>> -  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);)
>>>> +  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);)
>>>>     ])
>>>>     
>>>>     AT_CHECK([grep 'lr_in_ip_routing_ecmp' lr0flows | sed -E 's/== 
>>>> [[1-9]]+\)/== \?)/' | ovn_strip_lflows], [0], [dnl
>>>> @@ -20506,7 +20506,7 @@ check ovn-nbctl --wait=sb set 
>>>> Logical_Router_Static_Route $ecmp2 nexthop="discar
>>>>     
>>>>     ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep 'lr_in_ip_routing' lr0flows | grep 'select' | 
>>>> ovn_strip_lflows], [0], [dnl
>>>> -  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);)
>>>> +  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);)
>>>>     ])
>>>>     
>>>>     AT_CHECK([grep 'lr_in_ip_routing_ecmp' lr0flows | sed -E 's/== 
>>>> [[1-9]]+\)/== \?)/' | ovn_strip_lflows], [0], [dnl
>>>> @@ -20522,7 +20522,7 @@ check ovn-nbctl --wait=sb set 
>>>> Logical_Router_Static_Route $ecmp2 nexthop="10.0.2
>>>>     
>>>>     ovn-sbctl dump-flows lr0 > lr0flows
>>>>     AT_CHECK([grep 'lr_in_ip_routing' lr0flows | grep 'select' | 
>>>> ovn_strip_lflows], [0], [dnl
>>>> -  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);)
>>>> +  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);)
>>>>     ])
>>>>     
>>>>     AT_CHECK([grep 'lr_in_ip_routing_ecmp' lr0flows | sed -E 's/== 
>>>> [[1-9]]+\)/== \?)/' | ovn_strip_lflows], [0], [dnl
>>>> diff --git a/utilities/ovn-nbctl.8.xml b/utilities/ovn-nbctl.8.xml
>>>> index 4fbd0bb0e..1c67bbd1f 100644
>>>> --- a/utilities/ovn-nbctl.8.xml
>>>> +++ b/utilities/ovn-nbctl.8.xml
>>>> @@ -1146,6 +1146,7 @@
>>>>           <dt>[<code>--may-exist</code>] 
>>>> [<code>--policy</code>=<var>POLICY</var>]
>>>>             [<code>--route-table</code>=<var>ROUTE_TABLE</var>]
>>>>             [<code>--ecmp</code>] [<code>--ecmp-symmetric-reply</code>]
>>>> +        [<code>--override-connected</code>]
>>>>             [<code>--bfd[=<var>UUID</var></code>]]
>>>>             <code>lr-route-add</code> <var>router</var>
>>>>             <var>prefix</var> <var>nexthop</var> [<var>port</var>]</dt>
>>>> @@ -1194,6 +1195,11 @@
>>>>               it is not necessary to set both.
>>>>             </p>
>>>>     
>>>> +        <p>
>>>> +          The <code>--override-connected</code> option makes it so that
>>>> +          route's priority to be highest among routes with same prefix.
>>>> +        </p>
>>>> +
>>>>             <p>
>>>>               <code>--bfd</code> option is used to link a BFD session to 
>>>> the
>>>>               OVN route. If the BFD session UUID is provided, it will be 
>>>> used
>>>> diff --git a/utilities/ovn-nbctl.c b/utilities/ovn-nbctl.c
>>>> index 0ef207272..abc172b57 100644
>>>> --- a/utilities/ovn-nbctl.c
>>>> +++ b/utilities/ovn-nbctl.c
>>>> @@ -448,6 +448,7 @@ Route commands:\n\
>>>>       [--policy=POLICY]\n\
>>>>       [--ecmp]\n\
>>>>       [--ecmp-symmetric-reply]\n\
>>>> +  [--override-connected]\n\
>>>>       [--route-table=ROUTE_TABLE]\n\
>>>>       [--bfd]\n\
>>>>       lr-route-add ROUTER PREFIX NEXTHOP [PORT]\n\
>>>> @@ -5236,6 +5237,8 @@ nbctl_lr_route_add(struct ctl_context *ctx)
>>>>                                                "--ecmp-symmetric-reply") 
>>>> != NULL;
>>>>         bool ecmp = shash_find(&ctx->options, "--ecmp") != NULL ||
>>>>                     ecmp_symmetric_reply;
>>>> +    bool override_connected = shash_find(&ctx->options,
>>>> +                                           "--override-connected") != 
>>>> NULL;
>>>>         struct nbrec_logical_router_static_route *route =
>>>>             nbctl_lr_get_route(lr, prefix, next_hop, is_src_route, ecmp,
>>>>                                route_table);
>>>> @@ -5323,11 +5326,20 @@ nbctl_lr_route_add(struct ctl_context *ctx)
>>>>             nbrec_logical_router_static_route_set_route_table(route, 
>>>> route_table);
>>>>         }
>>>>     
>>>> -    if (ecmp_symmetric_reply) {
>>>> -        const struct smap options = SMAP_CONST1(&options,
>>>> -                                                "ecmp_symmetric_reply",
>>>> -                                                "true");
>>>> +    if (ecmp_symmetric_reply || override_connected) {
>>>> +        struct smap options = SMAP_INITIALIZER(&options);
>>>> +
>>>> +        if (ecmp_symmetric_reply) {
>>>> +            smap_add(&options, "ecmp_symmetric_reply", "true");
>>>> +        }
>>>> +
>>>> +        if (override_connected) {
>>>> +            smap_add(&options, ROUTE_OVERRIDE_CONNECTED, "true");
>>>> +        }
>>>> +
>>>>             nbrec_logical_router_static_route_set_options(route, &options);
>>>> +
>>>> +        smap_destroy(&options);
>>>>         }
>>>>     
>>>>         nbrec_logical_router_update_static_routes_addvalue(lr, route);
>>>> @@ -7437,6 +7449,10 @@ print_route(const struct 
>>>> nbrec_logical_router_static_route *route,
>>>>             ds_put_cstr(s, " ecmp-symmetric-reply");
>>>>         }
>>>>     
>>>> +    if (smap_get_bool(&route->options, ROUTE_OVERRIDE_CONNECTED, false)) {
>>>> +        ds_put_cstr(s, " override-connected");
>>>> +    }
>>>> +
>>>>         if (route->bfd) {
>>>>             ds_put_cstr(s, " bfd");
>>>>         }
>>>> @@ -9420,8 +9436,8 @@ static const struct ctl_command_syntax 
>>>> nbctl_commands[] = {
>>>>         /* logical router route commands. */
>>>>         { "lr-route-add", 3, 4, "ROUTER PREFIX NEXTHOP [PORT]",
>>>>           nbctl_pre_lr_route_add, nbctl_lr_route_add, NULL,
>>>> -      "--may-exist,--ecmp,--ecmp-symmetric-reply,--policy=,"
>>>> -      "--route-table=,--bfd?", RW },
>>>> +      "--may-exist,--ecmp,--ecmp-symmetric-reply,--override-connected,"
>>>> +      "--policy=,--route-table=,--bfd?", RW },
>>>>         { "lr-route-del", 1, 4, "ROUTER [PREFIX [NEXTHOP [PORT]]]",
>>>>           nbctl_pre_lr_route_del, nbctl_lr_route_del, NULL,
>>>>           "--if-exists,--policy=,--route-table=", RW },
>> _______________________________________________
>> dev mailing list
>> [email protected]
>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>>

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

Reply via email to