Skip to content

Commit

Permalink
ofp-actions: Add action "debug_recirc" for testing recirculation.
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: Ben Pfaff <[email protected]>
Acked-by: Jarno Rajahalme <[email protected]>
  • Loading branch information
blp committed Jul 31, 2015
1 parent 2082425 commit d4abaff
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 0 deletions.
1 change: 1 addition & 0 deletions lib/dummy.c
Original file line number Diff line number Diff line change
Expand Up @@ -46,5 +46,6 @@ dummy_enable(const char *arg)
dpif_dummy_register(level);
timeval_dummy_register();
vlandev_dummy_enable();
ofpact_dummy_enable();
}

1 change: 1 addition & 0 deletions lib/dummy.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,5 +38,6 @@ void dpif_dummy_register(enum dummy_level);
void netdev_dummy_register(enum dummy_level);
void timeval_dummy_register(void);
void vlandev_dummy_enable(void);
void ofpact_dummy_enable(void);

#endif /* dummy.h */
61 changes: 61 additions & 0 deletions lib/ofp-actions.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "bundle.h"
#include "byte-order.h"
#include "compiler.h"
#include "dummy.h"
#include "dynamic-string.h"
#include "hmap.h"
#include "learn.h"
Expand Down Expand Up @@ -284,6 +285,16 @@ enum ofp_raw_action_type {

/* NX1.0+(34): struct nx_action_conjunction. */
NXAST_RAW_CONJUNCTION,

/* ## ------------------ ## */
/* ## Debugging actions. ## */
/* ## ------------------ ## */

/* These are intentionally undocumented, subject to change, and ovs-vswitchd */
/* accepts them only if started with --enable-dummy. */

/* NX1.0+(255): void. */
NXAST_RAW_DEBUG_RECIRC,
};

/* OpenFlow actions are always a multiple of 8 bytes in length. */
Expand Down Expand Up @@ -4384,6 +4395,49 @@ format_SAMPLE(const struct ofpact_sample *a, struct ds *s)
a->obs_domain_id, a->obs_point_id);
}

/* debug_recirc instruction. */

static bool enable_debug;

void
ofpact_dummy_enable(void)
{
enable_debug = true;
}

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

ofpact_put_DEBUG_RECIRC(out);
return 0;
}

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

static char * OVS_WARN_UNUSED_RESULT
parse_DEBUG_RECIRC(char *arg OVS_UNUSED, struct ofpbuf *ofpacts,
enum ofputil_protocol *usable_protocols OVS_UNUSED)
{
ofpact_put_DEBUG_RECIRC(ofpacts);
return NULL;
}

static void
format_DEBUG_RECIRC(const struct ofpact_null *a OVS_UNUSED, struct ds *s)
{
ds_put_cstr(s, "debug_recirc");
}

/* Meter instruction. */

static void
Expand Down Expand Up @@ -4790,6 +4844,7 @@ ofpact_is_set_or_move_action(const struct ofpact *a)
case OFPACT_STRIP_VLAN:
case OFPACT_WRITE_ACTIONS:
case OFPACT_WRITE_METADATA:
case OFPACT_DEBUG_RECIRC:
return false;
default:
OVS_NOT_REACHED();
Expand Down Expand Up @@ -4850,6 +4905,7 @@ ofpact_is_allowed_in_actions_set(const struct ofpact *a)
case OFPACT_SAMPLE:
case OFPACT_STACK_POP:
case OFPACT_STACK_PUSH:
case OFPACT_DEBUG_RECIRC:

/* The action set may only include actions and thus
* may not include any instructions */
Expand Down Expand Up @@ -5063,6 +5119,7 @@ ovs_instruction_type_from_ofpact_type(enum ofpact_type type)
case OFPACT_EXIT:
case OFPACT_UNROLL_XLATE:
case OFPACT_SAMPLE:
case OFPACT_DEBUG_RECIRC:
default:
return OVSINST_OFPIT11_APPLY_ACTIONS;
}
Expand Down Expand Up @@ -5659,6 +5716,9 @@ ofpact_check__(enum ofputil_protocol *usable_protocols, struct ofpact *a,
* OpenFlow. */
return OFPERR_OFPBAC_BAD_TYPE;

case OFPACT_DEBUG_RECIRC:
return 0;

default:
OVS_NOT_REACHED();
}
Expand Down Expand Up @@ -6061,6 +6121,7 @@ ofpact_outputs_to_port(const struct ofpact *ofpact, ofp_port_t port)
case OFPACT_GOTO_TABLE:
case OFPACT_METER:
case OFPACT_GROUP:
case OFPACT_DEBUG_RECIRC:
default:
return false;
}
Expand Down
6 changes: 6 additions & 0 deletions lib/ofp-actions.h
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,12 @@
OFPACT(SAMPLE, ofpact_sample, ofpact, "sample") \
OFPACT(UNROLL_XLATE, ofpact_unroll_xlate, ofpact, "unroll_xlate") \
\
/* Debugging actions. \
* \
* 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") \
\
/* Instructions. */ \
OFPACT(METER, ofpact_meter, ofpact, "meter") \
OFPACT(CLEAR_ACTIONS, ofpact_null, ofpact, "clear_actions") \
Expand Down
6 changes: 6 additions & 0 deletions ofproto/ofproto-dpif-xlate.c
Original file line number Diff line number Diff line change
Expand Up @@ -4086,6 +4086,7 @@ recirc_unroll_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
case OFPACT_WRITE_ACTIONS:
case OFPACT_METER:
case OFPACT_SAMPLE:
case OFPACT_DEBUG_RECIRC:
break;

/* These need not be copied for restoration. */
Expand Down Expand Up @@ -4471,6 +4472,11 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
case OFPACT_SAMPLE:
xlate_sample_action(ctx, ofpact_get_SAMPLE(a));
break;

case OFPACT_DEBUG_RECIRC:
ctx_trigger_recirculation(ctx);
a = ofpact_next(a);
break;
}

/* Check if need to store this and the remaining actions for later
Expand Down

0 comments on commit d4abaff

Please sign in to comment.