[ovs-dev] [PATCH v3 4/8] ofproto-dpif-xlate: Preserve and execute action_set on a patch port.
Jarno Rajahalme
jrajahalme at nicira.com
Fri Mar 13 23:51:57 UTC 2015
Prevent a peer bridge from seeing or modifying the action_set of the
first bridge.
Also execute the accumulated action set on the peer bridge, if any.
Found by inspection.
Signed-off-by: Jarno Rajahalme <jrajahalme at nicira.com>
---
ofproto/ofproto-dpif-xlate.c | 15 ++++++++++++++-
1 file changed, 14 insertions(+), 1 deletion(-)
diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
index 3691d72..81a7f72 100644
--- a/ofproto/ofproto-dpif-xlate.c
+++ b/ofproto/ofproto-dpif-xlate.c
@@ -223,12 +223,14 @@ struct xlate_ctx {
* 'action_set' accumulates "struct ofpact"s added by OFPACT_WRITE_ACTIONS.
* When translation is otherwise complete, ofpacts_execute_action_set()
* converts it to a set of "struct ofpact"s that can be translated into
- * datapath actions. */
+ * datapath actions. */
bool action_set_has_group; /* Action set contains OFPACT_GROUP? */
struct ofpbuf action_set; /* Action set. */
uint64_t action_set_stub[1024 / 8];
};
+static void xlate_action_set(struct xlate_ctx *ctx);
+
/* A controller may use OFPP_NONE as the ingress port to indicate that
* it did not arrive on a "real" port. 'ofpp_none_bundle' exists for
* when an input bundle is needed for validation (e.g., mirroring or
@@ -2733,8 +2735,11 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
uint8_t table_id = rule_dpif_lookup_get_init_table_id(&ctx->xin->flow);
struct ofpbuf old_stack = ctx->stack;
union mf_subvalue new_stack[1024 / sizeof(union mf_subvalue)];
+ struct ofpbuf old_action_set = ctx->action_set;
+ uint64_t actset_stub[1024 / 8];
ofpbuf_use_stub(&ctx->stack, new_stack, sizeof new_stack);
+ ofpbuf_use_stub(&ctx->action_set, actset_stub, sizeof actset_stub);
ctx->xbridge = peer->xbridge;
flow->in_port.ofp_port = peer->ofp_port;
flow->metadata = htonll(0);
@@ -2750,6 +2755,10 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
if (xport_stp_forward_state(peer) && xport_rstp_forward_state(peer)) {
xlate_table_action(ctx, flow->in_port.ofp_port, table_id,
true, true);
+ if (ctx->action_set.size) {
+ /* Translate action set only if not dropping the packet. */
+ xlate_action_set(ctx);
+ }
} else {
/* Forwarding is disabled by STP and RSTP. Let OFPP_NORMAL and
* the learning action look at the packet, then drop it. */
@@ -2766,6 +2775,8 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
ctx->xin->flow = old_flow;
ctx->xbridge = xport->xbridge;
+ ofpbuf_uninit(&ctx->action_set);
+ ctx->action_set = old_action_set;
ofpbuf_uninit(&ctx->stack);
ctx->stack = old_stack;
@@ -3778,6 +3789,8 @@ xlate_action_set(struct xlate_ctx *ctx)
ctx->in_action_set = true;
ofpbuf_use_stub(&action_list, action_list_stub, sizeof action_list_stub);
ofpacts_execute_action_set(&action_list, &ctx->action_set);
+ /* Clear the action set, as it is not needed any more. */
+ ofpbuf_clear(&ctx->action_set);
do_xlate_actions(action_list.data, action_list.size, ctx);
ctx->in_action_set = false;
ofpbuf_uninit(&action_list);
--
1.7.10.4
More information about the dev
mailing list