On Thu, Apr 4, 2024 at 6:06 AM Dumitru Ceara <[email protected]> wrote:

> On 4/3/24 22:05, Vladislav Odintsov wrote:
> > re-sending email because ovs list rejected previous its content for some
> reason:
> >
> > Hi Ihar,
> >
>
> Hi Vladislav, Ihar,
>
> > thanks for your quick reaction!
> > I didn’t see mentioned thread, but I think that it is not safe enough to
> have automatic detection of this scenario here.
> >
> > Imagine: for VXLAN with HW VTEP scenario besides VXLAN encap one must
> configure also either GENEVE and/or STT encap(s) for HV chassis.
> >
> > So, detection could be implemented like this:
> > Check all non-VTEP chassis' encaps and find "effective encap" for each
> of them. If we detect at least one chassis with "effective encap" == vxlan,
> then enable vxlan mode. Normal mode otherwise.
> > "effective encap" means that for 'vxlan,geneve,stt' encaps effective is
> geneve, for 'vxlan,stt' -> stt, for 'vxlan' -> vxlan.
> > Such behavior was my first idea.
> >
> > But I decided that there possible flapping of modes if there is a
> problem/bug in deployment tooling and it is enough to have only one chassis
> with wrong encap set to affect vxlan mode for entire OVN cluster. Such mode
> flapping can result in problems with tunnel ids allocation.
>
> These are valid points.
>
>
This is a valid concern. Should it perhaps be handled in the general case
then? Meaning: calculate the max tunid once and store it in db? (I am
thinking that maybe recalculating the max_tunid on every engine cycle - or
on every controller restart - is unsafe?)


