diff mbox series

[ovs-dev,v4,01/11] ofproto-dpif: Allow forcing dp features.

Message ID 20240713212347.2466088-2-amorenoz@redhat.com
State Accepted
Commit d9de6b01c268379b689025a486c043e70c8e020e
Headers show
Series Introduce local sampling with NXAST_SAMPLE action. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/github-robot-_Build_and_Test success github build: passed

Commit Message

Adrián Moreno July 13, 2024, 9:23 p.m. UTC
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 <echaudro@redhat.com>
Signed-off-by: Adrian Moreno <amorenoz@redhat.com>
---
 ofproto/ofproto-dpif.c | 32 ++++++++++++++++++++++++--------
 1 file changed, 24 insertions(+), 8 deletions(-)
diff mbox series

Patch

diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
index 87dfb0043..33c80d87c 100644
--- a/ofproto/ofproto-dpif.c
+++ b/ofproto/ofproto-dpif.c
@@ -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;
@@ -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");
@@ -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");
@@ -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);
@@ -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);
 }