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 <[email protected]>
> ---
> 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
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev