@@ -51,6 +51,8 @@ Post-v2.17.0
The old variant is kept for backward compatibility.
* Add actions auto-validator function to compare different actions
implementations against default implementation.
+ * Add command line option to switch between different actions
+ implementations available at run time.
- Linux datapath:
* Add offloading meter tc police.
@@ -584,6 +584,7 @@ MAN_FRAGMENTS += \
lib/netdev-dpdk-unixctl.man \
lib/dpif-netdev-unixctl.man \
lib/dpif-netlink-unixctl.man \
+ lib/odp-execute-unixctl.man \
lib/ofp-version.man \
lib/ovs.tmac \
lib/ovs-replay.man \
@@ -67,6 +67,18 @@ odp_execute_action_set(const char *name)
return NULL;
}
+void
+odp_execute_action_get_info(struct ds *string)
+{
+ ds_put_cstr(string, "Available Actions implementations:\n");
+ for (int i = 0; i < ACTION_IMPL_MAX; i++) {
+ ds_put_format(string, " %s (available: %s, active: %s)\n",
+ action_impls[i].name,
+ action_impls[i].available ? "Yes" : "No",
+ i == active_action_impl_index ? "Yes" : "No");
+ }
+}
+
void
odp_execute_action_init(void)
{
@@ -84,4 +84,6 @@ struct odp_execute_action_impl * odp_execute_action_set(const char *name);
int action_autoval_init(struct odp_execute_action_impl *self);
+void odp_execute_action_get_info(struct ds *name);
+
#endif /* ODP_EXTRACT_PRIVATE */
new file mode 100644
@@ -0,0 +1,10 @@
+.SS "ODP-EXECUTE COMMANDS"
+These commands manage the "odp-execute" component.
+
+.IP "\fBodp-execute/action-impl-show\fR
+Lists the actions implementations that are available and highlights the
+currently enabled one.
+.
+.IP "\fBodp-execute/action-impl-set\fR \fIaction_impl\fR"
+Sets the action implementation to any available implementation. By default
+"scalar" is used.
@@ -39,6 +39,7 @@
#include "csum.h"
#include "conntrack.h"
#include "openvswitch/vlog.h"
+#include "unixctl.h"
VLOG_DEFINE_THIS_MODULE(odp_execute);
COVERAGE_DEFINE(datapath_drop_sample_error);
@@ -879,6 +880,48 @@ odp_actions_impl_set(const char *name)
}
+static void
+action_impl_set(struct unixctl_conn *conn, int argc OVS_UNUSED,
+ const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED)
+{
+ struct ds reply = DS_EMPTY_INITIALIZER;
+
+ int err = odp_actions_impl_set(argv[1]);
+ if (err) {
+ ds_put_format(&reply,
+ "Error: unknown action implementation, %s, specified!\n",
+ argv[1]);
+ unixctl_command_reply_error(conn, ds_cstr(&reply));
+ } else {
+ ds_put_format(&reply, "Action implementation set to %s.\n", argv[1]);
+ unixctl_command_reply(conn, ds_cstr(&reply));
+ }
+
+ ds_destroy(&reply);
+}
+
+static void
+action_impl_show(struct unixctl_conn *conn, int argc OVS_UNUSED,
+ const char *argv[] OVS_UNUSED, void *aux OVS_UNUSED)
+{
+ struct ds reply = DS_EMPTY_INITIALIZER;
+
+ odp_execute_action_get_info(&reply);
+ unixctl_command_reply(conn, ds_cstr(&reply));
+ ds_destroy(&reply);
+}
+
+static void
+odp_execute_unixctl_init(void)
+{
+ unixctl_command_register("odp-execute/action-impl-set", "name",
+ 1, 1, action_impl_set,
+ NULL);
+ unixctl_command_register("odp-execute/action-impl-show", "",
+ 0, 0, action_impl_show,
+ NULL);
+}
+
void
odp_execute_init(void)
{
@@ -886,6 +929,7 @@ odp_execute_init(void)
if (ovsthread_once_start(&once)) {
odp_execute_action_init();
odp_actions_impl_set("scalar");
+ odp_execute_unixctl_init();
ovsthread_once_done(&once);
}
}
@@ -1192,3 +1192,42 @@ ovs-appctl: ovs-vswitchd: server returned an error
OVS_VSWITCHD_STOP
AT_CLEANUP
+
+AT_SETUP([PMD - ovs-actions configuration])
+OVS_VSWITCHD_START([], [], [], [--dummy-numa 0,0])
+AT_CHECK([ovs-vsctl add-port br0 p1 -- set Interface p1 type=dummy-pmd])
+
+AT_CHECK([ovs-vsctl show], [], [stdout])
+
+dnl Set the scalar first, so we always have the scalar impl as Active.
+AT_CHECK([ovs-appctl odp-execute/action-impl-set scalar], [0], [dnl
+Action implementation set to scalar.
+])
+AT_CHECK([ovs-appctl odp-execute/action-impl-show | grep "scalar"], [], [dnl
+ scalar (available: Yes, active: Yes)
+])
+
+AT_CHECK([ovs-appctl odp-execute/action-impl-show | grep "autovalidator"], [], [dnl
+ autovalidator (available: Yes, active: No)
+])
+
+dnl Set the autovalidator impl to active.
+AT_CHECK([ovs-appctl odp-execute/action-impl-set autovalidator], [0], [dnl
+Action implementation set to autovalidator.
+])
+
+AT_CHECK([ovs-appctl odp-execute/action-impl-show | grep "scalar"], [], [dnl
+ scalar (available: Yes, active: No)
+])
+
+AT_CHECK([ovs-appctl odp-execute/action-impl-show | grep "autovalidator"], [], [dnl
+ autovalidator (available: Yes, active: Yes)
+])
+
+AT_CHECK([ovs-appctl odp-execute/action-impl-set invalid_implementation], [2], [], [dnl
+Error: unknown action implementation, invalid_implementation, specified!
+ovs-appctl: ovs-vswitchd: server returned an error
+])
+
+OVS_VSWITCHD_STOP(["/Failed setting action implementation to invalid_implementation/d"])
+AT_CLEANUP
@@ -282,6 +282,7 @@ type).
.so lib/dpif-netdev-unixctl.man
.so lib/dpif-netlink-unixctl.man
.so lib/netdev-dpdk-unixctl.man
+.so lib/odp-execute-unixctl.man
.so ofproto/ofproto-dpif-unixctl.man
.so ofproto/ofproto-unixctl.man
.so lib/vlog-unixctl.man