[{"id":3676702,"web_url":"http://patchwork.ozlabs.org/comment/3676702/","msgid":"<CACAUutO-pci+fG7KF_1a_ofJY1gZtHDikHFJrn1Fdymg-Qd1+A@mail.gmail.com>","list_archive_url":null,"date":"2026-04-13T12:19:15","subject":"Re: [ovs-dev] [PATCH ovn v3] northd,\n ic: Add hub-spoke options to adv DR routes learned in ovn-ic.","submitter":{"id":90169,"url":"http://patchwork.ozlabs.org/api/people/90169/","name":"Lucas Vargas Dias","email":"lucas.vdias@luizalabs.com"},"content":"I'll send a new patch updating the origin from the existing routes.\n\nEm seg., 13 de abr. de 2026 às 09:08, Lucas Vargas Dias <\nlucas.vdias@luizalabs.com> escreveu:\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>  NEWS                              |  2 +\n>  ic/ovn-ic.c                       | 22 ++++---\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                   | 99 +++++++++++++++++++++++++++++++\n>  11 files changed, 156 insertions(+), 19 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>     - 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..d224d37f7 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>      const char *origin;\n>      const char *route_table;\n>      const char *route_tag;\n> @@ -1565,7 +1566,7 @@ add_to_routes_ad(struct hmap *routes_ad, const\n> struct in6_addr prefix,\n>                   const struct nbrec_logical_router_static_route *nb_route,\n>                   const struct nbrec_logical_router *nb_lr,\n>                   const struct nbrec_load_balancer *nb_lb,\n> -                 const char *route_tag)\n> +                 const char *route_tag, bool is_src_dynamic)\n>  {\n>      ovs_assert(nb_route || nb_lrp || nb_lb || nb_lr);\n>\n> @@ -1585,6 +1586,7 @@ add_to_routes_ad(struct hmap *routes_ad, const\n> struct in6_addr prefix,\n>          ic_route->nb_route = nb_route;\n>          ic_route->origin = origin;\n>          ic_route->route_table = route_table;\n> +        ic_route->is_src_dynamic = is_src_dynamic;\n>          ic_route->nb_lrp = nb_lrp;\n>          ic_route->nb_lr = nb_lr;\n>          ic_route->nb_lb = nb_lb;\n> @@ -1661,7 +1663,7 @@ add_static_to_routes_ad(\n>\n>      add_to_routes_ad(routes_ad, prefix, plen, nexthop,\n> ROUTE_ORIGIN_STATIC,\n>                       nb_route->route_table, NULL, nb_route, nb_lr,\n> -                     NULL, route_tag);\n> +                     NULL, route_tag, false);\n>  }\n>\n>  static void\n> @@ -1671,7 +1673,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,9 +1724,12 @@ 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> -                     NULL, nb_lrp, NULL, nb_lr, NULL, route_tag);\n> +    add_to_routes_ad(routes_ad, prefix, plen, nexthop, origin,\n> +                     NULL, nb_lrp, NULL, nb_lr, NULL, route_tag,\n> +                     is_src_dynamic);\n>  }\n>\n>  static void\n> @@ -1781,7 +1787,7 @@ add_lb_vip_to_routes_ad(struct hmap *routes_ad,\n> const char *vip_key,\n>\n>      /* Lb vip routes go to <main> route table */\n>      add_to_routes_ad(routes_ad, vip_ip, plen, nexthop, ROUTE_ORIGIN_LB,\n> -                     NULL, NULL, NULL, nb_lr, nb_lb, route_tag);\n> +                     NULL, NULL, NULL, nb_lr, nb_lb, route_tag, false);\n>  out:\n>      free(vip_str);\n>  }\n> @@ -2374,7 +2380,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 +2435,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>      } 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>          &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> +        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>          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..3c7ad8055 100644\n> --- a/tests/ovn-ic.at\n> +++ b/tests/ovn-ic.at\n> @@ -4692,3 +4692,102 @@ 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> +# 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>","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=luizalabs.com header.i=@luizalabs.com\n header.a=rsa-sha256 header.s=google header.b=Bc+emW4I;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=openvswitch.org\n (client-ip=2605:bc80:3010::136; helo=smtp3.osuosl.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=patchwork.ozlabs.org)","smtp3.osuosl.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key,\n unprotected) header.d=luizalabs.com header.i=@luizalabs.com\n header.a=rsa-sha256 header.s=google header.b=Bc+emW4I","smtp4.osuosl.org; dmarc=pass (p=quarantine dis=none)\n header.from=luizalabs.com","smtp4.osuosl.org; dkim=pass (1024-bit key,\n unprotected) header.d=luizalabs.com header.i=@luizalabs.com\n header.a=rsa-sha256 header.s=google header.b=Bc+emW4I"],"Received":["from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136])\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 4fvRL03zSmz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 13 Apr 2026 22:19:36 +1000 (AEST)","from localhost (localhost [127.0.0.1])\n\tby smtp3.osuosl.org (Postfix) with ESMTP id 3DB9E61034;\n\tMon, 13 Apr 2026 12:19:34 +0000 (UTC)","from smtp3.osuosl.org ([127.0.0.1])\n by localhost (smtp3.osuosl.org [127.0.0.1]) (amavis, port 10024) with ESMTP\n id 6vn8hFnUoBux; Mon, 13 Apr 2026 12:19:32 +0000 (UTC)","from lists.linuxfoundation.org (lf-lists.osuosl.org\n [IPv6:2605:bc80:3010:104::8cd3:938])\n\tby smtp3.osuosl.org (Postfix) with ESMTPS id 69B4860DE3;\n\tMon, 13 Apr 2026 12:19:32 +0000 (UTC)","from lf-lists.osuosl.org (localhost [127.0.0.1])\n\tby lists.linuxfoundation.org (Postfix) with ESMTP id 3630CC054A;\n\tMon, 13 Apr 2026 12:19:32 +0000 (UTC)","from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137])\n by lists.linuxfoundation.org (Postfix) with ESMTP id 259EAC0549\n for <dev@openvswitch.org>; Mon, 13 Apr 2026 12:19:31 +0000 (UTC)","from localhost (localhost [127.0.0.1])\n by smtp4.osuosl.org (Postfix) with ESMTP id 230E94208D\n for <dev@openvswitch.org>; Mon, 13 Apr 2026 12:19:31 +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 oGLqRA1C7qqa for <dev@openvswitch.org>;\n Mon, 13 Apr 2026 12:19:28 +0000 (UTC)","from mail-oi1-x232.google.com (mail-oi1-x232.google.com\n [IPv6:2607:f8b0:4864:20::232])\n by smtp4.osuosl.org (Postfix) with ESMTPS id 5D39C4202C\n for <dev@openvswitch.org>; Mon, 13 Apr 2026 12:19:28 +0000 (UTC)","by mail-oi1-x232.google.com with SMTP id\n 5614622812f47-471618e20a5so2214435b6e.1\n for <dev@openvswitch.org>; Mon, 13 Apr 2026 05:19:28 -0700 (PDT)"],"X-Virus-Scanned":["amavis at osuosl.org","amavis at osuosl.org"],"X-Comment":"SPF check N/A for local connections -\n client-ip=2605:bc80:3010:104::8cd3:938; helo=lists.linuxfoundation.org;\n envelope-from=ovs-dev-bounces@openvswitch.org; receiver=<UNKNOWN> ","DKIM-Filter":["OpenDKIM Filter v2.11.0 smtp3.osuosl.org 69B4860DE3","OpenDKIM Filter v2.11.0 smtp4.osuosl.org 5D39C4202C"],"Received-SPF":"Pass (mailfrom) identity=mailfrom;\n client-ip=2607:f8b0:4864:20::232; helo=mail-oi1-x232.google.com;\n envelope-from=lucas.vdias@luizalabs.com; receiver=<UNKNOWN>","DMARC-Filter":"OpenDMARC Filter v1.4.2 smtp4.osuosl.org 5D39C4202C","ARC-Seal":"i=1; a=rsa-sha256; t=1776082767; cv=none;\n d=google.com; s=arc-20240605;\n b=NvNgTtFJoO3WR1ynzeDLql5nmnnKc/4kd8PgzUvHO8Fm+dPFYsRMs8qg9rf5jmnxJ1\n dqGFgtdeTH5TpY3j7C2/lqNpqoS3IHftUGo/m/JgvZdNA2N+X6HG2iGEzSYP0cIjKHhg\n toD0BR5rg6KQjLGhTAvCwgDgV53g943oeek7tIS9BKjNHAXKwmOn2Z3aqX2Y4aMDkRxH\n BOzpFGG5OY5Sjr8ik2lWkNpNjny8iL92EWPkM/8Ls+YNfiNkpEqh4QS18Ic/yHbI+lzE\n xUhA90HkjBosLYrvDBIKzfFLOksViqj7CGGPKy+0SfmOqpTZ6lbCLAp/PSiVuDB/xTe7\n p3VQ==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n s=arc-20240605;\n h=to:subject:message-id:date:from:in-reply-to:references:mime-version\n :dkim-signature;\n bh=5S9hv1Fo4LrpLkVpWstSi5Uw09eHKztTA79sFcLYt64=;\n fh=WnO6tfRXfzNkmVvpHWPU0Sn0nugAh6D8VsZG77w0RnY=;\n b=BZ5jx7oDeSHrPF36WTQ0wzx2sXJXRCjnirx9XcddTzJ8qkYCmqJNFQQC8Tfl73d/HO\n cAnFOqN/7d1nJLPYys1FvjCBuZQjyAr07PZJpGXQDd4HDsHNUdajD5o6S6n1rV5dv+Ar\n mxr9CTRpk3QmmXdAG77krJmAMD0Cvcao8NoXLiof2/wE9P4UtO4MCQGuVeCribyAR5S6\n L3ImjB/erWyHYGZjL/ymIjaDB6hZFravW2mzJhkfuRwi600EdTmjd7lEH6ke5LiqzHe/\n MI0m24RfqeUQ6I3Q8BVrZ7GBWpngwM8FWH7HF2/oyu1l5AC/UOhBDIANF6tGDLkp7vkF\n 3D7w==; darn=openvswitch.org","ARC-Authentication-Results":"i=1; mx.google.com; arc=none","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=luizalabs.com; s=google; t=1776082767; x=1776687567; darn=openvswitch.org;\n h=to:subject:message-id:date:from:in-reply-to:references:mime-version\n :from:to:cc:subject:date:message-id:reply-to;\n bh=5S9hv1Fo4LrpLkVpWstSi5Uw09eHKztTA79sFcLYt64=;\n b=Bc+emW4IzZ229FR7kUIKRJOHSNpUFfclbcksCLBLZOn13gpiQyRXpYKRrFd/CrvFUt\n /dvH1/ZTPtrLriZxrg7a4D/cOVh46jeR995bKPfC8AkcHItljpmLLXMVGTj/V3t2e0vI\n vy/+6WQCh49hnhJa94bBPmYehx7K9dMv9p3r8=","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1776082767; x=1776687567;\n h=to:subject:message-id:date:from:in-reply-to:references:mime-version\n :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id\n :reply-to;\n bh=5S9hv1Fo4LrpLkVpWstSi5Uw09eHKztTA79sFcLYt64=;\n b=q3NOKq7JYCHV1TUd0mZkiqHsRRH90O0DWSkLoWeYdR0LBNCuZzIwJX8L47hBARHVpS\n 9R/ura5PPXfi4MIVGcSnRemicXG75gP/ocqeJZyTPDQfjhT4kntN3xH+rW83Cpw5oj7s\n VGejne6uOsnTkFuDroY8LqsBHfbgvftmjfW9MUtP7hvpjyPa5f0wy4xCU+OIs+Rl2VKj\n o6iJs2WDWwyrsXCwck8zwvu+nS65D0reZH8LK+xQH79cmV143LWdi5eER1PxTn97tHHN\n ef8H8tjbb4DDbkytsjMtvY2d63666sbzrkrL9Z98VUFpS5DgTbrwbrA6QSVeWhaIMGi6\n 2kww==","X-Gm-Message-State":"AOJu0YyOpjUdU2GhNbZKPCeA2ilg1nYwEvDMNfcbxn1xzgOUL5Tv2NVm\n ipSLkXVIUFBWK5k/2XmuAYnRIo25Yf8zyH8pjfSpTdAuw9tsJO3zHwFy9SxCPPOIpRKXJ6v9rWc\n F1JUwuzedXluglySbfcb8qGLdzCb+l2hgqjFxRdDYyqLzuQ3tjJOBA7r99jwBKUtOzgNNMEgPcR\n 5f+VdgOLxXLzoh7JwxNi9CCNbMvt9b8lp7","X-Gm-Gg":"AeBDiet8T7uLzUqGrot+KUNSknKxDf4R4VMcPRxPNp41EiulrbYTStjkn710JgirXeM\n 5xQB+RkhDBH4bDqJxzXButUu/GMu9mlQ7455VjvP29/bqmuxBlrvY59anp+wrfnBg60r34/xZBn\n UGO9ZSxV1n64GKVAIUkm9G+EI4ow6VQvR9dP4skK1B3gr/UEzRBPQDllX5VHgQkYo/DCot7D5nq\n dH9pVFiSvPfzZ6avqIJEZbrvLJyqskeRn5yr83sabSVuKj6pQRBCw5f8E1MjT9mv0WOxlFzIorL\n vKt08uoH/Q==","X-Received":"by 2002:a05:6808:c1a6:b0:455:daf0:9998 with SMTP id\n 5614622812f47-4789f507bb1mr6663126b6e.41.1776082766616; Mon, 13 Apr 2026\n 05:19:26 -0700 (PDT)","MIME-Version":"1.0","References":"<20260413120827.59614-1-lucas.vdias@luizalabs.com>","In-Reply-To":"<20260413120827.59614-1-lucas.vdias@luizalabs.com>","Date":"Mon, 13 Apr 2026 09:19:15 -0300","X-Gm-Features":"AQROBzBD1Zq5FW1zJZfLkSe6AQVdnyZCrJNR77uVU29GPS4bfy12sp8msUZij6c","Message-ID":"\n <CACAUutO-pci+fG7KF_1a_ofJY1gZtHDikHFJrn1Fdymg-Qd1+A@mail.gmail.com>","To":"dev@openvswitch.org","X-Content-Filtered-By":"Mailman/MimeDel 2.1.30","Subject":"Re: [ovs-dev] [PATCH ovn v3] 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":"Lucas Vargas Dias via dev <ovs-dev@openvswitch.org>","Reply-To":"Lucas Vargas Dias <lucas.vdias@luizalabs.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>"}}]