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