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