On Thu, Jun 6, 2024 at 1:27 AM Vladislav Odintsov <[email protected]> wrote:

> Thanks Mark for such a detailed answer!
>
> I agree with your points, and also was thinking about them, but could not
> value their importance in terms of I-P logic. You helped with that.
>
> I’d prefer to apply my proposal to revert back to “bool is_vxlan_mode()”
> to make the “global” a true global. Will submit v6.
>
>
Happy we are doing it. Mark is more eloquent than me. :)


> regards,
> Vladislav Odintsov
>
> > On 5 Jun 2024, at 23:13, Mark Michelson <[email protected]> wrote:
> >
> > On 6/5/24 08:51, Vladislav Odintsov wrote:
> >> Hi Mark,
> >> Thanks for the review!
> >> Please, see below.
> >> regards,
> >>  Vladislav Odintsov
> >> -----Original Message-----
> >> From: Mark Michelson <[email protected]>
> >> Date: Tuesday, 4 June 2024 at 03:45
> >> To: Vladislav Odintsov <[email protected]>, <[email protected]>
> >> Subject: Re: [ovs-dev] [PATCH ovn v5 1/2] northd: Make `vxlan_mode` a
> global variable.
> >>     Hi Vladislav,
> >>     Generally speaking, I agree with this change. However, I think that
> >>     setting a global variable from an incremental processing engine node
> >>     runner feels wrong.
> >> The init_vxlan_mode() is called inside the en_global_config_run() only
> to
> >> initialize global value, which is then read by
> get_ovn_max_dp_key_local() to
> >> fill the "max_tunid" variable inside incremental processing engine node.
> >> Which drawbacks do you see of such variable initialization?
> >
> > The biggest drawbacks are:
> > * Reasoning about "ownership" of the vxlan_mode global variable
> > * Maintenance of the en_global_config I-P engine node.
> >
> > On the first point, since vxlan_mode is a global variable in northd.c,
> it's not obvious that the owner of this data is the en_global_config engine
> node. It's an easy mistake for someone to reference the variable before it
> has been initialized, for instance. However, if the boolean is on the
> ed_type_global_config struct, then it's clear to see that this data is
> scoped to the en_global_config engine node.
> >
> > On the second point, if someone were to overhaul the en_global_config
> engine node, it would be an easy mistake to make to not notice that
> vxlan_mode is being set by the engine node. I could see a developer
> splitting the node into separate nodes, for instance. In doing so, the
> developer could easily miss that the global vxlan_mode is being set by the
> engine node, since it's hidden behind an init_ function call. However,
> placing vxlan_mode on the ed_type_global_config makes it more clear that
> the en_global_config engine node is responsible for setting the value.
>
> >
> >>     I think that instead, the "vxlan_mode" variable you have introduced
> >>     should be a field on struct ed_type_global_config. This way, the
> engine
> >>     node is only modifying data local to itself.
> >> I guess, that moving this to the struct ed_type_global_config will make
> the code
> >> a bit more complex: we have to pass this variable through all function
> calls to
> >> be able to read vxlan_mode value inside
> ovn_datapath_assign_requested_tnl_id(),
> >> ovn_port_assign_requested_tnl_id() and ovn_port_allocate_key().
> >
> > I think dependency injection makes the code easier to read, understand,
> and maintain rather than making it more complex. It's clearer that the data
> from the en_global_config engine node is needed in all of the functions you
> listed if those functions require an ed_type_global_config argument.
> >
> >> Apart of this, the "vxlan_mode" variable has the same "global" meaning
> as
> >> "use_ct_inv_match", "check_lsp_is_up", "use_common_zone" and other
> global
> >> variables, which configure the global OVN behaviour. The difference is
> that it
> >> is required to read its value inside the en_global_config_run() to
> reflect the
> >> max_tunid back to NB_Global.
> >
> > Personally, I don't like those global variables either :)
> >
> > But those globals are also set within northd.c, and are initialized at
> the begining of a DB run. From the perspective of northd processing, they
> are truly "global" in their scope. The engine nodes form a dependency tree,
> and so it's important that data that is scoped to a particular node is
> housed in that engine node's data. This way, when nodes are being created,
> it's clear to know which other engine nodes they depend on. If engine nodes
> are setting global variables, then it becomes harder to understand the
> dependencies.
> >> If the global variable setting is totally not acceptable from engine
> node, I
> >> can propose another approach here. Revert init_vxlan_mode() back to
> >> `bool is_vxlan_mode()` and assign global variable outside of global
> engine node:
> >> diff --git a/northd/en-global-config.c b/northd/en-global-config.c
> >> index 873649a89..df0f8e58c 100644
> >> --- a/northd/en-global-config.c
> >> +++ b/northd/en-global-config.c
> >> @@ -115,8 +115,9 @@ en_global_config_run(struct engine_node *node ,
> void *data)
> >>                       config_data->svc_monitor_mac);
> >>      }
> >>  -    init_vxlan_mode(sbrec_chassis_table);
> >> -    char *max_tunid = xasprintf("%d", get_ovn_max_dp_key_local());
> >> +    char *max_tunid = xasprintf("%d",
> >> +                                get_ovn_max_dp_key_local(
> >> +
> is_vxlan_mode(sbrec_chassis_table)));
> >>      smap_replace(options, "max_tunid", max_tunid);
> >>      free(max_tunid);
> >>  diff --git a/northd/northd.c b/northd/northd.c
> >> index 0e0ae24db..9ac608f03 100644
> >> --- a/northd/northd.c
> >> +++ b/northd/northd.c
> >> @@ -885,25 +885,24 @@ join_datapaths(const struct
> nbrec_logical_switch_table *nbrec_ls_table,
> >>      }
> >>  }
> >>  -void
> >> -init_vxlan_mode(const struct sbrec_chassis_table *sbrec_chassis_table)
> >> +bool
> >> +is_vxlan_mode(const struct sbrec_chassis_table *sbrec_chassis_table)
> >>  {
> >>      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")) {
> >> -                vxlan_mode = true;
> >> -                return;
> >> +                return true;
> >>              }
> >>          }
> >>      }
> >> -    vxlan_mode = false;
> >> +    return false;
> >>  }
> >>    uint32_t
> >> -get_ovn_max_dp_key_local(void)
> >> +get_ovn_max_dp_key_local(bool _vxlan_mode)
> >>  {
> >> -    if (vxlan_mode) {
> >> +    if (_vxlan_mode) {
> >>          /* OVN_MAX_DP_GLOBAL_NUM doesn't apply for VXLAN mode. */
> >>          return OVN_MAX_DP_VXLAN_KEY;
> >>      }
> >> @@ -916,9 +915,7 @@ ovn_datapath_allocate_key(struct hmap *datapaths,
> struct hmap *dp_tnlids,
> >>  {
> >>      if (!od->tunnel_key) {
> >>          od->tunnel_key = ovn_allocate_tnlid(dp_tnlids, "datapath",
> >> -                                            OVN_MIN_DP_KEY_LOCAL,
> >> -                                            get_ovn_max_dp_key_local(),
> >> -                                            hint);
> >> +            OVN_MIN_DP_KEY_LOCAL,
> get_ovn_max_dp_key_local(vxlan_mode), hint);
> >>          if (!od->tunnel_key) {
> >>              if (od->sb) {
> >>                  sbrec_datapath_binding_delete(od->sb);
> >> @@ -17596,7 +17593,7 @@ 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->sbrec_chassis_table);
> >> +    vxlan_mode = is_vxlan_mode(input_data->sbrec_chassis_table);
> >>        build_datapaths(ovnsb_txn,
> >>                      input_data->nbrec_logical_switch_table,
> >> diff --git a/northd/northd.h b/northd/northd.h
> >> index be480003e..c613652e9 100644
> >> --- a/northd/northd.h
> >> +++ b/northd/northd.h
> >> @@ -791,9 +791,9 @@ lr_has_multiple_gw_ports(const struct ovn_datapath
> *od)
> >>      return od->n_l3dgw_ports > 1 && !od->is_gw_router;
> >>  }
> >>  -void
> >> -init_vxlan_mode(const struct sbrec_chassis_table *sbrec_chassis_table);
> >> +bool
> >> +is_vxlan_mode(const struct sbrec_chassis_table *sbrec_chassis_table);
> >>  -uint32_t get_ovn_max_dp_key_local(void);
> >> +uint32_t get_ovn_max_dp_key_local(bool);
> >>    #endif /* NORTHD_H */
> >> What do you think?
> >> Or, maybe I totally misunderstood your idea here, please correct me if
> yes.
> >
> > I think this idea is better than what is in the current patch. It also
> allows for you to add the NB global data as an argument to is_vxlan_mode()
> in patch 2 so that you can factor that into the decision about whether
> vxlan mode is enabled.
> >
> > The potential upside to caching a boolean is that you don't have to
> repeatedly walk the SB chassis table to determine if vxlan mode is enabled.
>
> This change was an intended potential performance enhancement by not only
> to avoid iterations over all chassises, but also to avoid doing this
> multiple times from mentioned functions.
> Though I didn’t do any performance testing, because it was not the concern.
>
> > I have no idea if this is actually a performance concern, though. Since
> northd performance tests have not yet shown this to be a bottleneck, I
> think your alternate proposal of keeping is_vxlan_mode() is the best
> approach.
> >
> >>     On 5/3/24 04:13, Vladislav Odintsov wrote:
> >>     > This simplifies code and subsequent commit to explicitely disable
> VXLAN
> >>     > mode is based on these changes.
> >>     >
> >>     > Also "VXLAN mode" term is introduced in ovn-architecture man page.
> >>     >
> >>     > Signed-off-by: Vladislav Odintsov <[email protected]>
> >>     > ---
> >>     >   northd/en-global-config.c |  4 +-
> >>     >   northd/northd.c           | 85
> +++++++++++++++++----------------------
> >>     >   northd/northd.h           |  5 ++-
> >>     >   ovn-architecture.7.xml    | 10 ++---
> >>     >   4 files changed, 47 insertions(+), 57 deletions(-)
> >>     >
> >>     > diff --git a/northd/en-global-config.c b/northd/en-global-config.c
> >>     > index 28c78a12c..873649a89 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(sbrec_chassis_table);
> >>     > +    char *max_tunid = xasprintf("%d",
> get_ovn_max_dp_key_local());
> >>     >       smap_replace(options, "max_tunid", max_tunid);
> >>     >       free(max_tunid);
> >>     >
> >>     > diff --git a/northd/northd.c b/northd/northd.c
> >>     > index 133cddb69..0e0ae24db 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
> >>     >
> >>     >
> >>     > @@ -881,40 +885,40 @@ 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 sbrec_chassis_table
> *sbrec_chassis_table)
> >>     >   {
> >>     >       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)) {
> >>     > -        /* OVN_MAX_DP_GLOBAL_NUM doesn't apply for vxlan mode. */
> >>     > +    if (vxlan_mode) {
> >>     > +        /* OVN_MAX_DP_GLOBAL_NUM doesn't apply for VXLAN mode. */
> >>     >           return OVN_MAX_DP_VXLAN_KEY;
> >>     >       }
> >>     >       return OVN_MAX_DP_KEY - OVN_MAX_DP_GLOBAL_NUM;
> >>     >   }
> >>     >
> >>     >   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);
> >>     > @@ -927,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
> >>     > @@ -936,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,
> >>     > @@ -985,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)
> >>     > @@ -1000,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) {
> >>     > @@ -1017,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. */
> >>     > @@ -3982,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",
> >>     > @@ -4011,11 +4007,10 @@ ovn_port_assign_requested_tnl_id(
> >>     >   }
> >>     >
> >>     >   static bool
> >>     > -ovn_port_allocate_key(const struct sbrec_chassis_table
> *sbrec_chassis_table,
> >>     > -                      struct ovn_port *op)
> >>     > +ovn_port_allocate_key(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 +4030,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 +4063,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,14 +4078,14 @@ build_ports(struct ovsdb_idl_txn
> *ovnsb_txn,
> >>     >
> >>     >       /* Assign new tunnel ids where needed. */
> >>     >       LIST_FOR_EACH_SAFE (op, list, &both) {
> >>     > -        if (!ovn_port_allocate_key(sbrec_chassis_table, op)) {
> >>     > +        if (!ovn_port_allocate_key(op)) {
> >>     >               sbrec_port_binding_delete(op->sb);
> >>     >               ovs_list_remove(&op->list);
> >>     >               ovn_port_destroy(ports, op);
> >>     >           }
> >>     >       }
> >>     >       LIST_FOR_EACH_SAFE (op, list, &nb_only) {
> >>     > -        if (!ovn_port_allocate_key(sbrec_chassis_table, op)) {
> >>     > +        if (!ovn_port_allocate_key(op)) {
> >>     >               ovs_list_remove(&op->list);
> >>     >               ovn_port_destroy(ports, op);
> >>     >           }
> >>     > @@ -4303,14 +4297,13 @@ ls_port_init(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)
> >>     >   {
> >>     >       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;
> >>     >       }
> >>     >       /* Keep nonconflicting tunnel IDs that are already
> assigned. */
> >>     > @@ -4320,7 +4313,7 @@ ls_port_init(struct ovn_port *op, struct
> ovsdb_idl_txn *ovnsb_txn,
> >>     >           }
> >>     >       }
> >>     >       /* Assign new tunnel ids where needed. */
> >>     > -    if (!ovn_port_allocate_key(sbrec_chassis_table, op)) {
> >>     > +    if (!ovn_port_allocate_key(op)) {
> >>     >           return false;
> >>     >       }
> >>     >       /* Create new binding, if needed. */
> >>     > @@ -4344,15 +4337,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_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, od, NULL,
> >>     > -                      sbrec_mirror_table, sbrec_chassis_table,
> >>     > +    if (!ls_port_init(op, ovnsb_txn, od, NULL,
> sbrec_mirror_table,
> >>     >                         sbrec_chassis_by_name,
> sbrec_chassis_by_hostname)) {
> >>     >           ovn_port_destroy(ls_ports, op);
> >>     >           return NULL;
> >>     > @@ -4367,7 +4358,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)
> >>     >   {
> >>     > @@ -4375,8 +4365,7 @@ ls_port_reinit(struct ovn_port *op, struct
> ovsdb_idl_txn *ovnsb_txn,
> >>     >       op->sb = sb;
> >>     >       ovn_port_set_nb(op, nbsp, NULL);
> >>     >       op->l3dgw_port = op->cr_port = NULL;
> >>     > -    return ls_port_init(op, ovnsb_txn, od, sb,
> >>     > -                        sbrec_mirror_table, sbrec_chassis_table,
> >>     > +    return ls_port_init(op, ovnsb_txn, od, sb,
> sbrec_mirror_table,
> >>     >                           sbrec_chassis_by_name,
> sbrec_chassis_by_hostname);
> >>     >   }
> >>     >
> >>     > @@ -4521,7 +4510,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,
> >>     >                                   ni->sbrec_mirror_table,
> >>     > -                                ni->sbrec_chassis_table,
> >>     >                                   ni->sbrec_chassis_by_name,
> >>     >                                   ni->sbrec_chassis_by_hostname);
> >>     >               if (!op) {
> >>     > @@ -4553,7 +4541,6 @@ ls_handle_lsp_changes(struct ovsdb_idl_txn
> *ovnsb_idl_txn,
> >>     >               if (!ls_port_reinit(op, ovnsb_idl_txn,
> >>     >                                   new_nbsp,
> >>     >                                   od, sb, ni->sbrec_mirror_table,
> >>     > -                                ni->sbrec_chassis_table,
> >>     >                                   ni->sbrec_chassis_by_name,
> >>     >                                   ni->sbrec_chassis_by_hostname))
> {
> >>     >                   if (sb) {
> >>     > @@ -17609,11 +17596,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->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,
> >>     > @@ -17621,7 +17609,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 940926945..be480003e 100644
> >>     > --- a/northd/northd.h
> >>     > +++ b/northd/northd.h
> >>     > @@ -791,6 +791,9 @@ 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 sbrec_chassis_table
> *sbrec_chassis_table);
> >>     > +
> >>     > +uint32_t get_ovn_max_dp_key_local(void);
> >>     >
> >>     >   #endif /* NORTHD_H */
> >>     > diff --git a/ovn-architecture.7.xml b/ovn-architecture.7.xml
> >>     > index bfd8680ce..3ecb58933 100644
> >>     > --- a/ovn-architecture.7.xml
> >>     > +++ b/ovn-architecture.7.xml
> >>     > @@ -2809,11 +2809,11 @@
> >>     >     </ul>
> >>     >
> >>     >     <p>
> >>     > -      When VXLAN is enabled on any hypervisor in a cluster,
> datapath and egress
> >>     > -      port identifier ranges are reduced to 12-bits. This is
> done because only
> >>     > -      STT and Geneve provide the large space for metadata (over
> 32 bits per
> >>     > -      packet). To accommodate for VXLAN, 24 bits available are
> split as
> >>     > -      follows:
> >>     > +    When VXLAN is enabled on any hypervisor in a cluster,
> datapath and egress
> >>     > +    port identifier ranges are reduced to 12-bits.  This is done
> because only
> >>     > +    STT and Geneve provide the large space for metadata (over 32
> bits per
> >>     > +    packet).  The mode with reduced ranges is called <code>VXLAN
> mode</code>.
> >>     > +    To accommodate for VXLAN, 24 bits available are split as
> follows:
> >>     >     </p>
> >>     >
> >>     >     <ul>
> >
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to