Skip to content

Commit

Permalink
ofproto-dpif: Allow forcing dp features.
Browse files Browse the repository at this point in the history
Datapath features can be set with dpif/set-dp-features unixctl command.
This command is not documented 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.

Acked-by: Eelco Chaudron <[email protected]>
Signed-off-by: Adrian Moreno <[email protected]>
Signed-off-by: Ilya Maximets <[email protected]>
  • Loading branch information
amorenoz authored and igsilya committed Jul 14, 2024
1 parent d7e7714 commit d9de6b0
Showing 1 changed file with 24 additions and 8 deletions.
32 changes: 24 additions & 8 deletions ofproto/ofproto-dpif.c
Original file line number Diff line number Diff line change
Expand Up @@ -6433,7 +6433,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;
Expand Down Expand Up @@ -6485,8 +6486,13 @@ 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) {
if (force) {
VLOG_WARN(
"Enabling an unsupported feature is very dangerous"
);
}
*(bool *) field->rt_ptr = true;
changed = true;
} else {
ds_put_cstr(ds, "Can not enable features not supported by the datapth");
Expand Down Expand Up @@ -6818,10 +6824,19 @@ 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;

if (argc > 2 && !strcmp(argv[1], "--force")) {
force = true;
argc--;
argv++;
}

br = argv[1];
ofproto = ofproto_dpif_lookup_by_name(br);

if (!ofproto) {
unixctl_command_reply_error(conn, "no such bridge");
Expand All @@ -6832,7 +6847,7 @@ ofproto_unixctl_dpif_set_dp_features(struct unixctl_conn *conn,
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);
Expand Down Expand Up @@ -6875,7 +6890,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,
ofproto_unixctl_dpif_set_dp_features, NULL);
}

Expand Down

0 comments on commit d9de6b0

Please sign in to comment.