> > So it seems that to have an option that statically sets vxlan mode is
> more resilient.
>
> In general we try to avoid new config knobs.
> .
> > What do you think?
> >
>
> But in this case it make actually be easier if we offload the work of
> determining vxlan-mode to the CMS.
>
> >
> >> On 3 Apr 2024, at 20:43, Ihar Hrachyshka <[email protected]> wrote:
> >>
> >> Thank you Vladislav.
> >>
> >> FYI it was reported in the past in
> https://mail.openvswitch.org/pipermail/ovs-discuss/2022-July/051931.html
> but fell through cracks then. Thanks for picking it up!
> >>
> >> In your patch, you introduce a new config option to disable the
> 'vxlan-mode' behavior. This will definitely work. But I wonder if we can
> automatically detect this scenario by ignoring the chassis that are VTEP
> from consideration? I believe ovn-controller-vtep sets `is-vtep` in
> other_config, so - would it work if we modify is_vxlan_mode to consider it
> too?
> >>
> >> Thanks again for looking into this.
> >> Ihar
> >>
> >> On Wed, Apr 3, 2024 at 6:34 AM Vladislav Odintsov <[email protected]
> <mailto:[email protected]>> wrote:
> >>> Commit [1] introduced a "vxlan mode" concept.  It brought a limitation
> >>> for available tunnel IDs because of lack of space in VXLAN VNI.
> >>> In vxlan mode OVN is limited by 4095 datapaths (LRs or non-transit LSs)
> >>> and 2047 logical switch ports per datapath.
> >>>
> >>> Prior to this patch vxlan mode was enabled automatically if at least
> one
> >>> chassis had encap of vxlan type.  In scenarios where one want to use
> VXLAN
> >>> only for HW VTEP (RAMP) switch, such limitation makes no sence.
> >>>
> >>> This patch adds support for explicit disabling of vxlan mode via
> >>> Northbound database.
> >>>
> >>> 0: https://github.com/ovn-org/ovn/commit/b07f1bc3d068
> >>>
> >>> CC: Ihar Hrachyshka <[email protected] <mailto:[email protected]>>
> >>> Fixes: b07f1bc3d068 ("Add VXLAN support for non-VTEP datapath
> bindings")
> >>> Signed-off-by: Vladislav Odintsov <[email protected] <mailto:
> [email protected]>>
> >>> ---
> >>>  northd/en-global-config.c |  9 +++-
> >>>  northd/northd.c           | 90 ++++++++++++++++++---------------------
> >>>  northd/northd.h           |  6 ++-
> >>>  ovn-nb.xml                | 12 ++++++
> >>>  tests/ovn-northd.at <http://ovn-northd.at/>       | 29 +++++++++++++
> >>>  5 files changed, 94 insertions(+), 52 deletions(-)
> >>>
> >>> diff --git a/northd/en-global-config.c b/northd/en-global-config.c
> >>> index 34e393b33..9310c4575 100644
> >>> --- a/northd/en-global-config.c
> >>> +++ b/northd/en-global-config.c
> >>> @@ -115,8 +115,8 @@ en_global_config_run(struct engine_node *node ,
> void *data)
> >>>                       config_data->svc_monitor_mac);
> >>>      }
> >>>
> >>> -    char *max_tunid = xasprintf("%d",
> >>> -        get_ovn_max_dp_key_local(sbrec_chassis_table));
> >>> +    init_vxlan_mode(&nb->options, sbrec_chassis_table);
> >>> +    char *max_tunid = xasprintf("%d", get_ovn_max_dp_key_local());
> >>>      smap_replace(options, "max_tunid", max_tunid);
> >>>      free(max_tunid);
> >>>
> >>> @@ -523,6 +523,11 @@ check_nb_options_out_of_sync(const struct
> nbrec_nb_global *nb,
> >>>          return true;
> >>>      }
> >>>
> >>> +    if (config_out_of_sync(&nb->options, &config_data->nb_options,
> >>> +                           "disable_vxlan_mode", false)) {
> >>> +        return true;
> >>> +    }
> >>> +
> >>>      return false;
> >>>  }
> >>>
> >>> diff --git a/northd/northd.c b/northd/northd.c
> >>> index c568f6360..859b233e8 100644
> >>> --- a/northd/northd.c
> >>> +++ b/northd/northd.c
> >>> @@ -90,6 +90,10 @@ static bool use_ct_inv_match = true;
> >>>   */
> >>>  static bool default_acl_drop;
> >>>
> >>> +/* If this option is 'true' northd will use limited 24-bit space for
> datapath
> >>> + * and ports tunnel key allocation (12 bits for each instead of
> default 16). */
> >>> +static bool vxlan_mode;
> >>> +
> >>>  #define MAX_OVN_TAGS 4096
> >>>
> >>>
> >>> @@ -875,24 +879,31 @@ join_datapaths(const struct
> nbrec_logical_switch_table *nbrec_ls_table,
> >>>      }
> >>>  }
> >>>
> >>> -static bool
> >>> -is_vxlan_mode(const struct sbrec_chassis_table *sbrec_chassis_table)
> >>> +void
> >>> +init_vxlan_mode(const struct smap *nb_options,
> >>> +                const struct sbrec_chassis_table *sbrec_chassis_table)
> >>>  {
> >>> +    if (smap_get_bool(nb_options, "disable_vxlan_mode", false)) {
> >>> +        vxlan_mode = false;
> >>> +        return;
> >>> +    }
> >>> +
> >>>      const struct sbrec_chassis *chassis;
> >>>      SBREC_CHASSIS_TABLE_FOR_EACH (chassis, sbrec_chassis_table) {
> >>>          for (int i = 0; i < chassis->n_encaps; i++) {
> >>>              if (!strcmp(chassis->encaps[i]->type, "vxlan")) {
> >>> -                return true;
> >>> +                vxlan_mode = true;
> >>> +                return;
> >>>              }
> >>>          }
> >>>      }
> >>> -    return false;
> >>> +    vxlan_mode = false;
> >>>  }
> >>>
> >>>  uint32_t
> >>> -get_ovn_max_dp_key_local(const struct sbrec_chassis_table
> *sbrec_chassis_table)
> >>> +get_ovn_max_dp_key_local(void)
> >>>  {
> >>> -    if (is_vxlan_mode(sbrec_chassis_table)) {
> >>> +    if (vxlan_mode) {
> >>>          /* OVN_MAX_DP_GLOBAL_NUM doesn't apply for vxlan mode. */
> >>>          return OVN_MAX_DP_VXLAN_KEY;
> >>>      }
> >>> @@ -900,15 +911,14 @@ get_ovn_max_dp_key_local(const struct
> sbrec_chassis_table *sbrec_chassis_table)
> >>>  }
> >>>
> >>>  static void
> >>> -ovn_datapath_allocate_key(const struct sbrec_chassis_table
> *sbrec_ch_table,
> >>> -                          struct hmap *datapaths, struct hmap
> *dp_tnlids,
> >>> +ovn_datapath_allocate_key(struct hmap *datapaths, struct hmap
> *dp_tnlids,
> >>>                            struct ovn_datapath *od, uint32_t *hint)
> >>>  {
> >>>      if (!od->tunnel_key) {
> >>>          od->tunnel_key = ovn_allocate_tnlid(dp_tnlids, "datapath",
> >>> -                                    OVN_MIN_DP_KEY_LOCAL,
> >>> -
> get_ovn_max_dp_key_local(sbrec_ch_table),
> >>> -                                    hint);
> >>> +                                            OVN_MIN_DP_KEY_LOCAL,
> >>> +
> get_ovn_max_dp_key_local(),
> >>> +                                            hint);
> >>>          if (!od->tunnel_key) {
> >>>              if (od->sb) {
> >>>                  sbrec_datapath_binding_delete(od->sb);
> >>> @@ -921,7 +931,6 @@ ovn_datapath_allocate_key(const struct
> sbrec_chassis_table *sbrec_ch_table,
> >>>
> >>>  static void
> >>>  ovn_datapath_assign_requested_tnl_id(
> >>> -    const struct sbrec_chassis_table *sbrec_chassis_table,
> >>>      struct hmap *dp_tnlids, struct ovn_datapath *od)
> >>>  {
> >>>      const struct smap *other_config = (od->nbs
> >>> @@ -930,8 +939,7 @@ ovn_datapath_assign_requested_tnl_id(
> >>>      uint32_t tunnel_key = smap_get_int(other_config,
> "requested-tnl-key", 0);
> >>>      if (tunnel_key) {
> >>>          const char *interconn_ts = smap_get(other_config,
> "interconn-ts");
> >>> -        if (!interconn_ts && is_vxlan_mode(sbrec_chassis_table) &&
> >>> -            tunnel_key >= 1 << 12) {
> >>> +        if (!interconn_ts && vxlan_mode && tunnel_key >= 1 << 12) {
> >>>              static struct vlog_rate_limit rl =
> VLOG_RATE_LIMIT_INIT(1, 1);
> >>>              VLOG_WARN_RL(&rl, "Tunnel key %"PRIu32" for datapath %s
> is "
> >>>                           "incompatible with VXLAN", tunnel_key,
> >>> @@ -979,7 +987,6 @@ build_datapaths(struct ovsdb_idl_txn *ovnsb_txn,
> >>>                  const struct nbrec_logical_switch_table
> *nbrec_ls_table,
> >>>                  const struct nbrec_logical_router_table
> *nbrec_lr_table,
> >>>                  const struct sbrec_datapath_binding_table
> *sbrec_dp_table,
> >>> -                const struct sbrec_chassis_table *sbrec_chassis_table,
> >>>                  struct ovn_datapaths *ls_datapaths,
> >>>                  struct ovn_datapaths *lr_datapaths,
> >>>                  struct ovs_list *lr_list)
> >>> @@ -994,12 +1001,11 @@ build_datapaths(struct ovsdb_idl_txn *ovnsb_txn,
> >>>      struct hmap dp_tnlids = HMAP_INITIALIZER(&dp_tnlids);
> >>>      struct ovn_datapath *od;
> >>>      LIST_FOR_EACH (od, list, &both) {
> >>> -        ovn_datapath_assign_requested_tnl_id(sbrec_chassis_table,
> &dp_tnlids,
> >>> -                                             od);
> >>> +        ovn_datapath_assign_requested_tnl_id(&dp_tnlids, od);
> >>>      }
> >>>      LIST_FOR_EACH (od, list, &nb_only) {
> >>> -        ovn_datapath_assign_requested_tnl_id(sbrec_chassis_table,
> &dp_tnlids,
> >>> -                                             od); }
> >>> +        ovn_datapath_assign_requested_tnl_id(&dp_tnlids, od);
> >>> +    }
> >>>
> >>>      /* Keep nonconflicting tunnel IDs that are already assigned. */
> >>>      LIST_FOR_EACH (od, list, &both) {
> >>> @@ -1011,12 +1017,10 @@ build_datapaths(struct ovsdb_idl_txn
> *ovnsb_txn,
> >>>      /* Assign new tunnel ids where needed. */
> >>>      uint32_t hint = 0;
> >>>      LIST_FOR_EACH_SAFE (od, list, &both) {
> >>> -        ovn_datapath_allocate_key(sbrec_chassis_table,
> >>> -                                  datapaths, &dp_tnlids, od, &hint);
> >>> +        ovn_datapath_allocate_key(datapaths, &dp_tnlids, od, &hint);
> >>>      }
> >>>      LIST_FOR_EACH_SAFE (od, list, &nb_only) {
> >>> -        ovn_datapath_allocate_key(sbrec_chassis_table,
> >>> -                                  datapaths, &dp_tnlids, od, &hint);
> >>> +        ovn_datapath_allocate_key(datapaths, &dp_tnlids, od, &hint);
> >>>      }
> >>>
> >>>      /* Sync tunnel ids from nb to sb. */
> >>> @@ -3976,16 +3980,14 @@ ovn_port_add_tnlid(struct ovn_port *op,
> uint32_t tunnel_key)
> >>>   * that the I-P engine can fallback to recompute if needed; otherwise
> return
> >>>   * true (even if the key is not allocated). */
> >>>  static bool
> >>> -ovn_port_assign_requested_tnl_id(
> >>> -    const struct sbrec_chassis_table *sbrec_chassis_table, struct
> ovn_port *op)
> >>> +ovn_port_assign_requested_tnl_id(struct ovn_port *op)
> >>>  {
> >>>      const struct smap *options = (op->nbsp
> >>>                                    ? &op->nbsp->options
> >>>                                    : &op->nbrp->options);
> >>>      uint32_t tunnel_key = smap_get_int(options, "requested-tnl-key",
> 0);
> >>>      if (tunnel_key) {
> >>> -        if (is_vxlan_mode(sbrec_chassis_table) &&
> >>> -                tunnel_key >= OVN_VXLAN_MIN_MULTICAST) {
> >>> +        if (vxlan_mode && tunnel_key >= OVN_VXLAN_MIN_MULTICAST) {
> >>>              static struct vlog_rate_limit rl =
> VLOG_RATE_LIMIT_INIT(1, 1);
> >>>              VLOG_WARN_RL(&rl, "Tunnel key %"PRIu32" for port %s "
> >>>                           "is incompatible with VXLAN",
> >>> @@ -4005,12 +4007,10 @@ ovn_port_assign_requested_tnl_id(
> >>>  }
> >>>
> >>>  static bool
> >>> -ovn_port_allocate_key(const struct sbrec_chassis_table
> *sbrec_chassis_table,
> >>> -                      struct hmap *ports,
> >>> -                      struct ovn_port *op)
> >>> +ovn_port_allocate_key(struct hmap *ports, struct ovn_port *op)
> >>>  {
> >>>      if (!op->tunnel_key) {
> >>> -        uint8_t key_bits = is_vxlan_mode(sbrec_chassis_table)? 12 :
> 16;
> >>> +        uint8_t key_bits = vxlan_mode ? 12 : 16;
> >>>          op->tunnel_key = ovn_allocate_tnlid(&op->od->port_tnlids,
> "port",
> >>>                                              1, (1u << (key_bits - 1))
> - 1,
> >>>                                              &op->od->port_key_hint);
> >>> @@ -4035,7 +4035,6 @@ ovn_port_allocate_key(const struct
> sbrec_chassis_table *sbrec_chassis_table,
> >>>  static void
> >>>  build_ports(struct ovsdb_idl_txn *ovnsb_txn,
> >>>      const struct sbrec_port_binding_table *sbrec_port_binding_table,
> >>> -    const struct sbrec_chassis_table *sbrec_chassis_table,
> >>>      const struct sbrec_mirror_table *sbrec_mirror_table,
> >>>      const struct sbrec_mac_binding_table *sbrec_mac_binding_table,
> >>>      const struct sbrec_ha_chassis_group_table
> *sbrec_ha_chassis_group_table,
> >>> @@ -4069,10 +4068,10 @@ build_ports(struct ovsdb_idl_txn *ovnsb_txn,
> >>>      /* Assign explicitly requested tunnel ids first. */
> >>>      struct ovn_port *op;
> >>>      LIST_FOR_EACH (op, list, &both) {
> >>> -        ovn_port_assign_requested_tnl_id(sbrec_chassis_table, op);
> >>> +        ovn_port_assign_requested_tnl_id(op);
> >>>      }
> >>>      LIST_FOR_EACH (op, list, &nb_only) {
> >>> -        ovn_port_assign_requested_tnl_id(sbrec_chassis_table, op);
> >>> +        ovn_port_assign_requested_tnl_id(op);
> >>>      }
> >>>
> >>>      /* Keep nonconflicting tunnel IDs that are already assigned. */
> >>> @@ -4084,10 +4083,10 @@ build_ports(struct ovsdb_idl_txn *ovnsb_txn,
> >>>
> >>>      /* Assign new tunnel ids where needed. */
> >>>      LIST_FOR_EACH_SAFE (op, list, &both) {
> >>> -        ovn_port_allocate_key(sbrec_chassis_table, ports, op);
> >>> +        ovn_port_allocate_key(ports, op);
> >>>      }
> >>>      LIST_FOR_EACH_SAFE (op, list, &nb_only) {
> >>> -        ovn_port_allocate_key(sbrec_chassis_table, ports, op);
> >>> +        ovn_port_allocate_key(ports, op);
> >>>      }
> >>>
> >>>      /* For logical ports that are in both databases, update the
> southbound
> >>> @@ -4294,14 +4293,13 @@ ls_port_init(struct ovn_port *op, struct
> ovsdb_idl_txn *ovnsb_txn,
> >>>               struct hmap *ls_ports, struct ovn_datapath *od,
> >>>               const struct sbrec_port_binding *sb,
> >>>               const struct sbrec_mirror_table *sbrec_mirror_table,
> >>> -             const struct sbrec_chassis_table *sbrec_chassis_table,
> >>>               struct ovsdb_idl_index *sbrec_chassis_by_name,
> >>>               struct ovsdb_idl_index *sbrec_chassis_by_hostname)
> >>>  {
> >>>      op->od = od;
> >>>      parse_lsp_addrs(op);
> >>>      /* Assign explicitly requested tunnel ids first. */
> >>> -    if (!ovn_port_assign_requested_tnl_id(sbrec_chassis_table, op)) {
> >>> +    if (!ovn_port_assign_requested_tnl_id(op)) {
> >>>          return false;
> >>>      }
> >>>      if (sb) {
> >>> @@ -4318,7 +4316,7 @@ ls_port_init(struct ovn_port *op, struct
> ovsdb_idl_txn *ovnsb_txn,
> >>>          sbrec_port_binding_set_logical_port(op->sb, op->key);
> >>>      }
> >>>      /* Assign new tunnel ids where needed. */
> >>> -    if (!ovn_port_allocate_key(sbrec_chassis_table, ls_ports, op)) {
> >>> +    if (!ovn_port_allocate_key(ls_ports, op)) {
> >>>          return false;
> >>>      }
> >>>      ovn_port_update_sbrec(ovnsb_txn, sbrec_chassis_by_name,
> >>> @@ -4332,15 +4330,13 @@ ls_port_create(struct ovsdb_idl_txn
> *ovnsb_txn, struct hmap *ls_ports,
> >>>                 const char *key, const struct
> nbrec_logical_switch_port *nbsp,
> >>>                 struct ovn_datapath *od, const struct
> sbrec_port_binding *sb,
> >>>                 const struct sbrec_mirror_table *sbrec_mirror_table,
> >>> -               const struct sbrec_chassis_table *sbrec_chassis_table,
> >>>                 struct ovsdb_idl_index *sbrec_chassis_by_name,
> >>>                 struct ovsdb_idl_index *sbrec_chassis_by_hostname)
> >>>  {
> >>>      struct ovn_port *op = ovn_port_create(ls_ports, key, nbsp, NULL,
> >>>                                            NULL);
> >>>      hmap_insert(&od->ports, &op->dp_node,
> hmap_node_hash(&op->key_node));
> >>> -    if (!ls_port_init(op, ovnsb_txn, ls_ports, od, sb,
> >>> -                      sbrec_mirror_table, sbrec_chassis_table,
> >>> +    if (!ls_port_init(op, ovnsb_txn, ls_ports, od, sb,
> sbrec_mirror_table,
> >>>                        sbrec_chassis_by_name,
> sbrec_chassis_by_hostname)) {
> >>>          ovn_port_destroy(ls_ports, op);
> >>>          return NULL;
> >>> @@ -4357,7 +4353,6 @@ ls_port_reinit(struct ovn_port *op, struct
> ovsdb_idl_txn *ovnsb_txn,
> >>>                  struct ovn_datapath *od,
> >>>                  const struct sbrec_port_binding *sb,
> >>>                  const struct sbrec_mirror_table *sbrec_mirror_table,
> >>> -                const struct sbrec_chassis_table *sbrec_chassis_table,
> >>>                  struct ovsdb_idl_index *sbrec_chassis_by_name,
> >>>                  struct ovsdb_idl_index *sbrec_chassis_by_hostname)
> >>>  {
> >>> @@ -4365,8 +4360,7 @@ ls_port_reinit(struct ovn_port *op, struct
> ovsdb_idl_txn *ovnsb_txn,
> >>>      op->sb = sb;
> >>>      ovn_port_set_nb(op, nbsp, nbrp);
> >>>      op->l3dgw_port = op->cr_port = NULL;
> >>> -    return ls_port_init(op, ovnsb_txn, ls_ports, od, sb,
> >>> -                        sbrec_mirror_table, sbrec_chassis_table,
> >>> +    return ls_port_init(op, ovnsb_txn, ls_ports, od, sb,
> sbrec_mirror_table,
> >>>                          sbrec_chassis_by_name,
> sbrec_chassis_by_hostname);
> >>>  }
> >>>
> >>> @@ -4511,7 +4505,6 @@ ls_handle_lsp_changes(struct ovsdb_idl_txn
> *ovnsb_idl_txn,
> >>>              op = ls_port_create(ovnsb_idl_txn, &nd->ls_ports,
> >>>                                  new_nbsp->name, new_nbsp, od, NULL,
> >>>                                  ni->sbrec_mirror_table,
> >>> -                                ni->sbrec_chassis_table,
> >>>                                  ni->sbrec_chassis_by_name,
> >>>                                  ni->sbrec_chassis_by_hostname);
> >>>              if (!op) {
> >>> @@ -4543,7 +4536,6 @@ ls_handle_lsp_changes(struct ovsdb_idl_txn
> *ovnsb_idl_txn,
> >>>              if (!ls_port_reinit(op, ovnsb_idl_txn, &nd->ls_ports,
> >>>                                  new_nbsp, NULL,
> >>>                                  od, sb, ni->sbrec_mirror_table,
> >>> -                                ni->sbrec_chassis_table,
> >>>                                  ni->sbrec_chassis_by_name,
> >>>                                  ni->sbrec_chassis_by_hostname)) {
> >>>                  goto fail;
> >>> @@ -17300,11 +17292,12 @@ ovnnb_db_run(struct northd_input *input_data,
> >>>      use_common_zone = smap_get_bool(input_data->nb_options,
> "use_common_zone",
> >>>                                      false);
> >>>
> >>> +    init_vxlan_mode(input_data->nb_options,
> input_data->sbrec_chassis_table);
> >>> +
> >>>      build_datapaths(ovnsb_txn,
> >>>                      input_data->nbrec_logical_switch_table,
> >>>                      input_data->nbrec_logical_router_table,
> >>>                      input_data->sbrec_datapath_binding_table,
> >>> -                    input_data->sbrec_chassis_table,
> >>>                      &data->ls_datapaths,
> >>>                      &data->lr_datapaths, &data->lr_list);
> >>>      build_lb_datapaths(input_data->lbs, input_data->lbgrps,
> >>> @@ -17312,7 +17305,6 @@ ovnnb_db_run(struct northd_input *input_data,
> >>>                         &data->lb_datapaths_map,
> &data->lb_group_datapaths_map);
> >>>      build_ports(ovnsb_txn,
> >>>                  input_data->sbrec_port_binding_table,
> >>> -                input_data->sbrec_chassis_table,
> >>>                  input_data->sbrec_mirror_table,
> >>>                  input_data->sbrec_mac_binding_table,
> >>>                  input_data->sbrec_ha_chassis_group_table,
> >>> diff --git a/northd/northd.h b/northd/northd.h
> >>> index 5e9fa4745..ed9d992fb 100644
> >>> --- a/northd/northd.h
> >>> +++ b/northd/northd.h
> >>> @@ -788,6 +788,10 @@ lr_has_multiple_gw_ports(const struct
> ovn_datapath *od)
> >>>      return od->n_l3dgw_ports > 1 && !od->is_gw_router;
> >>>  }
> >>>
> >>> -uint32_t get_ovn_max_dp_key_local(const struct sbrec_chassis_table *);
> >>> +void
> >>> +init_vxlan_mode(const struct smap *nb_options,
> >>> +                const struct sbrec_chassis_table
> *sbrec_chassis_table);
> >>> +
> >>> +uint32_t get_ovn_max_dp_key_local(void);
> >>>
> >>>  #endif /* NORTHD_H */
> >>> diff --git a/ovn-nb.xml b/ovn-nb.xml
> >>> index b652046a7..9b2cb355e 100644
> >>> --- a/ovn-nb.xml
> >>> +++ b/ovn-nb.xml
> >>> @@ -381,6 +381,18 @@
> >>>          of SB changes would be very noticeable.
> >>>        </column>
> >>>
> >>> +      <column name="options" key="disable_vxlan_mode">
> >>> +        Be default if at least one chassis in OVN cluster has VXLAN
> encap,
> >>> +        northd will run in a `vxlan mode`, which means it splits
> 24-bit
> >>> +        VXLAN VNI for datapath and port tunnel IDs allocation
> evenly.  Maximum
> >>> +        datapaths count in this mode is 4095 and maximum ports per
> datapath is
> >>> +        2047.  Rest of IDs are used for multicast groups.
> >>> +        In case VXLAN encaps are needed on chassis only to support HW
> VTEP
> >>> +        functionality, and main encap type is GENEVE or STT, set this
> option to
> >>> +        `false` to use defaults -- 16-bit space for datapath tunnel
> IDS and 15
> >>> +        bits for port tunnel IDs.
> >>> +      </column>
> >>> +
>
> Let's also add a NEWS entry for this one.  It's quite an important
> user-visible change.
>
> >>>        <group title="Options for configuring interconnection route
> advertisement">
> >>>          <p>
> >>>            These options control how routes are advertised between OVN
> >>> diff --git a/tests/ovn-northd.at <http://ovn-northd.at/> b/tests/
> ovn-northd.at <http://ovn-northd.at/>
> >>> index cd53755b2..f5d025852 100644
> >>> --- a/tests/ovn-northd.at <http://ovn-northd.at/>
> >>> +++ b/tests/ovn-northd.at <http://ovn-northd.at/>
> >>> @@ -2819,6 +2819,35 @@ AT_CHECK(
> >>>  get_tunnel_keys
> >>>  AT_CHECK([test $lsp02 = 3 && test $ls1 = 123])
> >>>
> >>> +AT_CLEANUP
> >>> +])
> >>> +OVN_FOR_EACH_NORTHD_NO_HV([
> >>> +AT_SETUP([check vxlan mode disabling])
> >>> +ovn_start
> >>> +
> >>> +# Create a fake chassis with vxlan encap to implicitly enable vxlan
> mode.
> >>> +ovn-sbctl \
> >>> +    --id=@e create encap chassis_name=hv1 ip="192.168.0.1"
> type="vxlan" \
> >>> +    -- --id=@c create chassis name=hv1 encaps=@e
> >>> +
> >>> +cmd="ovn-nbctl --wait=sb"
> >>> +for i in {1..4097..1}; do
> >>> +    cmd="${cmd} -- ls-add lsw-${i}"
> >>> +done
> >>> +
> >>> +eval $cmd
> >>> +
> >>> +check_row_count nb:Logical_Switch 4097
> >>> +wait_row_count sb:Datapath_Binding 4095
> >>> +
> >>> +OVS_WAIT_UNTIL([grep "all datapath tunnel ids exhausted"
> northd/ovn-northd.log])
> >>> +
> >>> +# Explicitly disable vxlan mode and check that two remaining
> datapaths were created.
> >>> +check ovn-nbctl set NB_Global . options:disable_vxlan_mode=true
> >>> +
> >>> +check_row_count nb:Logical_Switch 4097
> >>> +wait_row_count sb:Datapath_Binding 4097
> >>> +
> >>>  AT_CLEANUP
> >>>  ])
> >>>
> >>> --
> >>> 2.44.0
> >>>
> >
> >
> > Regards,
> > Vladislav Odintsov
>
> Regards,
> Dumitru
>
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to