On Fri, Apr 10, 2026 at 1:22 PM Lucas Vargas Dias <[email protected]>
wrote:

>
>
> Em sex., 10 de abr. de 2026 às 08:07, Lucas Vargas Dias <
> [email protected]> escreveu:
>
>> Hi Ales
>>
>> Thanks for your review.
>>
>>
>> Em sex., 10 de abr. de 2026 às 06:06, Ales Musil <[email protected]>
>> escreveu:
>>
>>>
>>>
>>> On Tue, Feb 3, 2026 at 9:24 PM Lucas Vargas Dias via dev <
>>> [email protected]> wrote:
>>>
>>>> Consider the scenario where there are 2 AZs using ovn-ic, each AZ has
>>>> one LR and its LS. The LRs are interconnected by a transit switch.
>>>> On each AZ, we can configure the dynamic routing and exchange routes
>>>> via BGP with external BGP speakers.
>>>>
>>>> AZ1
>>>> LS1 - LR1 - BGP Speaker1 - Local subnet1
>>>>        \
>>>>    -----------------------
>>>>     transit switch
>>>>    -----------------------
>>>> AZ2    /
>>>> LS2 - LR2 - BGP Speaker2 - Local subnet2
>>>>
>>>> The LR2 will learn the subnet1 prefix via ovn-ic but this prefix will
>>>> not be redistributed to BGP Speaker2 and it also happens with LR1.
>>>> This scenario uses the network's hub-and-spoke terminology where we can
>>>> enable the hub-spoke on the LR for such redistribution.
>>>> subnet1 and subnet2 are configured as ic-source-dynamic=true in ovn-ic.
>>>> Also, consider the same scenario, but LR1 and LR2 learn the same subnet
>>>> for redundancy, hub-spoke option is disabled to not adv the subnet
>>>> learned
>>>> from BGP and advertised in ovn-ic in BGP speakers.
>>>>
>>>> Signed-off-by: Lucas Vargas Dias <[email protected]>
>>>> ---
>>>>
>>>
>>> Hi Lucas,
>>>
>>> sorry for the delay. I have a few comments down below. It also needs a
>>> rebase.
>>>
>>>
>>>>  NEWS                              |  6 ++
>>>>  ic/ovn-ic.c                       | 28 +++++++---
>>>>  northd/en-advertised-route-sync.c |  3 +
>>>>  northd/northd.c                   | 10 +++-
>>>>  northd/northd.h                   |  5 +-
>>>>  northd/ovn-northd.c               |  1 -
>>>>  ovn-nb.xml                        | 21 +++++++
>>>>  tests/ovn-ic.at                   | 92 +++++++++++++++++++++++++++++++
>>>>  8 files changed, 156 insertions(+), 10 deletions(-)
>>>>
>>>> diff --git a/NEWS b/NEWS
>>>> index 2a2b5e12d..6002820f3 100644
>>>> --- a/NEWS
>>>> +++ b/NEWS
>>>> @@ -40,6 +40,8 @@ Post v25.09.0
>>>>       * Add the "options:dynamic-routing-no-learning" to Logical
>>>> Routers ports.
>>>>         If set to true, router port will not learn routes and will
>>>> forget
>>>>         learned routes. This option has priority over its router
>>>> counterpart.
>>>> +     * Add support for hub-and-spoke propagation via the "hub-spoke"
>>>> option
>>>> +       in dynamic-routing-redistribute settings.
>>>>     - Add support for Network Function insertion in OVN with stateful
>>>> traffic
>>>>       redirection capability in Logical Switch datapath. The feature
>>>> introduces
>>>>       three new NB database tables:
>>>> @@ -98,6 +100,10 @@ Post v25.09.0
>>>>       reserving an unused IP from the backend's subnet. This change
>>>> allows
>>>>       using LRP IPs directly, eliminating the need to reserve
>>>> additional IPs
>>>>       per backend port.
>>>> +   - Add the external_ids:ic-source-dynamic key for
>>>> +     Logical_Router_Static_Route to indicate whether a learned OVN-IC
>>>> route
>>>> +     originated from dynamic routing sources in the advertising
>>>> availability
>>>> +     zone.
>>>>
>>>>  OVN v25.09.0 - xxx xx xxxx
>>>>  --------------------------
>>>> diff --git a/ic/ovn-ic.c b/ic/ovn-ic.c
>>>> index fd5ecefb3..e9fff2d4d 100644
>>>> --- a/ic/ovn-ic.c
>>>> +++ b/ic/ovn-ic.c
>>>> @@ -1283,6 +1283,7 @@ struct ic_route_info {
>>>>      struct in6_addr prefix;
>>>>      unsigned int plen;
>>>>      struct in6_addr nexthop;
>>>> +    bool is_src_dynamic;
>>>>      const char *origin;
>>>>      const char *route_table;
>>>>      const char *route_tag;
>>>> @@ -1554,7 +1555,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 is_src_dynamic)
>>>>  {
>>>>      ovs_assert(nb_route || nb_lrp || nb_lb || nb_lr);
>>>>
>>>> @@ -1573,6 +1574,7 @@ add_to_routes_ad(struct hmap *routes_ad, const
>>>> struct in6_addr prefix,
>>>>          ic_route->nb_route = nb_route;
>>>>          ic_route->origin = origin;
>>>>          ic_route->route_table = route_table;
>>>> +        ic_route->is_src_dynamic = is_src_dynamic;
>>>>          ic_route->nb_lrp = nb_lrp;
>>>>          ic_route->nb_lr = nb_lr;
>>>>          ic_route->nb_lb = nb_lb;
>>>> @@ -1649,7 +1651,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, false);
>>>>  }
>>>>
>>>>  static void
>>>> @@ -1659,7 +1661,8 @@ add_network_to_routes_ad(struct hmap *routes_ad,
>>>> const char *network,
>>>>                           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 struct nbrec_logical_router_port
>>>> *ts_lrp,
>>>> +                         bool is_src_dynamic)
>>>>  {
>>>>      struct in6_addr prefix, nexthop;
>>>>      unsigned int plen;
>>>> @@ -1711,7 +1714,8 @@ add_network_to_routes_ad(struct hmap *routes_ad,
>>>> const char *network,
>>>>
>>>>      /* directly-connected routes go to <main> route table */
>>>>      add_to_routes_ad(routes_ad, prefix, plen, nexthop,
>>>> ROUTE_ORIGIN_CONNECTED,
>>>> -                     NULL, nb_lrp, NULL, nb_lr, NULL, route_tag);
>>>> +                     NULL, nb_lrp, NULL, nb_lr, NULL, route_tag,
>>>> +                     is_src_dynamic);
>>>>  }
>>>>
>>>>  static void
>>>> @@ -1769,7 +1773,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);
>>>>  }
>>>> @@ -2187,6 +2191,12 @@ sync_learned_routes(struct ic_context *ctx,
>>>>
>>>>  nbrec_logical_router_static_route_update_options_setkey(
>>>>                      nb_route, "origin", isb_route->origin);
>>>>                  free(uuid_s);
>>>> +                bool is_src_dynamic =
>>>> smap_get_bool(&isb_route->external_ids,
>>>> +                    "ic-source-dynamic", false);
>>>> +                char *ic_source_dynamic_str = is_src_dynamic ?
>>>> +                    "true" : "false";
>>>> +
>>>> nbrec_logical_router_static_route_update_external_ids_setkey(
>>>> +                    nb_route, "ic-source-dynamic",
>>>> ic_source_dynamic_str);
>>>>
>>>
>>> This is never updated for existing routes, should we do that too?
>>>
>>
>> I forgot this for the existing routes.
>>
>>
>
> Even using the  new origin (ROUTE_ORIGIN_CONNECTED_DYNAMIC), do you think
> it is necessary to fill the external_ids?
>

If we use origin, it's already there, so it shouldn't be needed.


>
>>
>>>
>>>>
>>>>  nbrec_logical_router_update_static_routes_addvalue(ic_lr->lr,
>>>>                      nb_route);
>>>>              }
>>>> @@ -2243,6 +2253,10 @@ ad_route_sync_external_ids(const struct
>>>> ic_route_info *route_adv,
>>>>                                                       "ic-route-tag");
>>>>          }
>>>>      }
>>>> +
>>>> +    char *ic_src_dynamic_str = route_adv->is_src_dynamic ? "true" :
>>>> "false";
>>>> +    icsbrec_route_update_external_ids_setkey(isb_route,
>>>> "ic-source-dynamic",
>>>> +                                             ic_src_dynamic_str);
>>>>  }
>>>>
>>>>  /* Sync routes from routes_ad to IC-SB. */
>>>> @@ -2372,7 +2386,7 @@ 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);
>>>> +                                         lr, route_tag, ts_lrp, false);
>>>>              }
>>>>          } else {
>>>>              /* The router port of the TS port is ignored. */
>>>> @@ -2427,7 +2441,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);
>>>> +                                 lr, route_tag, ts_lrp, true);
>>>>      }
>>>>      sbrec_learned_route_index_destroy_row(filter);
>>>>  }
>>>> diff --git a/northd/en-advertised-route-sync.c
>>>> b/northd/en-advertised-route-sync.c
>>>> index be771391d..be046769f 100644
>>>> --- a/northd/en-advertised-route-sync.c
>>>> +++ b/northd/en-advertised-route-sync.c
>>>> @@ -675,6 +675,8 @@ should_advertise_route(const struct uuidset
>>>> *host_route_lrps,
>>>>          return drr_mode_NAT_is_set(drr);
>>>>      case ROUTE_SOURCE_LB:
>>>>          return drr_mode_LB_is_set(drr);
>>>> +    case ROUTE_SOURCE_IC_DYNAMIC:
>>>> +        return drr_mode_IC_DYNAMIC_is_set(drr);
>>>>      case ROUTE_SOURCE_LEARNED:
>>>>          OVS_NOT_REACHED();
>>>>      default:
>>>> @@ -745,6 +747,7 @@ advertise_route_track_od(struct
>>>> advertised_route_sync_data *data,
>>>>                             &tracked_op->od->nbr->header_.uuid);
>>>>          }
>>>>          break;
>>>> +    case ROUTE_SOURCE_IC_DYNAMIC:
>>>>      case ROUTE_SOURCE_CONNECTED:
>>>>      case ROUTE_SOURCE_STATIC:
>>>>          break;
>>>> diff --git a/northd/northd.c b/northd/northd.c
>>>> index b4bb4ba6d..fbb75533c 100644
>>>> --- a/northd/northd.c
>>>> +++ b/northd/northd.c
>>>> @@ -870,6 +870,10 @@ parse_dynamic_routing_redistribute(
>>>>              out |= DRRM_LB;
>>>>              continue;
>>>>          }
>>>> +        if (!strcmp(token, "hub-spoke")) {
>>>> +            out |= DRRM_IC_DYNAMIC;
>>>> +            continue;
>>>> +        }
>>>>          static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 1);
>>>>          VLOG_WARN_RL(&rl,
>>>>                       "unknown dynamic-routing-redistribute option '%s'
>>>> on %s",
>>>> @@ -12034,7 +12038,10 @@ parsed_routes_add_static(const struct
>>>> ovn_datapath *od,
>>>>      enum route_source source;
>>>>      if (!strcmp(smap_get_def(&route->options, "origin", ""),
>>>>                  ROUTE_ORIGIN_CONNECTED)) {
>>>> -        source = ROUTE_SOURCE_CONNECTED;
>>>> +        bool ic_src_dynamic = smap_get_bool(&route->external_ids,
>>>> +                                            "ic-source-dynamic",
>>>> false);
>>>> +        source = ic_src_dynamic ?
>>>> +                 ROUTE_SOURCE_IC_DYNAMIC : ROUTE_SOURCE_CONNECTED;
>>>>      } else {
>>>>          source = ROUTE_SOURCE_STATIC;
>>>>      }
>>>> @@ -12129,6 +12136,7 @@ route_source_to_offset(enum route_source source)
>>>>  {
>>>>      switch (source) {
>>>>      case ROUTE_SOURCE_CONNECTED:
>>>> +    case ROUTE_SOURCE_IC_DYNAMIC:
>>>>          return ROUTE_PRIO_OFFSET_CONNECTED;
>>>>      case ROUTE_SOURCE_STATIC:
>>>>          return ROUTE_PRIO_OFFSET_STATIC;
>>>> diff --git a/northd/northd.h b/northd/northd.h
>>>> index eb5c15f34..e6ed2cc3e 100644
>>>> --- a/northd/northd.h
>>>> +++ b/northd/northd.h
>>>> @@ -372,7 +372,8 @@ struct mcast_port_info {
>>>>      DRR_MODE(CONNECTED_AS_HOST, 1) \
>>>>      DRR_MODE(STATIC,            2) \
>>>>      DRR_MODE(NAT,               3) \
>>>> -    DRR_MODE(LB,                4)
>>>> +    DRR_MODE(LB,                4) \
>>>> +    DRR_MODE(IC_DYNAMIC,        5)
>>>>
>>>>  enum dynamic_routing_redistribute_mode_bits {
>>>>  #define DRR_MODE(PROTOCOL, BIT) DRRM_##PROTOCOL##_BIT = BIT,
>>>> @@ -826,6 +827,8 @@ enum route_source {
>>>>      ROUTE_SOURCE_NAT,
>>>>      /* The route is derived from a LB's VIP. */
>>>>      ROUTE_SOURCE_LB,
>>>> +    /* The route is derived from an ovn-controller and advertised to
>>>> IC. */
>>>> +    ROUTE_SOURCE_IC_DYNAMIC,
>>>>  };
>>>>
>>>>  struct parsed_route {
>>>> diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c
>>>> index 7d7568c6f..bc3969053 100644
>>>> --- a/northd/ovn-northd.c
>>>> +++ b/northd/ovn-northd.c
>>>> @@ -905,7 +905,6 @@ main(int argc, char *argv[])
>>>>          &nbrec_load_balancer_col_external_ids,
>>>>          &nbrec_load_balancer_health_check_col_external_ids,
>>>>          &nbrec_logical_router_policy_col_external_ids,
>>>> -        &nbrec_logical_router_static_route_col_external_ids,
>>>>
>>>
>>> This is very dangerous, it means that any change
>>> of external_ids will wake up northd. I think it will be safer
>>> to make it an option as we track those already.
>>>
>>> On a second thought and looking through the
>>> is there a reason why we can't just add another origin?
>>> We check the origin anyway in northd, so having
>>> something like:
>>>
>>> #define ROUTE_ORIGIN_CONNECTED_DYNAMIC "connected-dynamic"
>>>
>>> That would avoid the tracking of external_ids, extra definiton
>>> of an option and would be probably smaller change in the
>>> ovn-ic overall, WDYT?
>>>
>>
>> I agree, we can add a new origin. I'll adjust.
>>
>>
>>
>>>
>>>          &nbrec_meter_col_external_ids,
>>>>          &nbrec_meter_band_col_external_ids,
>>>>          &nbrec_mirror_col_external_ids,
>>>> diff --git a/ovn-nb.xml b/ovn-nb.xml
>>>> index 1acbf202b..5f9b47491 100644
>>>> --- a/ovn-nb.xml
>>>> +++ b/ovn-nb.xml
>>>> @@ -3374,6 +3374,13 @@ or
>>>>            Logical Switch.
>>>>          </p>
>>>>
>>>> +        <p>
>>>> +          If <code>hub-spoke</code> is in the list then northd will
>>>> synchronize
>>>> +          dynamic routes learned through OVN-IC from other routers
>>>> into the
>>>> +          <ref table="Advertised_Route" db="OVN_Southbound"/> table,
>>>> enabling
>>>> +          hub-and-spoke propagation.
>>>> +        </p>
>>>> +
>>>>          <p>
>>>>            This value can be overwritten on a per LRP basis using
>>>>            <ref column="options" key="dynamic-routing-redistribute"
>>>> @@ -4461,6 +4468,13 @@ or
>>>>            via shared Logical Switch.
>>>>          </p>
>>>>
>>>> +        <p>
>>>> +          If <code>hub-spoke</code> is in the list then northd will
>>>> synchronize
>>>> +          dynamic routes learned through OVN-IC from other routers
>>>> into the
>>>> +          <ref table="Advertised_Route" db="OVN_Southbound"/> table,
>>>> enabling
>>>> +          hub-and-spoke propagation.
>>>> +        </p>
>>>> +
>>>>          <p>
>>>>            If not set the value from <ref column="options"
>>>>            key="dynamic-routing-redistribute" table="Logical_Router"/>
>>>> on the
>>>> @@ -4823,6 +4837,13 @@ or
>>>>        database.
>>>>      </column>
>>>>
>>>> +    <column name="external_ids" key="ic-source-dynamic">
>>>> +      <code>ovn-ic</code> populates this key for routes learned from
>>>> +      <ref db="OVN_IC_Southbound"/>. The value is <code>true</code> if
>>>> the
>>>> +      learned route originated from dynamic sources (e.g. learned
>>>> routes)
>>>> +      in the advertising availability zone, otherwise
>>>> <code>false</code>.
>>>> +    </column>
>>>> +
>>>>      <group title="Common Columns">
>>>>        <column name="external_ids">
>>>>          See <em>External IDs</em> at the beginning of this document.
>>>> diff --git a/tests/ovn-ic.at b/tests/ovn-ic.at
>>>> index 370a755be..a62d02da0 100644
>>>> --- a/tests/ovn-ic.at
>>>> +++ b/tests/ovn-ic.at
>>>> @@ -4586,3 +4586,95 @@ OVN_CLEANUP_IC([az1], [az2])
>>>>
>>>>  AT_CLEANUP
>>>>  ])
>>>> +
>>>> +
>>>> +OVN_FOR_EACH_NORTHD([
>>>> +AT_SETUP([ovn-ic -- Check ovn-ic adv and learn from SB Learned Route -
>>>> hub and spoke mode])
>>>> +
>>>> +ovn_init_ic_db
>>>> +
>>>> +for i in 1 2; do
>>>> +    ovn_start az$i
>>>> +    ovn_as az$i
>>>> +
>>>> +    # Enable route learning at AZ level
>>>> +    check ovn-nbctl set nb_global . options:ic-route-learn=true
>>>> +    # Enable route advertising at AZ level
>>>> +    check ovn-nbctl set nb_global . options:ic-route-adv=true
>>>> +done
>>>> +
>>>> +# Create new transit switches and LRs. Test topology is next:
>>>> +#
>>>> +#
>>>> +# logical router (lr11) - transit switch (ts11) - logical router (lr12)
>>>> +#
>>>> +#
>>>> +
>>>> +# Create lr11, lr12 and ts11 and connect them
>>>> +for i in 1 2; do
>>>> +    ovn_as az$i
>>>> +
>>>> +    lr=lr1$i
>>>> +    check ovn-nbctl lr-add $lr
>>>> +
>>>> +    ts=ts11
>>>> +    check ovn-ic-nbctl --wait=sb --may-exist ts-add $ts
>>>> +
>>>> +    lrp=lrp-$lr-$ts
>>>> +    lsp=lsp-$ts-$lr
>>>> +    # Create LRP and connect to TS
>>>> +    check ovn-nbctl lrp-add $lr $lrp aa:aa:aa:aa:a1:0$i
>>>> 169.254.101.$i/24
>>>> +    check ovn-nbctl lsp-add-router-port $ts $lsp $lrp
>>>> +done
>>>> +
>>>> +# Create directly-connected route in lr12
>>>> +check ovn_as az2 ovn-nbctl lrp-add lr12 lrp-lr12 aa:aa:aa:aa:bb:01 "
>>>> 192.168.0.1/24"
>>>> +OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl lr-route-list lr11 | grep
>>>> 192.168 |
>>>> +             grep learned | awk '{print $1, $2}' | sort ], [0], [dnl
>>>> +192.168.0.0/24 169.254.101.2
>>>> +])
>>>> +
>>>> +ovn_as az2
>>>> +check ovn-nbctl --wait=sb set Logical_Router lr12
>>>> option:dynamic-routing=true \
>>>> +    option:dynamic-routing-redistribute="connected,static"
>>>> +check ovn_as az2 ovn-nbctl --wait=sb lrp-add lr12 lr12-dr1
>>>> 00:00:00:00:ff:01 10.0.0.1/24
>>>> +dr1=$(fetch_column port_binding _uuid logical_port=lr12-dr1)
>>>> +datapath=$(fetch_column datapath_binding _uuid external_ids:name=lr12)
>>>> +
>>>> +check_uuid ovn-sbctl create Learned_Route \
>>>> +    datapath=$datapath                    \
>>>> +    logical_port=$dr1                     \
>>>> +    ip_prefix=192.168.1.0/24              \
>>>> +    nexthop=10.0.0.20
>>>> +
>>>> +# Check Learned_Route adv in ovn-ic
>>>> +OVS_WAIT_FOR_OUTPUT([ovn_as az1 ovn-nbctl lr-route-list lr11 |
>>>> +             grep learned | awk '{print $1, $2}' | sort ], [0], [dnl
>>>> +10.0.0.0/24 169.254.101.2
>>>> +192.168.0.0/24 169.254.101.2
>>>> +192.168.1.0/24 169.254.101.2
>>>> +])
>>>> +
>>>> +ovn_as az1
>>>> +check ovn-nbctl --wait=sb set Logical_Router lr11
>>>> option:dynamic-routing=true \
>>>> +    option:dynamic-routing-redistribute="connected,static"
>>>> +# Advertise just 10.0.0.0/24 and 192.168.0.0/24 routes
>>>> +check_row_count Advertised_Route 1 ip_prefix=192.168.0.0/24
>>>> +check_row_count Advertised_Route 1 ip_prefix=10.0.0.0/24
>>>> +check_row_count Advertised_Route 0 ip_prefix=192.168.1.0/24
>>>> +
>>>> +
>>>> +ovn_as az1
>>>> +check ovn-nbctl --wait=sb set Logical_Router lr11 \
>>>> +    option:dynamic-routing-redistribute="connected,static,hub-spoke"
>>>> +# Advertise just 10.0.0.0/24, 192.168.0.0/24 and 192.168.1.0/24 routes
>>>> +# Route 192.168.1.0/24 is learned by DR from other logical routes
>>>> (lr12)
>>>> +# And lr12 Advertised it in ovn-ic. Hub-spoke option enable re-routing
>>>> in lr11
>>>> +check_row_count Advertised_Route 1 ip_prefix=192.168.0.0/24
>>>> +check_row_count Advertised_Route 1 ip_prefix=10.0.0.0/24
>>>> +check_row_count Advertised_Route 1 ip_prefix=192.168.1.0/24
>>>> +
>>>>
>>>
>>> I would add an extra check that removed the hub-spoke again just to be
>>> sure.
>>>
>>
>> I agree
>>
>>
>>>
>>>
>>>> +OVN_CLEANUP_IC([az1], [az2])
>>>> +
>>>> +AT_CLEANUP
>>>> +])
>>>> --
>>>> 2.43.0
>>>>
>>>>
>>>> --
>>>>
>>>>
>>>>
>>>>
>>>> _'Esta mensagem é direcionada apenas para os endereços constantes no
>>>> cabeçalho inicial. Se você não está listado nos endereços constantes no
>>>> cabeçalho, pedimos-lhe que desconsidere completamente o conteúdo dessa
>>>> mensagem e cuja cópia, encaminhamento e/ou execução das ações citadas
>>>> estão
>>>> imediatamente anuladas e proibidas'._
>>>>
>>>>
>>>> * **'Apesar do Magazine Luiza tomar
>>>> todas as precauções razoáveis para assegurar que nenhum vírus esteja
>>>> presente nesse e-mail, a empresa não poderá aceitar a responsabilidade
>>>> por
>>>> quaisquer perdas ou danos causados por esse e-mail ou por seus anexos'.*
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> dev mailing list
>>>> [email protected]
>>>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>>>>
>>>>
>>> Regards,
>>> Ales
>>>
>>
>
> *‘Esta mensagem é direcionada apenas para os endereços constantes no
> cabeçalho inicial. Se você não está listado nos endereços constantes no
> cabeçalho, pedimos-lhe que desconsidere completamente o conteúdo dessa
> mensagem e cuja cópia, encaminhamento e/ou execução das ações citadas estão
> imediatamente anuladas e proibidas’.*
>
>  *‘Apesar do Magazine Luiza tomar todas as precauções razoáveis para
> assegurar que nenhum vírus esteja presente nesse e-mail, a empresa não
> poderá aceitar a responsabilidade por quaisquer perdas ou danos causados
> por esse e-mail ou por seus anexos’.*
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to