Skip to content

Commit

Permalink
odp-execute: Add command to switch action implementation.
Browse files Browse the repository at this point in the history
This commit adds a new command to allow the user to switch
the active action implementation at runtime.

Usage:
  $ ovs-appctl odp-execute/action-impl-set scalar

This commit also adds a new command to retrieve the list of available
action implementations. This can be used by to check what implementations
of actions are available and what implementation is active during runtime.

Usage:
   $ ovs-appctl odp-execute/action-impl-show

Added separate test-case for ovs-actions show/set commands:
odp-execute - actions implementation

Signed-off-by: Emma Finn <[email protected]>
Signed-off-by: Kumar Amber <[email protected]>
Signed-off-by: Sunil Pai G <[email protected]>
Co-authored-by: Kumar Amber <[email protected]>
Co-authored-by: Sunil Pai G <[email protected]>
Acked-by: Harry van Haaren <[email protected]>
Acked-by: Eelco Chaudron <[email protected]>
Signed-off-by: Ian Stokes <[email protected]>
  • Loading branch information
3 people authored and istokes committed Jul 15, 2022
1 parent eec8227 commit 1713fc0
Show file tree
Hide file tree
Showing 8 changed files with 111 additions and 0 deletions.
2 changes: 2 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,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.
* Add support for offloading the check_pkt_len action.
Expand Down
1 change: 1 addition & 0 deletions lib/automake.mk
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
12 changes: 12 additions & 0 deletions lib/odp-execute-private.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down
2 changes: 2 additions & 0 deletions lib/odp-execute-private.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,4 +78,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 */
10 changes: 10 additions & 0 deletions lib/odp-execute-unixctl.man
Original file line number Diff line number Diff line change
@@ -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.
44 changes: 44 additions & 0 deletions lib/odp-execute.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -876,13 +877,56 @@ odp_actions_impl_set(const char *name)
return 0;
}

static void
action_impl_set(struct unixctl_conn *conn, int argc OVS_UNUSED,
const char *argv[], 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!",
argv[1]);
unixctl_command_reply_error(conn, ds_cstr(&reply));
} else {
ds_put_format(&reply, "Action implementation set to %s.", 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)
{
static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
if (ovsthread_once_start(&once)) {
odp_execute_action_init();
odp_actions_impl_set("scalar");
odp_execute_unixctl_init();
ovsthread_once_done(&once);
}
}
Expand Down
39 changes: 39 additions & 0 deletions tests/odp.at
Original file line number Diff line number Diff line change
Expand Up @@ -472,3 +472,42 @@ AT_CHECK_UNQUOTED([ovstest test-odp parse-keys < odp-in.txt], [0], [dnl
odp_flow_from_string: error (syntax error at encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap(encap())))))))))))))))))))))))))))))))))
])
AT_CLEANUP

AT_BANNER([datapath actions in userspace])
AT_SETUP([odp-execute - actions implementation])
OVS_VSWITCHD_START()

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
1 change: 1 addition & 0 deletions vswitchd/ovs-vswitchd.8.in
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 1713fc0

Please sign in to comment.