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
