I’ve sent v2:
https://patchwork.ozlabs.org/project/ovn/patch/[email protected]/

> On 4 Apr 2024, at 18:27, Dumitru Ceara <[email protected]> wrote:
> 
> On 4/4/24 14:38, Vladislav Odintsov wrote:
>> *Patch [1] is 
>> https://patchwork.ozlabs.org/project/ovn/patch/[email protected]/
>> 
>>> On 4 Apr 2024, at 15:33, Vladislav Odintsov <[email protected]> wrote:
>>> 
>>> Hi Dumitru,
>>> 
>>> thanks for your attention on this!
>>> 
>>>> On 4 Apr 2024, at 13:06, 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.
>>>> 
>>>>> 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.
>>> 
>>> ACK, I’ll address this in v2.
>>> 
>>> Also, if my testcase in this current patch requires patch [1], should I 
>>> send them both in v2?
>>> 
> 
> It was acked by Mark so I applied it and backported it now.
> 
> Thanks,
> Dumitru
> 
> _______________________________________________
> dev mailing list
> [email protected] <mailto:[email protected]>
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev


Regards,
Vladislav Odintsov

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to