[ovs-dev] [PATCH 36/41] ofproto-dpif-rid: Don't carry actset_output explicitly in metadata.
Jarno Rajahalme
jarno at ovn.org
Thu Jan 21 00:08:40 UTC 2016
This is nice reduction of code duplication as well.
Acked-by: Jarno Rajahalme <jarno at ovn.org>
> On Jan 18, 2016, at 11:27 PM, Ben Pfaff <blp at ovn.org> wrote:
>
> Instead reconstruct it using the action set, since we already have the
> logic to do that.
>
> This seems a little nicer because we don't have to "trust" the metadata
> as much.
>
> Signed-off-by: Ben Pfaff <blp at ovn.org>
> ---
> ofproto/ofproto-dpif-rid.h | 3 ---
> ofproto/ofproto-dpif-xlate.c | 40 ++++++++++++++++++----------------------
> 2 files changed, 18 insertions(+), 25 deletions(-)
>
> diff --git a/ofproto/ofproto-dpif-rid.h b/ofproto/ofproto-dpif-rid.h
> index ba968ba..654c95c 100644
> --- a/ofproto/ofproto-dpif-rid.h
> +++ b/ofproto/ofproto-dpif-rid.h
> @@ -101,7 +101,6 @@ struct recirc_metadata {
> ovs_be64 metadata; /* OpenFlow Metadata. */
> uint64_t regs[FLOW_N_XREGS]; /* Registers. */
> ofp_port_t in_port; /* Incoming port. */
> - ofp_port_t actset_output; /* Output port in action set. */
> };
>
> static inline void
> @@ -113,7 +112,6 @@ recirc_metadata_from_flow(struct recirc_metadata *md,
> md->metadata = flow->metadata;
> memcpy(md->regs, flow->regs, sizeof md->regs);
> md->in_port = flow->in_port.ofp_port;
> - md->actset_output = flow->actset_output;
> }
>
> static inline void
> @@ -128,7 +126,6 @@ recirc_metadata_to_flow(const struct recirc_metadata *md,
> flow->metadata = md->metadata;
> memcpy(flow->regs, md->regs, sizeof flow->regs);
> flow->in_port.ofp_port = md->in_port;
> - flow->actset_output = md->actset_output;
> }
>
> /* State that flow translation can save, to restore when recirculation
> diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
> index 1140652..e3b46ab 100644
> --- a/ofproto/ofproto-dpif-xlate.c
> +++ b/ofproto/ofproto-dpif-xlate.c
> @@ -4074,12 +4074,9 @@ may_receive(const struct xport *xport, struct xlate_ctx *ctx)
> }
>
> static void
> -xlate_write_actions(struct xlate_ctx *ctx, const struct ofpact *a)
> +xlate_write_actions__(struct xlate_ctx *ctx,
> + const struct ofpact *ofpacts, size_t ofpacts_len)
> {
> - const struct ofpact_nest *on = ofpact_get_WRITE_ACTIONS(a);
> - size_t on_len = ofpact_nest_get_action_len(on);
> - const struct ofpact *inner;
> -
> /* Maintain actset_output depending on the contents of the action set:
> *
> * - OFPP_UNSET, if there is no "output" action.
> @@ -4090,10 +4087,11 @@ xlate_write_actions(struct xlate_ctx *ctx, const struct ofpact *a)
> * - OFPP_UNSET, if there is a "group" action.
> */
> if (!ctx->action_set_has_group) {
> - OFPACT_FOR_EACH (inner, on->actions, on_len) {
> - if (inner->type == OFPACT_OUTPUT) {
> - ctx->xin->flow.actset_output = ofpact_get_OUTPUT(inner)->port;
> - } else if (inner->type == OFPACT_GROUP) {
> + const struct ofpact *a;
> + OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) {
> + if (a->type == OFPACT_OUTPUT) {
> + ctx->xin->flow.actset_output = ofpact_get_OUTPUT(a)->port;
> + } else if (a->type == OFPACT_GROUP) {
> ctx->xin->flow.actset_output = OFPP_UNSET;
> ctx->action_set_has_group = true;
> break;
> @@ -4101,7 +4099,13 @@ xlate_write_actions(struct xlate_ctx *ctx, const struct ofpact *a)
> }
> }
>
> - ofpbuf_put(&ctx->action_set, on->actions, on_len);
> + ofpbuf_put(&ctx->action_set, ofpacts, ofpacts_len);
> +}
> +
> +static void
> +xlate_write_actions(struct xlate_ctx *ctx, const struct ofpact_nest *a)
> +{
> + xlate_write_actions__(ctx, a->actions, ofpact_nest_get_action_len(a));
> }
>
> static void
> @@ -4723,7 +4727,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
> break;
>
> case OFPACT_WRITE_ACTIONS:
> - xlate_write_actions(ctx, a);
> + xlate_write_actions(ctx, ofpact_get_WRITE_ACTIONS(a));
> break;
>
> case OFPACT_WRITE_METADATA:
> @@ -5175,20 +5179,12 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout)
>
> /* Restore action set, if any. */
> if (state->action_set_len) {
> - const struct ofpact *a;
> -
> xlate_report_actions(&ctx, "- Restoring action set",
> state->action_set, state->action_set_len);
>
> - ofpbuf_put(&ctx.action_set,
> - state->action_set, state->action_set_len);
> -
> - OFPACT_FOR_EACH (a, state->action_set, state->action_set_len) {
> - if (a->type == OFPACT_GROUP) {
> - ctx.action_set_has_group = true;
> - break;
> - }
> - }
> + flow->actset_output = OFPP_UNSET;
> + xlate_write_actions__(&ctx, state->action_set,
> + state->action_set_len);
> }
>
> /* Restore recirculation actions. If there are no actions, processing
> --
> 2.1.3
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
More information about the dev
mailing list