Skip to content

Commit

Permalink
ofp-actions: Add action "debug_slow" for testing slow-path.
Browse files Browse the repository at this point in the history
It isn't otherwise useful and in fact hurts performance so it's disabled
without --enable-dummy.

An upcoming commit will make use of this.

Signed-off-by: Justin Pettit <jpettit@ovn.org>
Acked-by: Ben Pfaff <blp@ovn.org>
  • Loading branch information
justinpettit committed Jan 11, 2018
1 parent 556ef8b commit a934a3d
Show file tree
Hide file tree
Showing 4 changed files with 74 additions and 1 deletion.
1 change: 1 addition & 0 deletions include/openvswitch/ofp-actions.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@ struct vl_mff_map;
* These are intentionally undocumented, subject to change, and \
* only accepted if ovs-vswitchd is started with --enable-dummy. */ \
OFPACT(DEBUG_RECIRC, ofpact_null, ofpact, "debug_recirc") \
OFPACT(DEBUG_SLOW, ofpact_null, ofpact, "debug_slow") \
\
/* Instructions. */ \
OFPACT(METER, ofpact_meter, ofpact, "meter") \
Expand Down
48 changes: 47 additions & 1 deletion lib/ofp-actions.c
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,9 @@ enum ofp_raw_action_type {
/* These are intentionally undocumented, subject to change, and ovs-vswitchd */
/* accepts them only if started with --enable-dummy. */

/* NX1.0+(254): void. */
NXAST_RAW_DEBUG_SLOW,

/* NX1.0+(255): void. */
NXAST_RAW_DEBUG_RECIRC,
};
Expand Down Expand Up @@ -475,6 +478,7 @@ ofpact_next_flattened(const struct ofpact *ofpact)
case OFPACT_UNROLL_XLATE:
case OFPACT_CT_CLEAR:
case OFPACT_DEBUG_RECIRC:
case OFPACT_DEBUG_SLOW:
case OFPACT_METER:
case OFPACT_CLEAR_ACTIONS:
case OFPACT_WRITE_METADATA:
Expand Down Expand Up @@ -5802,7 +5806,7 @@ format_SAMPLE(const struct ofpact_sample *a,
ds_put_format(s, "%s)%s", colors.paren, colors.end);
}

/* debug_recirc instruction. */
/* debug instructions. */

static bool enable_debug;

Expand Down Expand Up @@ -5849,6 +5853,43 @@ format_DEBUG_RECIRC(const struct ofpact_null *a OVS_UNUSED,
ds_put_format(s, "%sdebug_recirc%s", colors.value, colors.end);
}

static enum ofperr
decode_NXAST_RAW_DEBUG_SLOW(struct ofpbuf *out)
{
if (!enable_debug) {
return OFPERR_OFPBAC_BAD_VENDOR_TYPE;
}

ofpact_put_DEBUG_SLOW(out);
return 0;
}

static void
encode_DEBUG_SLOW(const struct ofpact_null *n OVS_UNUSED,
enum ofp_version ofp_version OVS_UNUSED,
struct ofpbuf *out)
{
put_NXAST_DEBUG_SLOW(out);
}

static char * OVS_WARN_UNUSED_RESULT
parse_DEBUG_SLOW(char *arg OVS_UNUSED,
const struct ofputil_port_map *port_map OVS_UNUSED,
struct ofpbuf *ofpacts,
enum ofputil_protocol *usable_protocols OVS_UNUSED)
{
ofpact_put_DEBUG_SLOW(ofpacts);
return NULL;
}

static void
format_DEBUG_SLOW(const struct ofpact_null *a OVS_UNUSED,
const struct ofputil_port_map *port_map OVS_UNUSED,
struct ds *s)
{
ds_put_format(s, "%sdebug_slow%s", colors.value, colors.end);
}

