On Wed, Jul 10, 2024 at 12:13:37AM GMT, Ilya Maximets wrote:
> 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.
>

You're right. I forgot. Thanks.

> >                  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.
>

Thanks for the suggestion. It does seem to yield cleaner code.

> >
> > +    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]] .

Ack.

>
> >                               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