[{"id":3677045,"web_url":"http://patchwork.ozlabs.org/comment/3677045/","msgid":"<CALVEqe4z_yErJeq4BnwdreRhsN08CFRZDwPt8hV9smRkn9T8sw@mail.gmail.com>","list_archive_url":null,"date":"2026-04-14T07:28:55","subject":"Re: [ovs-dev] [PATCH ovn v4] northd,\n ic: Add hub-spoke options to adv DR routes learned in ovn-ic.","submitter":{"id":83634,"url":"http://patchwork.ozlabs.org/api/people/83634/","name":"Ales Musil","email":"amusil@redhat.com"},"content":"On Mon, Apr 13, 2026 at 6:37 PM Lucas Vargas Dias via dev <\novs-dev@openvswitch.org> wrote:\n\n> Consider the scenario where there are 2 AZs using ovn-ic, each AZ has\n> one LR and its LS. The LRs are interconnected by a transit switch.\n> On each AZ, we can configure the dynamic routing and exchange routes\n> via BGP with external BGP speakers.\n>\n> AZ1\n> LS1 - LR1 - BGP Speaker1 - Local subnet1\n>        \\\n>    -----------------------\n>     transit switch\n>    -----------------------\n> AZ2    /\n> LS2 - LR2 - BGP Speaker2 - Local subnet2\n>\n> The LR2 will learn the subnet1 prefix via ovn-ic but this prefix will\n> not be redistributed to BGP Speaker2 and it also happens with LR1.\n> This scenario uses the network's hub-and-spoke terminology where we can\n> enable the hub-spoke on the LR for such redistribution.\n> subnet1 and subnet2 are configured as ic-source-dynamic=true in ovn-ic.\n> Also, consider the same scenario, but LR1 and LR2 learn the same subnet\n> for redundancy, hub-spoke option is disabled to not adv the subnet learned\n> from BGP and advertised in ovn-ic in BGP speakers.\n>\n> Signed-off-by: Lucas Vargas Dias <lucas.vdias@luizalabs.com>\n> ---\n>\n\nHi Lucas,\n\nthank you for the v4. I have some small comments down below.\n\n\n>  NEWS                              |   2 +\n>  ic/ovn-ic.c                       |  20 ++++--\n>  lib/ovn-util.h                    |   1 +\n>  northd/en-advertised-route-sync.c |   2 +\n>  northd/northd.c                   |   8 +++\n>  northd/northd.h                   |   5 +-\n>  northd/ovn-northd.c               |   1 -\n>  ovn-ic-sb.ovsschema               |   7 ++-\n>  ovn-ic-sb.xml                     |  14 +++--\n>  ovn-nb.xml                        |  14 +++++\n>  tests/ovn-ic.at                   | 101 ++++++++++++++++++++++++++++++\n>  11 files changed, 160 insertions(+), 15 deletions(-)\n>\n> diff --git a/NEWS b/NEWS\n> index 888946b54..5710716aa 100644\n> --- a/NEWS\n> +++ b/NEWS\n> @@ -52,6 +52,8 @@ OVN v26.03.0 - xxx xx xxxx\n>         learned routes. This option has priority over its router\n> counterpart.\n>       * The EVPN support is now considered stable.  Its \"experimental\" tag\n> has\n>         been removed.\n> +     * Add support for hub-and-spoke propagation via the \"hub-spoke\"\n> option\n> +       in dynamic-routing-redistribute settings.\n>\n\nnit: This should be in the post 26.03.0 section.\n\n    - Add support for Network Function insertion in OVN with stateful\n> traffic\n>       redirection capability in Logical Switch datapath. The feature\n> introduces\n>       three new NB database tables:\n> diff --git a/ic/ovn-ic.c b/ic/ovn-ic.c\n> index 1aa8af9b9..9d422e25b 100644\n> --- a/ic/ovn-ic.c\n> +++ b/ic/ovn-ic.c\n> @@ -1283,6 +1283,7 @@ struct ic_route_info {\n>      struct in6_addr prefix;\n>      unsigned int plen;\n>      struct in6_addr nexthop;\n> +    bool is_src_dynamic;\n>\n\nnit: This is no longer used.\n\n\n>      const char *origin;\n>      const char *route_table;\n>      const char *route_tag;\n> @@ -1671,7 +1672,8 @@ add_network_to_routes_ad(struct hmap *routes_ad,\n> const char *network,\n>                           const struct smap *nb_options,\n>                           const struct nbrec_logical_router *nb_lr,\n>                           const char *route_tag,\n> -                         const struct nbrec_logical_router_port *ts_lrp)\n> +                         const struct nbrec_logical_router_port *ts_lrp,\n> +                         bool is_src_dynamic)\n>  {\n>      struct in6_addr prefix, nexthop;\n>      unsigned int plen;\n> @@ -1721,8 +1723,10 @@ add_network_to_routes_ad(struct hmap *routes_ad,\n> const char *network,\n>          ds_destroy(&msg);\n>      }\n>\n> +    const char *origin = is_src_dynamic ? ROUTE_ORIGIN_CONNECTED_DYNAMIC :\n> +                                          ROUTE_ORIGIN_CONNECTED;\n>      /* directly-connected routes go to <main> route table */\n> -    add_to_routes_ad(routes_ad, prefix, plen, nexthop,\n> ROUTE_ORIGIN_CONNECTED,\n> +    add_to_routes_ad(routes_ad, prefix, plen, nexthop, origin,\n>                       NULL, nb_lrp, NULL, nb_lr, NULL, route_tag);\n>  }\n>\n> @@ -2169,6 +2173,14 @@ sync_learned_routes(struct ic_context *ctx,\n>                                  isb_route->route_table,\n>                                  &isb_route->header_.uuid, 0);\n>              if (route_learned) {\n> +                if (strcmp(route_learned->origin, isb_route->origin) !=\n> 0) {\n> +                    VLOG_DBG(\"Update learned route %s -> %s with new\n> origin \"\n> +                             \"%s (old origin was %s)\",\n> +                             isb_route->ip_prefix, isb_route->nexthop,\n> +                             isb_route->origin, route_learned->origin);\n> +\n> nbrec_logical_router_static_route_update_options_setkey(\n> +                        route_learned->nb_route, \"origin\",\n> isb_route->origin);\n> +                }\n>\n\nI think this condition can actually never happen, because thei\nic_route_find() is also checking the origin. I should have realized\nthis in the previous review sorry. So we don't need this update\nbecause if they don't match we will just re-create the NB entry.\n\n                 hmap_remove(&ic_lr->routes_learned, &route_learned->node);\n>                  free(route_learned);\n>              } else {\n> @@ -2374,7 +2386,7 @@ build_ts_routes_to_adv(struct ic_context *ctx,\n>                  add_network_to_routes_ad(routes_ad, lrp->networks[j], lrp,\n>                                           ts_port_addrs,\n>                                           &nb_global->options,\n> -                                         lr, route_tag, ts_lrp);\n> +                                         lr, route_tag, ts_lrp, false);\n>              }\n>          } else {\n>              /* The router port of the TS port is ignored. */\n> @@ -2429,7 +2441,7 @@ build_ts_routes_to_adv(struct ic_context *ctx,\n>          add_network_to_routes_ad(routes_ad, sb_route->ip_prefix, NULL,\n>                                   ts_port_addrs,\n>                                   &nb_global->options,\n> -                                 lr, route_tag, ts_lrp);\n> +                                 lr, route_tag, ts_lrp, true);\n>      }\n>      sbrec_learned_route_index_destroy_row(filter);\n>  }\n> diff --git a/lib/ovn-util.h b/lib/ovn-util.h\n> index 4c6623bef..4ccf6dc2d 100644\n> --- a/lib/ovn-util.h\n> +++ b/lib/ovn-util.h\n> @@ -33,6 +33,7 @@\n>  #define ROUTE_ORIGIN_CONNECTED \"connected\"\n>  #define ROUTE_ORIGIN_STATIC \"static\"\n>  #define ROUTE_ORIGIN_LB \"loadbalancer\"\n> +#define ROUTE_ORIGIN_CONNECTED_DYNAMIC \"connected-dynamic\"\n>\n>  #define ETH_CRC_LENGTH 4\n>  #define ETHERNET_OVERHEAD (ETH_HEADER_LEN + ETH_CRC_LENGTH)\n> diff --git a/northd/en-advertised-route-sync.c\n> b/northd/en-advertised-route-sync.c\n> index 8b73810c7..6ae9a9689 100644\n> --- a/northd/en-advertised-route-sync.c\n> +++ b/northd/en-advertised-route-sync.c\n> @@ -683,6 +683,8 @@ should_advertise_route(const struct ovn_datapath\n> *advertising_od,\n>          return drr_mode_LB_is_set(drr);\n>      case ROUTE_SOURCE_CONNECTED_AS_HOST:\n>          return drr_mode_CONNECTED_AS_HOST_is_set(drr);\n> +    case ROUTE_SOURCE_IC_DYNAMIC:\n> +        return drr_mode_IC_DYNAMIC_is_set(drr);\n>      case ROUTE_SOURCE_LEARNED:\n>          OVS_NOT_REACHED();\n>      default:\n> diff --git a/northd/northd.c b/northd/northd.c\n> index b7239f4e2..ce80639ea 100644\n> --- a/northd/northd.c\n> +++ b/northd/northd.c\n> @@ -887,6 +887,10 @@ parse_dynamic_routing_redistribute(\n>              out |= DRRM_LB;\n>              continue;\n>          }\n> +        if (!strcmp(token, \"hub-spoke\")) {\n> +            out |= DRRM_IC_DYNAMIC;\n> +            continue;\n> +        }\n>          static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);\n>          VLOG_WARN_RL(&rl,\n>                       \"unknown dynamic-routing-redistribute option '%s' on\n> %s\",\n> @@ -12342,6 +12346,9 @@ parsed_routes_add_static(const struct ovn_datapath\n> *od,\n>      if (!strcmp(smap_get_def(&route->options, \"origin\", \"\"),\n>                  ROUTE_ORIGIN_CONNECTED)) {\n>          source = ROUTE_SOURCE_CONNECTED;\n> +    } else if (!strcmp(smap_get_def(&route->options, \"origin\", \"\"),\n> +                ROUTE_ORIGIN_CONNECTED_DYNAMIC)) {\n> +        source = ROUTE_SOURCE_IC_DYNAMIC;\n>\n\nnit: We are calling the smap_get_def multiple times.\n\n\n>      } else {\n>          source = ROUTE_SOURCE_STATIC;\n>      }\n> @@ -12436,6 +12443,7 @@ route_source_to_offset(enum route_source source)\n>  {\n>      switch (source) {\n>      case ROUTE_SOURCE_CONNECTED:\n> +    case ROUTE_SOURCE_IC_DYNAMIC:\n>          return ROUTE_PRIO_OFFSET_CONNECTED;\n>      case ROUTE_SOURCE_STATIC:\n>          return ROUTE_PRIO_OFFSET_STATIC;\n> diff --git a/northd/northd.h b/northd/northd.h\n> index 139519006..e86d39f9a 100644\n> --- a/northd/northd.h\n> +++ b/northd/northd.h\n> @@ -365,7 +365,8 @@ struct mcast_port_info {\n>      DRR_MODE(CONNECTED_AS_HOST, 1) \\\n>      DRR_MODE(STATIC,            2) \\\n>      DRR_MODE(NAT,               3) \\\n> -    DRR_MODE(LB,                4)\n> +    DRR_MODE(LB,                4) \\\n> +    DRR_MODE(IC_DYNAMIC,        5)\n>\n>  enum dynamic_routing_redistribute_mode_bits {\n>  #define DRR_MODE(PROTOCOL, BIT) DRRM_##PROTOCOL##_BIT = BIT,\n> @@ -832,6 +833,8 @@ enum route_source {\n>      ROUTE_SOURCE_LB,\n>      /* The route is derived from out_port of connected logical router. */\n>      ROUTE_SOURCE_CONNECTED_AS_HOST,\n> +    /* The route is derived from an ovn-controller and advertised to IC.\n> */\n> +    ROUTE_SOURCE_IC_DYNAMIC,\n>  };\n>\n>  struct parsed_route {\n> diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c\n> index 0ed2eb17a..cfaf2f74b 100644\n> --- a/northd/ovn-northd.c\n> +++ b/northd/ovn-northd.c\n> @@ -905,7 +905,6 @@ main(int argc, char *argv[])\n>          &nbrec_load_balancer_col_external_ids,\n>          &nbrec_load_balancer_health_check_col_external_ids,\n>          &nbrec_logical_router_policy_col_external_ids,\n> -        &nbrec_logical_router_static_route_col_external_ids,\n>\n\nnit: Leftover.\n\n\n>          &nbrec_meter_col_external_ids,\n>          &nbrec_meter_band_col_external_ids,\n>          &nbrec_mirror_col_external_ids,\n> diff --git a/ovn-ic-sb.ovsschema b/ovn-ic-sb.ovsschema\n> index 8981a4eef..e0e0fef5e 100644\n> --- a/ovn-ic-sb.ovsschema\n> +++ b/ovn-ic-sb.ovsschema\n> @@ -1,7 +1,7 @@\n>  {\n>      \"name\": \"OVN_IC_Southbound\",\n> -    \"version\": \"2.4.0\",\n> -    \"cksum\": \"859073048 9662\",\n> +    \"version\": \"2.5.0\",\n> +    \"cksum\": \"1892994110 9713\",\n>      \"tables\": {\n>          \"IC_SB_Global\": {\n>              \"columns\": {\n> @@ -116,7 +116,8 @@\n>                  \"origin\": {\"type\": {\"key\": {\n>                      \"type\": \"string\",\n>                      \"enum\": [\"set\",\n> -                             [\"connected\", \"static\", \"loadbalancer\"]]}}},\n> +                             [\"connected\", \"static\", \"loadbalancer\",\n> +                              \"connected-dynamic\"]]}}},\n>                  \"external_ids\": {\n>                      \"type\": {\"key\": \"string\", \"value\": \"string\",\n>                               \"min\": 0, \"max\": \"unlimited\"}}},\n> diff --git a/ovn-ic-sb.xml b/ovn-ic-sb.xml\n> index b59fe1d03..3ca115073 100644\n> --- a/ovn-ic-sb.xml\n> +++ b/ovn-ic-sb.xml\n> @@ -378,12 +378,14 @@\n>        </column>\n>\n>        <column name=\"origin\">\n> -        Can be one of <code>connected</code>, <code>static</code> or\n> -        <code>loadbalancer</code>.  Routes to directly-connected subnets -\n> -        LRP's CIDRs are inserted to OVN IC SB DB with\n> <code>connected</code>\n> -        value in <ref column=\"origin\"/>.  Static routes are inserted to\n> OVN IC\n> -        SB DB with <code>static</code> value.  Routes for LB VIPs are\n> inserted\n> -        in OVN IC SB DB with <code>loadbalancer</code> value.\n> +        Can be one of <code>connected</code>, <code>static</code>,\n> +        <code>connected-dynamic</code> or <code>loadbalancer</code>.\n> Routes\n> +        to directly-connected subnets - LRP's CIDRs are inserted to OVN\n> IC SB\n> +        DB with <code>connected</code> value in <ref column=\"origin\"/>.\n> +          Static routes are inserted to OVN IC SB DB with\n> <code>static</code>\n>\n\nnit: Stray witespace.\n\n\n> +        value.  Routes for LB VIPs are inserted in OVN IC SB DB with\n> +        <code>loadbalancer</code> value.  Routes learned from dynamic\n> routing\n> +        are inserted OVN IC SB DB with <code>connected-dynamic</code>\n> value.\n>\n\nnit: Missing \"in\".\n\n\n>          Next when route is learned to another AZ NB DB by ovn-ic, route\n> origin\n>          is synced to <ref table=\"Logical_Router_Static_Route\"\n> column=\"options\"\n>          key=\"origin\"/>.\n> diff --git a/ovn-nb.xml b/ovn-nb.xml\n> index f1cd89509..7324e8656 100644\n> --- a/ovn-nb.xml\n> +++ b/ovn-nb.xml\n> @@ -3533,6 +3533,13 @@ or\n>            Logical Switch.\n>          </p>\n>\n> +        <p>\n> +          If <code>hub-spoke</code> is in the list then northd will\n> synchronize\n> +          dynamic routes learned through OVN-IC from other routers into\n> the\n> +          <ref table=\"Advertised_Route\" db=\"OVN_Southbound\"/> table,\n> enabling\n> +          hub-and-spoke propagation.\n> +        </p>\n> +\n>          <p>\n>            This value can be overwritten on a per LRP basis using\n>            <ref column=\"options\" key=\"dynamic-routing-redistribute\"\n> @@ -4629,6 +4636,13 @@ or\n>            via shared Logical Switch.\n>          </p>\n>\n> +        <p>\n> +          If <code>hub-spoke</code> is in the list then northd will\n> synchronize\n> +          dynamic routes learned through OVN-IC from other routers into\n> the\n> +          <ref table=\"Advertised_Route\" db=\"OVN_Southbound\"/> table,\n> enabling\n> +          hub-and-spoke propagation.\n> +        </p>\n> +\n>          <p>\n>            If not set the value from <ref column=\"options\"\n>            key=\"dynamic-routing-redistribute\" table=\"Logical_Router\"/> on\n> the\n> diff --git a/tests/ovn-ic.at b/tests/ovn-ic.at\n> index 8bb5a4177..50270fdda 100644\n> --- a/tests/ovn-ic.at\n> +++ b/tests/ovn-ic.at\n> @@ -4692,3 +4692,104 @@ OVS_WAIT_FOR_OUTPUT([ovn_as az2 ovn-nbctl\n> lr-route-list lr12 | grep 192.168 |\n>  OVN_CLEANUP_IC([az1], [az2], [az3])\n>  AT_CLEANUP\n>  ])\n> +\n> +OVN_FOR_EACH_NORTHD([\n> +AT_SETUP([ovn-ic -- Check ovn-ic adv and learn from SB Learned Route -\n> hub and spoke mode])\n> +\n> +ovn_init_ic_db\n> +\n> +for i in 1 2; do\n> +    ovn_start az$i\n> +    ovn_as az$i\n> +\n> +    # Enable route learning at AZ level\n> +    check ovn-nbctl set nb_global . options:ic-route-learn=true\n> +    # Enable route advertising at AZ level\n> +    check ovn-nbctl set nb_global . options:ic-route-adv=true\n> +done\n> +\n> +# Create new transit switches and LRs. Test topology is next:\n> +#\n> +#\n> +# logical router (lr11) - transit switch (ts11) - logical router (lr12)\n> +#\n> +#\n> +\n> +# Create lr11, lr12 and ts11 and connect them\n> +for i in 1 2; do\n> +    ovn_as az$i\n> +\n> +    lr=lr1$i\n> +    check ovn-nbctl lr-add $lr\n> +\n> +    ts=ts11\n> +    check ovn-ic-nbctl --wait=sb --may-exist ts-add $ts\n> +\n> +    lrp=lrp-$lr-$ts\n> +    lsp=lsp-$ts-$lr\n> +    # Create LRP and connect to TS\n> +    check ovn-nbctl lrp-add $lr $lrp aa:aa:aa:aa:a1:0$i 169.254.101.$i/24\n> +    check ovn-nbctl lsp-add-router-port $ts $lsp $lrp\n> +done\n> +\n> +# Create directly-connected route in lr12\n> +check ovn_as az2 ovn-nbctl lrp-add lr12 lrp-lr12 aa:aa:aa:aa:bb:01 \"\n> 192.168.0.1/24\"\n> +OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl lr-route-list lr11 | grep\n> 192.168 |\n> +             grep learned | awk '{print $1, $2}' | sort ], [0], [dnl\n> +192.168.0.0/24 169.254.101.2\n> +])\n> +\n> +ovn_as az2\n> +check ovn-nbctl --wait=sb set Logical_Router lr12\n> option:dynamic-routing=true \\\n> +    option:dynamic-routing-redistribute=\"connected,static\"\n> +check ovn_as az2 ovn-nbctl --wait=sb lrp-add lr12 lr12-dr1\n> 00:00:00:00:ff:01 10.0.0.1/24\n> +dr1=$(fetch_column port_binding _uuid logical_port=lr12-dr1)\n> +datapath=$(fetch_column datapath_binding _uuid external_ids:name=lr12)\n> +\n> +check_uuid ovn-sbctl create Learned_Route \\\n> +    datapath=$datapath                    \\\n> +    logical_port=$dr1                     \\\n> +    ip_prefix=192.168.1.0/24              \\\n> +    nexthop=10.0.0.20\n> +\n> +wait_row_count ic-sb:Route 1 ip_prefix=192.168.1.0/24\n> origin=connected-dynamic\n> +\n> +# Check Learned_Route adv in ovn-ic\n> +OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl lr-route-list lr11 |\n> +             grep learned | awk '{print $1, $2}' | sort ], [0], [dnl\n> +10.0.0.0/24 169.254.101.2\n> +192.168.0.0/24 169.254.101.2\n> +192.168.1.0/24 169.254.101.2\n> +])\n> +\n> +ovn_as az1\n> +check ovn-nbctl --wait=sb set Logical_Router lr11\n> option:dynamic-routing=true \\\n> +    option:dynamic-routing-redistribute=\"connected,static\"\n> +# Advertise just 10.0.0.0/24 and 192.168.0.0/24 routes\n> +check_row_count Advertised_Route 1 ip_prefix=192.168.0.0/24\n> +check_row_count Advertised_Route 1 ip_prefix=10.0.0.0/24\n> +check_row_count Advertised_Route 0 ip_prefix=192.168.1.0/24\n> +\n> +\n> +ovn_as az1\n> +check ovn-nbctl --wait=sb set Logical_Router lr11 \\\n> +    option:dynamic-routing-redistribute=\"connected,static,hub-spoke\"\n> +# Advertise just 10.0.0.0/24, 192.168.0.0/24 and 192.168.1.0/24 routes\n> +# Route 192.168.1.0/24 is learned by DR from other logical routes (lr12)\n> +# And lr12 Advertised it in ovn-ic. Hub-spoke option enable re-routing in\n> lr11\n> +check_row_count Advertised_Route 1 ip_prefix=192.168.0.0/24\n> +check_row_count Advertised_Route 1 ip_prefix=10.0.0.0/24\n> +check_row_count Advertised_Route 1 ip_prefix=192.168.1.0/24\n> +\n> +ovn_as az1\n> +check ovn-nbctl --wait=sb set Logical_Router lr11 \\\n> +    option:dynamic-routing-redistribute=\"connected,static\"\n> +\n> +check_row_count Advertised_Route 1 ip_prefix=192.168.0.0/24\n> +check_row_count Advertised_Route 1 ip_prefix=10.0.0.0/24\n> +check_row_count Advertised_Route 0 ip_prefix=192.168.1.0/24\n> +\n> +OVN_CLEANUP_IC([az1], [az2])\n> +\n> +AT_CLEANUP\n> +])\n> --\n> 2.43.0\n>\n>\n> --\n>\n>\n>\n>\n> _'Esta mensagem é direcionada apenas para os endereços constantes no\n> cabeçalho inicial. Se você não está listado nos endereços constantes no\n> cabeçalho, pedimos-lhe que desconsidere completamente o conteúdo dessa\n> mensagem e cuja cópia, encaminhamento e/ou execução das ações citadas\n> estão\n> imediatamente anuladas e proibidas'._\n>\n>\n> * **'Apesar do Magazine Luiza tomar\n> todas as precauções razoáveis para assegurar que nenhum vírus esteja\n> presente nesse e-mail, a empresa não poderá aceitar a responsabilidade por\n> quaisquer perdas ou danos causados por esse e-mail ou por seus anexos'.*\n>\n>\n>\n> _______________________________________________\n> dev mailing list\n> dev@openvswitch.org\n> https://mail.openvswitch.org/mailman/listinfo/ovs-dev\n>\n>\nI addressed those comments and applied it to main.\n\nRegards,\nAles","headers":{"Return-Path":"<ovs-dev-bounces@openvswitch.org>","X-Original-To":["incoming@patchwork.ozlabs.org","dev@openvswitch.org"],"Delivered-To":["patchwork-incoming@legolas.ozlabs.org","ovs-dev@lists.linuxfoundation.org"],"Authentication-Results":["legolas.ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=PaIX0BVx;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=2605:bc80:3010::137; helo=smtp4.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)","smtp4.osuosl.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key)\n header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=PaIX0BVx","smtp4.osuosl.org; dmarc=pass (p=quarantine dis=none)\n header.from=redhat.com"],"Received":["from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fvwrb730rz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 14 Apr 2026 17:29:19 +1000 (AEST)","from localhost (localhost [127.0.0.1])\n\tby smtp4.osuosl.org (Postfix) with ESMTP id E0B41429D1;\n\tTue, 14 Apr 2026 07:29:17 +0000 (UTC)","from smtp4.osuosl.org ([127.0.0.1])\n by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id bFt3kdwiAJqR; Tue, 14 Apr 2026 07:29:16 +0000 (UTC)","from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56])\n\tby smtp4.osuosl.org (Postfix) with ESMTPS id 7A36C429CE;\n\tTue, 14 Apr 2026 07:29:16 +0000 (UTC)","from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id 44543C054A;\n\tTue, 14 Apr 2026 07:29:16 +0000 (UTC)","from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 605D6C0549\n for <dev@openvswitch.org>; Tue, 14 Apr 2026 07:29:15 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp4.osuosl.org (Postfix) with ESMTP id 4CFED429CE\n for <dev@openvswitch.org>; Tue, 14 Apr 2026 07:29:15 +0000 (UTC)","from smtp4.osuosl.org ([127.0.0.1])\n by localhost (smtp4.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id J1OueGUs0y7s for <dev@openvswitch.org>;\n Tue, 14 Apr 2026 07:29:13 +0000 (UTC)","from us-smtp-delivery-124.mimecast.com\n (us-smtp-delivery-124.mimecast.com [170.10.133.124])\n by smtp4.osuosl.org (Postfix) with ESMTPS id 17697429CF\n for <dev@openvswitch.org>; Tue, 14 Apr 2026 07:29:12 +0000 (UTC)","from mail-yw1-f197.google.com (mail-yw1-f197.google.com\n [209.85.128.197]) by relay.mimecast.com with ESMTP with STARTTLS\n (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id\n us-mta-208-8s3xQSJsNOmiSVORZIXcIQ-1; Tue, 14 Apr 2026 03:29:09 -0400","by mail-yw1-f197.google.com with SMTP id\n 00721157ae682-79064868702so118793457b3.3\n for <dev@openvswitch.org>; Tue, 14 Apr 2026 00:29:09 -0700 (PDT)"],"X-Virus-Scanned":["amavis at osuosl.org","amavis at osuosl.org"],"X-Comment":"SPF check N/A for local connections - client-ip=140.211.9.56;\n helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ","DKIM-Filter":["OpenDKIM Filter v2.11.0 smtp4.osuosl.org 7A36C429CE","OpenDKIM Filter v2.11.0 smtp4.osuosl.org 17697429CF"],"Received-SPF":"Pass (mailfrom) identity=mailfrom; client-ip=170.10.133.124;\n helo=us-smtp-delivery-124.mimecast.com; envelope-from=amusil@redhat.com;\n receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp4.osuosl.org 17697429CF","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1776151750;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n in-reply-to:in-reply-to:references:references;\n bh=BUnsaOknJRjUfrm68h/gm2mmw6tejg24X4rLr0aelCs=;\n b=PaIX0BVx2PmQcynCwTcBiB+a29EwzM/4Aw7P52LPMDZAJctGKD5HeLqbQbrgZ5ADhsOrnf\n k3IGQh3iTMdHGYSiwlbC7AbVd5Se2wwE7VCi2tuLpoVuNg1Un17BO+BszmIRfr2tYp5Rqc\n Y41Vq7zk77/yiEDXsgPRtiWUNsah680=","X-MC-Unique":"8s3xQSJsNOmiSVORZIXcIQ-1","X-Mimecast-MFC-AGG-ID":"8s3xQSJsNOmiSVORZIXcIQ_1776151748","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776151748; x=1776756548;\n h=cc:to:subject:message-id:date:from:in-reply-to:references\n :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=BUnsaOknJRjUfrm68h/gm2mmw6tejg24X4rLr0aelCs=;\n b=Ru1kAFIKGjAvOwXIvtJ5LNl4eYO1L06XAcr/vryS3TLgpaKnTv6Nwns6WQ2JHhw777\n njkWsiCYiRbnzu82owMc9ffvcfTjG9o+c2klXRVaWn5eJlzQYkfPtghEv8c8JkGKIQMA\n cFyHBrVhCSyVOgkLGVao/0QNeowJIdV4GxsDEhFoVXZvqqAPdEv//FiwW9EB8ss53iFJ\n Ewp+h2FN3R5z/qDo9OCTmOQ3OEdRVUNnoJvIXzKODWP+AQrM1hVc6a2e8jK9X9gBVdPN\n SNrx3lN0MBSBR2HoOrjoFgjJWa49B04KkfN6LqgSieBQ/Cl9TNdiEmpq5mtEzFdzQDRf\n 5GeA==","X-Gm-Message-State":"AOJu0Yx+TsJTEtWaiaKC9NANHrzfxWh5J5ySCZl37BA+ybFdQKfNMnH2\n UqkVFsd5wyZpzzOp1fLVKwH1psmCjNnxI/jcFmndtfCdjdxWY6O/sT5GNmP/2bzqDkSbAO7xXta\n eMfuhYMShNyfVkRWVzlM+LxVvFh6rN+qGN+VBwYd58XxBjqJZT3j16QkOWMiCu0KC8HuDixwRlV\n LGlrn8vwujKl1MqJqln9rK+dwD+7uC","X-Gm-Gg":"AeBDiesopt71qmkEC8nLslbTWJ02qJtL36QbX7mCsRSVwUdGH25T3iZfEs+CNc4CjFI\n qgFTE3Hxam9uJA4S5mn68HHeM0FALpXRuvLKmyAAxu4VkMlahhRqhM4EKvMC/KbUFg2+3FSi/Aw\n /OcXlEpK/6hTxWNcVBViprX7XVWW84+LY3/ENFRsEwDnni3rmoVWPp0gwqc4GOEQTFzRmQo+ile\n Cn5AJmsDxLe8uMFawPqr/h5UZuUl7WOupmqOl5g7pVqVo4Tv/6RO9G3u36Or9XSldZ87EPcty8S\n J66f+eC0PJI821VxlBo/WM7B6GlW9clJ7X7YdR97Jpw38BWJi2xntRzy34uV+2Q1E5LihCTvNCc\n xRBOVK1hfsu/4P59CB02MkwU3cxfoRSnEIEFRReSpwcsWSA==","X-Received":["by 2002:a05:690c:6e83:b0:7b2:64f4:a2dc with SMTP id\n 00721157ae682-7b264f4a686mr76930017b3.9.1776151748380;\n Tue, 14 Apr 2026 00:29:08 -0700 (PDT)","by 2002:a05:690c:6e83:b0:7b2:64f4:a2dc with SMTP id\n 00721157ae682-7b264f4a686mr76929907b3.9.1776151747689; Tue, 14 Apr 2026\n 00:29:07 -0700 (PDT)"],"MIME-Version":"1.0","References":"<20260413163645.1799533-1-lucas.vdias@luizalabs.com>","In-Reply-To":"<20260413163645.1799533-1-lucas.vdias@luizalabs.com>","Date":"Tue, 14 Apr 2026 09:28:55 +0200","X-Gm-Features":"AQROBzBjwL2363A41zPxyDSad5tMkCi8gxhF49bmZKpJCwQlqAqjihKMa4hVLdg","Message-ID":"\n <CALVEqe4z_yErJeq4BnwdreRhsN08CFRZDwPt8hV9smRkn9T8sw@mail.gmail.com>","To":"Lucas Vargas Dias <lucas.vdias@luizalabs.com>","Cc":"dev@openvswitch.org","X-Mimecast-Spam-Score":"0","X-Mimecast-MFC-PROC-ID":"0pm2k7Un3pGIZuMTLmp2rKlcCB4hyYSe4G0NPchd-D0_1776151748","X-Mimecast-Originator":"redhat.com","X-Content-Filtered-By":"Mailman/MimeDel 2.1.30","Subject":"Re: [ovs-dev] [PATCH ovn v4] northd,\n ic: Add hub-spoke options to adv DR routes learned in ovn-ic.","X-BeenThere":"ovs-dev@openvswitch.org","X-Mailman-Version":"2.1.30","Precedence":"list","List-Id":"<ovs-dev.openvswitch.org>","List-Unsubscribe":"<https://mail.openvswitch.org/mailman/options/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=unsubscribe>","List-Archive":"<http://mail.openvswitch.org/pipermail/ovs-dev/>","List-Post":"<mailto:ovs-dev@openvswitch.org>","List-Help":"<mailto:ovs-dev-request@openvswitch.org?subject=help>","List-Subscribe":"<https://mail.openvswitch.org/mailman/listinfo/ovs-dev>,\n <mailto:ovs-dev-request@openvswitch.org?subject=subscribe>","From":"Ales Musil via dev <ovs-dev@openvswitch.org>","Reply-To":"Ales Musil <amusil@redhat.com>","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"ovs-dev-bounces@openvswitch.org","Sender":"\"dev\" <ovs-dev-bounces@openvswitch.org>"}}]