On 7/7/24 22:08, Adrian Moreno wrote:
> Datapath features can be set with dpif/set-dp-features unixctl command.
> This command is not docummented and therefore not supported in
> production but only useful for unit tests.
> 
> A limitation was put in place originally to avoid enabling features at
> runtime that were disabled at boot time to avoid breaking the datapath
> in unexpected ways.
> 
> But, considering users should not use this command and it should only be
> used for testing, we can assume whoever runs it knows what they are
> doing. Therefore, the limitation should be bypass-able.
> 
> This patch adds a "--force" flag to the unixctl command to allow
> bypassing the mentioned limitation.
> 
> Signed-off-by: Adrian Moreno <amore...@redhat.com>
> ---
>  ofproto/ofproto-dpif.c | 37 +++++++++++++++++++++++++++----------
>  1 file changed, 27 insertions(+), 10 deletions(-)
> 
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index fcd7cd753..4712d10a8 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -6432,7 +6432,8 @@ display_support_field(const char *name,
>  static bool
>  dpif_set_support(struct dpif_backer_support *rt_support,
>                   struct dpif_backer_support *bt_support,
> -                 const char *name, const char *value, struct ds *ds)
> +                 const char *name, const char *value, bool force,
> +                 struct ds *ds)
>  {
>      struct shash all_fields = SHASH_INITIALIZER(&all_fields);
>      struct dpif_support_field *field;
> @@ -6484,8 +6485,8 @@ dpif_set_support(struct dpif_backer_support *rt_support,
>  
>      if (field->type == DPIF_SUPPORT_FIELD_bool) {
>          if (!strcasecmp(value, "true")) {
> -            if (*(bool *)field->bt_ptr) {
> -                *(bool *)field->rt_ptr = true;
> +            if (*(bool *) field->bt_ptr || force) {
> +                *(bool *) field->rt_ptr = true;

We discussed having a scary warning message for the force option.
I don't see it here.

>                  changed = true;
>              } else {
>                  ds_put_cstr(ds, "Can not enable features not supported by 
> the datapth");
> @@ -6720,21 +6721,36 @@ ofproto_unixctl_dpif_set_dp_features(struct 
> unixctl_conn *conn,
>                                       void *aux OVS_UNUSED)
>  {
>      struct ds ds = DS_EMPTY_INITIALIZER;
> -    const char *br = argv[1];
> +    struct ofproto_dpif *ofproto;
> +    bool changed, force = false;
>      const char *name, *value;
> -    struct ofproto_dpif *ofproto = ofproto_dpif_lookup_by_name(br);
> -    bool changed;
> +    const char *br = NULL;
> +
> +    if (!strcmp(argv[1], "--force")) {
> +        force = true;
> +        if (argc > 2) {
> +            br = argv[2];
> +            name = argc > 3 ? argv[3] : NULL;
> +            value = argc > 4 ? argv[4] : NULL;
> +        } else {
> +            unixctl_command_reply_error(conn, "bridge not specified");
> +            return;
> +        }
> +    } else {
> +        br = argv[1];
> +        name = argc > 2 ? argv[2] : NULL;
> +        value = argc > 3 ? argv[3] : NULL;
> +    }

It feels like this can be cleaner if we just eat the --force,
argv++, argc-- and continue the processing instead of doing
the same thing with diferent indexes in different branches.

>  
> +    ofproto = ofproto_dpif_lookup_by_name(br);
>      if (!ofproto) {
>          unixctl_command_reply_error(conn, "no such bridge");
>          return;
>      }
>  
> -    name = argc > 2 ? argv[2] : NULL;
> -    value = argc > 3 ? argv[3] : NULL;
>      changed = dpif_set_support(&ofproto->backer->rt_support,
>                                 &ofproto->backer->bt_support,
> -                               name, value, &ds);
> +                               name, value, force, &ds);
>      if (changed) {
>          xlate_set_support(ofproto, &ofproto->backer->rt_support);
>          udpif_flush(ofproto->backer->udpif);
> @@ -6777,7 +6793,8 @@ ofproto_unixctl_init(void)
>      unixctl_command_register("dpif/dump-flows",
>                               "[-m] [--names | --no-names] bridge", 1, 
> INT_MAX,
>                               ofproto_unixctl_dpif_dump_flows, NULL);
> -    unixctl_command_register("dpif/set-dp-features", "bridge", 1, 3 ,
> +    unixctl_command_register("dpif/set-dp-features",
> +                             "[--force] bridge [feature] [value]", 1, 4 ,

There is an extra space after '4'.  It was there before, but it's
a good time to remove it.

Also, [feature [value]] .

>                               ofproto_unixctl_dpif_set_dp_features, NULL);
>  }
>  

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to