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
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
