mirror of
https://github.com/openvswitch/ovs
synced 2025-09-04 00:05:15 +00:00
ofp-actions: Add action "debug_recirc" for testing recirculation.
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 <blp@nicira.com> Acked-by: Jarno Rajahalme <jrajahalme@nicira.com>
This commit is contained in:
@@ -46,5 +46,6 @@ dummy_enable(const char *arg)
|
|||||||
dpif_dummy_register(level);
|
dpif_dummy_register(level);
|
||||||
timeval_dummy_register();
|
timeval_dummy_register();
|
||||||
vlandev_dummy_enable();
|
vlandev_dummy_enable();
|
||||||
|
ofpact_dummy_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -38,5 +38,6 @@ void dpif_dummy_register(enum dummy_level);
|
|||||||
void netdev_dummy_register(enum dummy_level);
|
void netdev_dummy_register(enum dummy_level);
|
||||||
void timeval_dummy_register(void);
|
void timeval_dummy_register(void);
|
||||||
void vlandev_dummy_enable(void);
|
void vlandev_dummy_enable(void);
|
||||||
|
void ofpact_dummy_enable(void);
|
||||||
|
|
||||||
#endif /* dummy.h */
|
#endif /* dummy.h */
|
||||||
|
@@ -19,6 +19,7 @@
|
|||||||
#include "bundle.h"
|
#include "bundle.h"
|
||||||
#include "byte-order.h"
|
#include "byte-order.h"
|
||||||
#include "compiler.h"
|
#include "compiler.h"
|
||||||
|
#include "dummy.h"
|
||||||
#include "dynamic-string.h"
|
#include "dynamic-string.h"
|
||||||
#include "hmap.h"
|
#include "hmap.h"
|
||||||
#include "learn.h"
|
#include "learn.h"
|
||||||
@@ -284,6 +285,16 @@ enum ofp_raw_action_type {
|
|||||||
|
|
||||||
/* NX1.0+(34): struct nx_action_conjunction. */
|
/* NX1.0+(34): struct nx_action_conjunction. */
|
||||||
NXAST_RAW_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. */
|
/* OpenFlow actions are always a multiple of 8 bytes in length. */
|
||||||
@@ -4384,6 +4395,49 @@ format_SAMPLE(const struct ofpact_sample *a, struct ds *s)
|
|||||||
a->obs_domain_id, a->obs_point_id);
|
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. */
|
/* Meter instruction. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -4790,6 +4844,7 @@ ofpact_is_set_or_move_action(const struct ofpact *a)
|
|||||||
case OFPACT_STRIP_VLAN:
|
case OFPACT_STRIP_VLAN:
|
||||||
case OFPACT_WRITE_ACTIONS:
|
case OFPACT_WRITE_ACTIONS:
|
||||||
case OFPACT_WRITE_METADATA:
|
case OFPACT_WRITE_METADATA:
|
||||||
|
case OFPACT_DEBUG_RECIRC:
|
||||||
return false;
|
return false;
|
||||||
default:
|
default:
|
||||||
OVS_NOT_REACHED();
|
OVS_NOT_REACHED();
|
||||||
@@ -4850,6 +4905,7 @@ ofpact_is_allowed_in_actions_set(const struct ofpact *a)
|
|||||||
case OFPACT_SAMPLE:
|
case OFPACT_SAMPLE:
|
||||||
case OFPACT_STACK_POP:
|
case OFPACT_STACK_POP:
|
||||||
case OFPACT_STACK_PUSH:
|
case OFPACT_STACK_PUSH:
|
||||||
|
case OFPACT_DEBUG_RECIRC:
|
||||||
|
|
||||||
/* The action set may only include actions and thus
|
/* The action set may only include actions and thus
|
||||||
* may not include any instructions */
|
* may not include any instructions */
|
||||||
@@ -5063,6 +5119,7 @@ ovs_instruction_type_from_ofpact_type(enum ofpact_type type)
|
|||||||
case OFPACT_EXIT:
|
case OFPACT_EXIT:
|
||||||
case OFPACT_UNROLL_XLATE:
|
case OFPACT_UNROLL_XLATE:
|
||||||
case OFPACT_SAMPLE:
|
case OFPACT_SAMPLE:
|
||||||
|
case OFPACT_DEBUG_RECIRC:
|
||||||
default:
|
default:
|
||||||
return OVSINST_OFPIT11_APPLY_ACTIONS;
|
return OVSINST_OFPIT11_APPLY_ACTIONS;
|
||||||
}
|
}
|
||||||
@@ -5659,6 +5716,9 @@ ofpact_check__(enum ofputil_protocol *usable_protocols, struct ofpact *a,
|
|||||||
* OpenFlow. */
|
* OpenFlow. */
|
||||||
return OFPERR_OFPBAC_BAD_TYPE;
|
return OFPERR_OFPBAC_BAD_TYPE;
|
||||||
|
|
||||||
|
case OFPACT_DEBUG_RECIRC:
|
||||||
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
OVS_NOT_REACHED();
|
OVS_NOT_REACHED();
|
||||||
}
|
}
|
||||||
@@ -6061,6 +6121,7 @@ ofpact_outputs_to_port(const struct ofpact *ofpact, ofp_port_t port)
|
|||||||
case OFPACT_GOTO_TABLE:
|
case OFPACT_GOTO_TABLE:
|
||||||
case OFPACT_METER:
|
case OFPACT_METER:
|
||||||
case OFPACT_GROUP:
|
case OFPACT_GROUP:
|
||||||
|
case OFPACT_DEBUG_RECIRC:
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -107,6 +107,12 @@
|
|||||||
OFPACT(SAMPLE, ofpact_sample, ofpact, "sample") \
|
OFPACT(SAMPLE, ofpact_sample, ofpact, "sample") \
|
||||||
OFPACT(UNROLL_XLATE, ofpact_unroll_xlate, ofpact, "unroll_xlate") \
|
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. */ \
|
/* Instructions. */ \
|
||||||
OFPACT(METER, ofpact_meter, ofpact, "meter") \
|
OFPACT(METER, ofpact_meter, ofpact, "meter") \
|
||||||
OFPACT(CLEAR_ACTIONS, ofpact_null, ofpact, "clear_actions") \
|
OFPACT(CLEAR_ACTIONS, ofpact_null, ofpact, "clear_actions") \
|
||||||
|
@@ -4086,6 +4086,7 @@ recirc_unroll_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
|
|||||||
case OFPACT_WRITE_ACTIONS:
|
case OFPACT_WRITE_ACTIONS:
|
||||||
case OFPACT_METER:
|
case OFPACT_METER:
|
||||||
case OFPACT_SAMPLE:
|
case OFPACT_SAMPLE:
|
||||||
|
case OFPACT_DEBUG_RECIRC:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* These need not be copied for restoration. */
|
/* These need not be copied for restoration. */
|
||||||
@@ -4471,6 +4472,11 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
|
|||||||
case OFPACT_SAMPLE:
|
case OFPACT_SAMPLE:
|
||||||
xlate_sample_action(ctx, ofpact_get_SAMPLE(a));
|
xlate_sample_action(ctx, ofpact_get_SAMPLE(a));
|
||||||
break;
|
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
|
/* Check if need to store this and the remaining actions for later
|
||||||
|
Reference in New Issue
Block a user