An upcoming commit will have a need to parse actions incrementally, so this change makes that easier to do.
Signed-off-by: Ben Pfaff <b...@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@openvswitch.org http://openvswitch.org/mailman/listinfo/dev