/* Action structure for NXAST_CT.
*
* Pass traffic to the connection tracker.
Expand Down Expand Up @@ -7151,6 +7192,7 @@ ofpact_is_set_or_move_action(const struct ofpact *a)
case OFPACT_WRITE_ACTIONS:
case OFPACT_WRITE_METADATA:
case OFPACT_DEBUG_RECIRC:
case OFPACT_DEBUG_SLOW:
return false;
default:
OVS_NOT_REACHED();
Expand Down Expand Up @@ -7219,6 +7261,7 @@ ofpact_is_allowed_in_actions_set(const struct ofpact *a)
case OFPACT_STACK_POP:
case OFPACT_STACK_PUSH:
case OFPACT_DEBUG_RECIRC:
case OFPACT_DEBUG_SLOW:

/* The action set may only include actions and thus
* may not include any instructions */
Expand Down Expand Up @@ -7441,6 +7484,7 @@ ovs_instruction_type_from_ofpact_type(enum ofpact_type type)
case OFPACT_UNROLL_XLATE:
case OFPACT_SAMPLE:
case OFPACT_DEBUG_RECIRC:
case OFPACT_DEBUG_SLOW:
case OFPACT_CT:
case OFPACT_CT_CLEAR:
case OFPACT_NAT:
Expand Down Expand Up @@ -8107,6 +8151,7 @@ ofpact_check__(enum ofputil_protocol *usable_protocols, struct ofpact *a,
return OFPERR_OFPBAC_BAD_TYPE;

case OFPACT_DEBUG_RECIRC:
case OFPACT_DEBUG_SLOW:
return 0;

case OFPACT_ENCAP:
Expand Down Expand Up @@ -8622,6 +8667,7 @@ ofpact_outputs_to_port(const struct ofpact *ofpact, ofp_port_t port)
case OFPACT_METER:
case OFPACT_GROUP:
case OFPACT_DEBUG_RECIRC:
case OFPACT_DEBUG_SLOW:
case OFPACT_CT:
case OFPACT_CT_CLEAR:
case OFPACT_NAT:
Expand Down
7 changes: 7 additions & 0 deletions ofproto/ofproto-dpif-xlate.c
Original file line number Diff line number Diff line change
Expand Up @@ -5302,6 +5302,7 @@ reversible_actions(const struct ofpact *ofpacts, size_t ofpacts_len)
case OFPACT_CONTROLLER:
case OFPACT_CT_CLEAR:
case OFPACT_DEBUG_RECIRC:
case OFPACT_DEBUG_SLOW:
case OFPACT_DEC_MPLS_TTL:
case OFPACT_DEC_TTL:
case OFPACT_ENQUEUE:
Expand Down Expand Up @@ -5635,6 +5636,7 @@ freeze_unroll_actions(const struct ofpact *a, const struct ofpact *end,
case OFPACT_ENCAP:
case OFPACT_DECAP:
case OFPACT_DEBUG_RECIRC:
case OFPACT_DEBUG_SLOW:
case OFPACT_CT:
case OFPACT_CT_CLEAR:
case OFPACT_NAT:
Expand Down Expand Up @@ -6130,6 +6132,7 @@ recirc_for_mpls(const struct ofpact *a, struct xlate_ctx *ctx)
case OFPACT_CT_CLEAR:
case OFPACT_NAT:
case OFPACT_DEBUG_RECIRC:
case OFPACT_DEBUG_SLOW:
case OFPACT_METER:
case OFPACT_CLEAR_ACTIONS:
case OFPACT_WRITE_ACTIONS:
Expand Down Expand Up @@ -6578,6 +6581,10 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
ctx_trigger_freeze(ctx);
a = ofpact_next(a);
break;

case OFPACT_DEBUG_SLOW:
ctx->xout->slow |= SLOW_ACTION;
break;
}

/* Check if need to store this and the remaining actions for later
Expand Down
19 changes: 19 additions & 0 deletions tests/ofproto-dpif.at
Original file line number Diff line number Diff line change
Expand Up @@ -4816,6 +4816,25 @@ AT_CHECK_UNQUOTED([tail -1 stdout], [0], [Datapath actions: 2
OVS_VSWITCHD_STOP
AT_CLEANUP


AT_SETUP([ofproto-dpif - debug_slow action])
OVS_VSWITCHD_START
add_of_ports br0 1 2 3

AT_CHECK([ovs-ofctl add-flow br0 "in_port=1,actions=debug_slow,2"])

flow="in_port(1),eth(src=50:54:00:00:00:05,dst=50:54:00:00:00:07),eth_type(0x0800),ipv4(src=192.168.0.1,dst=192.168.0.2,proto=1,tos=0,ttl=128,frag=no),icmp(type=8,code=0)"

AT_CHECK([ovs-appctl ofproto/trace ovs-dummy "$flow" -generate], [0], [stdout])
AT_CHECK_UNQUOTED([tail -3 stdout], [0], [Datapath actions: 2
This flow is handled by the userspace slow path because it:
- Uses action(s) not supported by datapath.
])

OVS_VSWITCHD_STOP
AT_CLEANUP


dnl CHECK_CONTINUATION(TITLE, N_PORTS0, N_PORTS1, ACTIONS0, ACTIONS1, [EXTRA_SETUP])
dnl
dnl Checks the implementation of the continuation mechanism that allows the
Expand Down

0 comments on commit a934a3d

Please sign in to comment.