[ovs-dev] [PATCH 12/41] ofp-actions: Append in ofpacts_pull_openflow_actions(), instead of replace.
Jarno Rajahalme
jarno at ovn.org
Tue Jan 19 21:16:44 UTC 2016
Acked-by: Jarno Rajahalme <jarno at ovn.org>
> On Jan 18, 2016, at 11:26 PM, Ben Pfaff <blp at ovn.org> wrote:
>
> An upcoming commit will have a need to parse actions incrementally, so this
> change makes that easier to do.
>
> Signed-off-by: Ben Pfaff <blp at ovn.org>
> ---
> lib/ofp-actions.c | 20 ++++++++------------
> lib/ofp-util.c | 2 ++
> 2 files changed, 10 insertions(+), 12 deletions(-)
>
> diff --git a/lib/ofp-actions.c b/lib/ofp-actions.c
> index becf02d..ff3bc12 100644
> --- a/lib/ofp-actions.c
> +++ b/lib/ofp-actions.c
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015 Nicira, Inc.
> + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Nicira, Inc.
> *
> * Licensed under the Apache License, Version 2.0 (the "License");
> * you may not use this file except in compliance with the License.
> @@ -5631,12 +5631,9 @@ ofpacts_pull_openflow_actions__(struct ofpbuf *openflow,
> enum ofpact_type outer_action)
> {
> const struct ofp_action_header *actions;
> + size_t orig_size = ofpacts->size;
> enum ofperr error;
>
> - if (!outer_action) {
> - ofpbuf_clear(ofpacts);
> - }
> -
> if (actions_len % OFP_ACTION_ALIGN != 0) {
> VLOG_WARN_RL(&rl, "OpenFlow message actions length %u is not a "
> "multiple of %d", actions_len, OFP_ACTION_ALIGN);
> @@ -5653,21 +5650,21 @@ ofpacts_pull_openflow_actions__(struct ofpbuf *openflow,
>
> error = ofpacts_decode(actions, actions_len, version, ofpacts);
> if (error) {
> - ofpbuf_clear(ofpacts);
> + ofpacts->size = orig_size;
> return error;
> }
>
> error = ofpacts_verify(ofpacts->data, ofpacts->size, allowed_ovsinsts,
> outer_action);
> if (error) {
> - ofpbuf_clear(ofpacts);
> + ofpacts->size = orig_size;
> }
> return error;
> }
>
> -/* Attempts to convert 'actions_len' bytes of OpenFlow actions from the
> - * front of 'openflow' into ofpacts. On success, replaces any existing content
> - * in 'ofpacts' by the converted ofpacts; on failure, clears 'ofpacts'.
> +/* Attempts to convert 'actions_len' bytes of OpenFlow actions from the front
> + * of 'openflow' into ofpacts. On success, appends the converted actions to
> + * 'ofpacts'; on failure, 'ofpacts' is unchanged (but might be reallocated) .
> * Returns 0 if successful, otherwise an OpenFlow error.
> *
> * Actions are processed according to their OpenFlow version which
> @@ -6229,6 +6226,7 @@ ofpacts_pull_openflow_instructions(struct ofpbuf *openflow,
> const struct ofp11_instruction *insts[N_OVS_INSTRUCTIONS];
> enum ofperr error;
>
> + ofpbuf_clear(ofpacts);
> if (version == OFP10_VERSION) {
> return ofpacts_pull_openflow_actions__(openflow, instructions_len,
> version,
> @@ -6236,8 +6234,6 @@ ofpacts_pull_openflow_instructions(struct ofpbuf *openflow,
> ofpacts, 0);
> }
>
> - ofpbuf_clear(ofpacts);
> -
> if (instructions_len % OFP11_INSTRUCTION_ALIGN != 0) {
> VLOG_WARN_RL(&rl, "OpenFlow message instructions length %u is not a "
> "multiple of %d",
> diff --git a/lib/ofp-util.c b/lib/ofp-util.c
> index c1cbcea..58f7e23 100644
> --- a/lib/ofp-util.c
> +++ b/lib/ofp-util.c
> @@ -3672,6 +3672,7 @@ ofputil_decode_packet_out(struct ofputil_packet_out *po,
> ofpbuf_use_const(&b, oh, ntohs(oh->length));
> raw = ofpraw_pull_assert(&b);
>
> + ofpbuf_clear(ofpacts);
> if (raw == OFPRAW_OFPT11_PACKET_OUT) {
> enum ofperr error;
> const struct ofp11_packet_out *opo = ofpbuf_pull(&b, sizeof *opo);
> @@ -6265,6 +6266,7 @@ ofputil_decode_flow_update(struct ofputil_flow_update *update,
> ofpraw_pull_assert(msg);
> }
>
> + ofpbuf_clear(ofpacts);
> if (!msg->size) {
> return EOF;
> }
> --
> 2.1.3
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
More information about the dev
mailing list