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

> 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