Thanks, I pushed all the patches up to this one now.

On Tue, Jan 19, 2016 at 01:39:32PM -0800, Jarno Rajahalme wrote:
> Acked-by: Jarno Rajahalme <ja...@ovn.org>
> 
> > On Jan 18, 2016, at 11:27 PM, Ben Pfaff <b...@ovn.org> wrote:
> > 
> > Several OpenFlow 1.3+ messages use TLV-based properties that take a
> > common form.  Until now, ofp-util has had some static functions for
> > dealing with properties.  Because properties will start to be needed
> > outside of ofp-util, this commit breaks them out into a new library,
> > renaming them to begin with ofpprop_.
> > 
> > The following commit will add a few new interfaces that add new
> > functionality.
> > 
> > Signed-off-by: Ben Pfaff <b...@ovn.org>
> > ---
> > include/openflow/openflow-common.h |  28 +++++
> > lib/automake.mk                    |   2 +
> > lib/ofp-prop.c                     | 125 +++++++++++++++++++
> > lib/ofp-prop.h                     |  71 +++++++++++
> > lib/ofp-util.c                     | 246 
> > +++++++++++--------------------------
> > 5 files changed, 300 insertions(+), 172 deletions(-)
> > create mode 100644 lib/ofp-prop.c
> > create mode 100644 lib/ofp-prop.h
> > 
> > diff --git a/include/openflow/openflow-common.h 
> > b/include/openflow/openflow-common.h
> > index f152718..d2efa5f 100644
> > --- a/include/openflow/openflow-common.h
> > +++ b/include/openflow/openflow-common.h
> > @@ -209,6 +209,34 @@ enum ofp_port_features {
> >     OFPPF_10GB_FD    = 1 << 6,  /* 10 Gb full-duplex rate support. */
> > };
> > 
> > +/* Generic OpenFlow property header, as used by various messages in 
> > OF1.3+, and
> > + * especially in OF1.4.
> > + *
> > + * The OpenFlow specs prefer to define a new structure with a specialized 
> > name
> > + * each time this property structure comes up: struct
> > + * ofp_port_desc_prop_header, struct ofp_controller_status_prop_header, 
> > struct
> > + * ofp_table_mod_prop_header, and more.  They're all the same, so it's 
> > easier
> > + * to unify them.
> > + */
> > +struct ofp_prop_header {
> > +    ovs_be16 type;
> > +    ovs_be16 len;
> > +};
> > +OFP_ASSERT(sizeof(struct ofp_prop_header) == 4);
> > +
> > +/* Generic OpenFlow experimenter property header.
> > + *
> > + * Again the OpenFlow specs define this over and over again and it's 
> > easier to
> > + * unify them. */
> > +struct ofp_prop_experimenter {
> > +    ovs_be16 type;          /* Generally 0xffff (in one case 0xfffe). */
> > +    ovs_be16 len;           /* Length in bytes of this property. */
> > +    ovs_be32 experimenter;  /* Experimenter ID which takes the same form as
> > +                             * in struct ofp_experimenter_header. */
> > +    ovs_be32 exp_type;      /* Experimenter defined. */
> > +};
> > +OFP_ASSERT(sizeof(struct ofp_prop_experimenter) == 12);
> > +
> > /* Switch features. */
> > struct ofp_switch_features {
> >     ovs_be64 datapath_id;   /* Datapath unique ID.  The lower 48-bits are 
> > for
> > diff --git a/lib/automake.mk b/lib/automake.mk
> > index 4ff9fc0..39a652b 100644
> > --- a/lib/automake.mk
> > +++ b/lib/automake.mk
> > @@ -150,6 +150,8 @@ lib_libopenvswitch_la_SOURCES = \
> >     lib/ofp-parse.h \
> >     lib/ofp-print.c \
> >     lib/ofp-print.h \
> > +   lib/ofp-prop.c \
> > +   lib/ofp-prop.h \
> >     lib/ofp-util.c \
> >     lib/ofp-util.h \
> >     lib/ofp-version-opt.h \
> > diff --git a/lib/ofp-prop.c b/lib/ofp-prop.c
> > new file mode 100644
> > index 0000000..2d90e1b
> > --- /dev/null
> > +++ b/lib/ofp-prop.c
> > @@ -0,0 +1,125 @@
> > +/*
> > + * Copyright (c) 2014, 2015 Nicira, Inc.
> > + *
> > + * Licensed under the Apache License, Version 2.0 (the "License");
> > + * you may not use this file except in compliance with the License.
> > + * You may obtain a copy of the License at:
> > + *
> > + *     http://www.apache.org/licenses/LICENSE-2.0
> > + *
> > + * Unless required by applicable law or agreed to in writing, software
> > + * distributed under the License is distributed on an "AS IS" BASIS,
> > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> > + * See the License for the specific language governing permissions and
> > + * limitations under the License.
> > + */
> > +
> > +#include <config.h>
> > +
> > +#include "ofp-prop.h"
> > +
> > +#include "byte-order.h"
> > +#include "ofpbuf.h"
> > +#include "ofp-errors.h"
> > +#include "util.h"
> > +
> > +/* Pulls a property, beginning with struct ofp_prop_header, from the 
> > beginning
> > + * of 'msg'.  Stores the type of the property in '*typep' and, if 
> > 'property' is
> > + * nonnull, the entire property, including the header, in '*property'.  
> > Returns
> > + * 0 if successful, otherwise an OpenFlow error code.
> > + *
> > + * This function pulls the property's stated size padded out to a multiple 
> > of
> > + * 'alignment' bytes.  The common case in OpenFlow is an 'alignment' of 8, 
> > so
> > + * you can use ofpprop_pull() for that case. */
> > +enum ofperr
> > +ofpprop_pull__(struct ofpbuf *msg, struct ofpbuf *property,
> > +               unsigned int alignment, uint16_t *typep)
> > +{
> > +    struct ofp_prop_header *oph;
> > +    unsigned int padded_len;
> > +    unsigned int len;
> > +
> > +    if (msg->size < sizeof *oph) {
> > +        return OFPERR_OFPBPC_BAD_LEN;
> > +    }
> > +
> > +    oph = msg->data;
> > +    len = ntohs(oph->len);
> > +    padded_len = ROUND_UP(len, alignment);
> > +    if (len < sizeof *oph || padded_len > msg->size) {
> > +        return OFPERR_OFPBPC_BAD_LEN;
> > +    }
> > +
> > +    *typep = ntohs(oph->type);
> > +    if (property) {
> > +        ofpbuf_use_const(property, msg->data, len);
> > +    }
> > +    ofpbuf_pull(msg, padded_len);
> > +    return 0;
> > +}
> > +
> > +/* Pulls a property, beginning with struct ofp_prop_header, from the 
> > beginning
> > + * of 'msg'.  Stores the type of the property in '*typep' and, if 
> > 'property' is
> > + * nonnull, the entire property, including the header, in '*property'.  
> > Returns
> > + * 0 if successful, otherwise an error code.
> > + *
> > + * This function pulls the property's stated size padded out to a multiple 
> > of
> > + * 8 bytes, which is the common case for OpenFlow properties. */
> > +enum ofperr
> > +ofpprop_pull(struct ofpbuf *msg, struct ofpbuf *property, uint16_t *typep)
> > +{
> > +    return ofpprop_pull__(msg, property, 8, typep);
> > +}
> > +
> > +/* Adds a property with the given 'type' and 'len'-byte contents 'value' to
> > + * 'msg', padding the property out to a multiple of 8 bytes. */
> > +void
> > +ofpprop_put(struct ofpbuf *msg, uint16_t type, const void *value, size_t 
> > len)
> > +{
> > +    size_t start_ofs = ofpprop_start(msg, type);
> > +    ofpbuf_put(msg, value, len);
> > +    ofpprop_end(msg, start_ofs);
> > +}
> > +
> > +/* Appends a property to 'msg' whose type is 'type' and whose contents is a
> > + * series of property headers, one for each 1-bit in 'bitmap'. */
> > +void
> > +ofpprop_put_bitmap(struct ofpbuf *msg, uint16_t type, uint64_t bitmap)
> > +{
> > +    size_t start_ofs = ofpprop_start(msg, type);
> > +    for (; bitmap; bitmap = zero_rightmost_1bit(bitmap)) {
> > +        ofpprop_start(msg, rightmost_1bit_idx(bitmap));
> > +    }
> > +    ofpprop_end(msg, start_ofs);
> > +}
> > +
> > +/* Appends a header for a property of type 'type' to 'msg'.  The caller 
> > should
> > + * add the contents of the property to 'msg', then finish it by calling
> > + * ofpprop_end().  Returns the offset of the beginning of the property (to 
> > pass
> > + * to ofpprop_end() later). */
> > +size_t
> > +ofpprop_start(struct ofpbuf *msg, uint16_t type)
> > +{
> > +    size_t start_ofs = msg->size;
> > +    struct ofp_prop_header *oph;
> > +
> > +    oph = ofpbuf_put_uninit(msg, sizeof *oph);
> > +    oph->type = htons(type);
> > +    oph->len = htons(4);        /* May be updated later by ofpprop_end(). 
> > */
> > +    return start_ofs;
> > +}
> > +
> > +/* Finishes serializing a property that was begun with ofpprop_start(), by
> > + * padding 'msg' to a multiple of 8 bytes and updating the property's 
> > length.
> > + * 'start_ofs' should be the offset of the beginning of the property, as
> > + * returned by ofpprop_start(). */
> > +void
> > +ofpprop_end(struct ofpbuf *msg, size_t start_ofs)
> > +{
> > +    struct ofp_prop_header *oph;
> > +
> > +    oph = ofpbuf_at_assert(msg, start_ofs, sizeof *oph);
> > +    oph->len = htons(msg->size - start_ofs);
> > +    ofpbuf_padto(msg, ROUND_UP(msg->size, 8));
> > +}
> > +
> > diff --git a/lib/ofp-prop.h b/lib/ofp-prop.h
> > new file mode 100644
> > index 0000000..07d9799
> > --- /dev/null
> > +++ b/lib/ofp-prop.h
> > @@ -0,0 +1,71 @@
> > +/*
> > + * Copyright (c) 2014, 2015 Nicira, Inc.
> > + *
> > + * Licensed under the Apache License, Version 2.0 (the "License");
> > + * you may not use this file except in compliance with the License.
> > + * You may obtain a copy of the License at:
> > + *
> > + *     http://www.apache.org/licenses/LICENSE-2.0
> > + *
> > + * Unless required by applicable law or agreed to in writing, software
> > + * distributed under the License is distributed on an "AS IS" BASIS,
> > + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
> > + * See the License for the specific language governing permissions and
> > + * limitations under the License.
> > + */
> > +
> > +#ifndef OFP_PROP_H
> > +#define OFP_PROP_H 1
> > +
> > +/* OpenFlow 1.3+ property support
> > + * ==============================
> > + *
> > + * Several OpenFlow 1.3+ messages use properties that take the common form
> > + * shown by "struct ofp_prop_header".  This module provides support for
> > + * serializing and deserializing properties in this format.
> > + */
> > +
> > +#include <stddef.h>
> > +#include <stdint.h>
> > +#include "ofp-errors.h"
> > +#include "openvswitch/types.h"
> > +
> > +struct ofpbuf;
> > +
> > +/* Deserializing properties.  */
> > +enum ofperr ofpprop_pull__(struct ofpbuf *msg, struct ofpbuf *property,
> > +                           unsigned int alignment, uint16_t *typep);
> > +enum ofperr ofpprop_pull(struct ofpbuf *msg, struct ofpbuf *property,
> > +                         uint16_t *typep);
> > +
> > +/* Serializing properties. */
> > +void ofpprop_put(struct ofpbuf *, uint16_t type,
> > +                 const void *value, size_t len);
> > +void ofpprop_put_bitmap(struct ofpbuf *, uint16_t type, uint64_t bitmap);
> > +
> > +size_t ofpprop_start(struct ofpbuf *, uint16_t type);
> > +void ofpprop_end(struct ofpbuf *, size_t start_ofs);
> > +
> > +/* Logging errors while deserializing properties.
> > + *
> > + * The attitude that a piece of code should take when it deserializes an
> > + * unknown property type depends on the code in question:
> > + *
> > + *    - In a "loose" context (with LOOSE set to true), that is, where the 
> > code
> > + *      is parsing the property to find out about the state or the 
> > capabilities
> > + *      of some piece of the system, generally an unknown property type is 
> > not
> > + *      a big deal, because it only means that there is additional 
> > information
> > + *      that the receiver does not understand.
> > + *
> > + *    - In a "strict" context (with LOOSE set to false), that is, where the
> > + *      code is parsing the property to change the state or configuration 
> > of a
> > + *      part of the system, generally an unknown property type is an error,
> > + *      because it means that the receiver is being asked to configure the
> > + *      system in some way it doesn't understand.
> > + *
> > + * Given LOOSE, this macro automatically logs chooses an appropriate log
> > + * level. */
> > +#define OFPPROP_LOG(RL, LOOSE, ...)                         \
> > +    VLOG_RL(RL, (LOOSE) ? VLL_DBG : VLL_WARN, __VA_ARGS__)
> > +
> > +#endif /* ofp-prop.h */
> > diff --git a/lib/ofp-util.c b/lib/ofp-util.c
> > index 0c0b571..05cc6d1 100644
> > --- a/lib/ofp-util.c
> > +++ b/lib/ofp-util.c
> > @@ -36,6 +36,7 @@
> > #include "ofp-actions.h"
> > #include "ofp-errors.h"
> > #include "ofp-msgs.h"
> > +#include "ofp-prop.h"
> > #include "ofp-util.h"
> > #include "ofpbuf.h"
> > #include "openflow/netronome-ext.h"
> > @@ -62,81 +63,6 @@ static ovs_be32 ofputil_encode_table_config(enum 
> > ofputil_table_miss,
> >                                             enum ofputil_table_vacancy,
> >                                             enum ofp_version);
> > 
> > -struct ofp_prop_header {
> > -    ovs_be16 type;
> > -    ovs_be16 len;
> > -};
> > -
> > -struct ofp_prop_experimenter {
> > -    ovs_be16 type;          /* OFP*_EXPERIMENTER. */
> > -    ovs_be16 length;        /* Length in bytes of this property. */
> > -    ovs_be32 experimenter;  /* Experimenter ID which takes the same form as
> > -                             * in struct ofp_experimenter_header. */
> > -    ovs_be32 exp_type;      /* Experimenter defined. */
> > -};
> > -
> > -/* Pulls a property, beginning with struct ofp_prop_header, from the 
> > beginning
> > - * of 'msg'.  Stores the type of the property in '*typep' and, if 
> > 'property' is
> > - * nonnull, the entire property, including the header, in '*property'.  
> > Returns
> > - * 0 if successful, otherwise an error code.
> > - *
> > - * This function pulls the property's stated size padded out to a multiple 
> > of
> > - * 'alignment' bytes.  The common case in OpenFlow is an 'alignment' of 8, 
> > so
> > - * you can use ofputil_pull_property() for that case. */
> > -static enum ofperr
> > -ofputil_pull_property__(struct ofpbuf *msg, struct ofpbuf *property,
> > -                        unsigned int alignment, uint16_t *typep)
> > -{
> > -    struct ofp_prop_header *oph;
> > -    unsigned int padded_len;
> > -    unsigned int len;
> > -
> > -    if (msg->size < sizeof *oph) {
> > -        return OFPERR_OFPBPC_BAD_LEN;
> > -    }
> > -
> > -    oph = msg->data;
> > -    len = ntohs(oph->len);
> > -    padded_len = ROUND_UP(len, alignment);
> > -    if (len < sizeof *oph || padded_len > msg->size) {
> > -        return OFPERR_OFPBPC_BAD_LEN;
> > -    }
> > -
> > -    *typep = ntohs(oph->type);
> > -    if (property) {
> > -        ofpbuf_use_const(property, msg->data, len);
> > -    }
> > -    ofpbuf_pull(msg, padded_len);
> > -    return 0;
> > -}
> > -
> > -/* Pulls a property, beginning with struct ofp_prop_header, from the 
> > beginning
> > - * of 'msg'.  Stores the type of the property in '*typep' and, if 
> > 'property' is
> > - * nonnull, the entire property, including the header, in '*property'.  
> > Returns
> > - * 0 if successful, otherwise an error code.
> > - *
> > - * This function pulls the property's stated size padded out to a multiple 
> > of
> > - * 8 bytes, which is the common case for OpenFlow properties. */
> > -static enum ofperr
> > -ofputil_pull_property(struct ofpbuf *msg, struct ofpbuf *property,
> > -                      uint16_t *typep)
> > -{
> > -    return ofputil_pull_property__(msg, property, 8, typep);
> > -}
> > -
> > -static void OVS_PRINTF_FORMAT(2, 3)
> > -log_property(bool loose, const char *message, ...)
> > -{
> > -    enum vlog_level level = loose ? VLL_DBG : VLL_WARN;
> > -    if (!vlog_should_drop(THIS_MODULE, level, &bad_ofmsg_rl)) {
> > -        va_list args;
> > -
> > -        va_start(args, message);
> > -        vlog_valist(THIS_MODULE, level, message, args);
> > -        va_end(args);
> > -    }
> > -}
> > -
> > static enum ofperr
> > ofputil_check_mask(uint16_t type, uint32_t mask)
> > {
> > @@ -187,40 +113,6 @@ ofputil_check_mask(uint16_t type, uint32_t mask)
> >     return 0;
> > }
> > 
> > -static size_t
> > -start_property(struct ofpbuf *msg, uint16_t type)
> > -{
> > -    size_t start_ofs = msg->size;
> > -    struct ofp_prop_header *oph;
> > -
> > -    oph = ofpbuf_put_uninit(msg, sizeof *oph);
> > -    oph->type = htons(type);
> > -    oph->len = htons(4);        /* May be updated later by end_property(). 
> > */
> > -    return start_ofs;
> > -}
> > -
> > -static void
> > -end_property(struct ofpbuf *msg, size_t start_ofs)
> > -{
> > -    struct ofp_prop_header *oph;
> > -
> > -    oph = ofpbuf_at_assert(msg, start_ofs, sizeof *oph);
> > -    oph->len = htons(msg->size - start_ofs);
> > -    ofpbuf_padto(msg, ROUND_UP(msg->size, 8));
> > -}
> > -
> > -/* Appends a property to 'msg' whose type is 'type' and whose contents is a
> > - * series of property headers, one for each 1-bit in 'bitmap'. */
> > -static void
> > -put_bitmap_property(struct ofpbuf *msg, uint16_t type, uint64_t bitmap)
> > -{
> > -    size_t start_ofs = start_property(msg, type);
> > -    for (; bitmap; bitmap = zero_rightmost_1bit(bitmap)) {
> > -        start_property(msg, rightmost_1bit_idx(bitmap));
> > -    }
> > -    end_property(msg, start_ofs);
> > -}
> > -
> > /* Given the wildcard bit count in the least-significant 6 of 'wcbits', 
> > returns
> >  * an IP netmask with a 1 in each bit that must match and a 0 in each bit 
> > that
> >  * is wildcarded.
> > @@ -3895,7 +3787,7 @@ ofputil_pull_ofp14_port(struct ofputil_phy_port *pp, 
> > struct ofpbuf *msg)
> >         enum ofperr error;
> >         uint16_t type;
> > 
> > -        error = ofputil_pull_property(&properties, &payload, &type);
> > +        error = ofpprop_pull(&properties, &payload, &type);
> >         if (error) {
> >             return error;
> >         }
> > @@ -3906,7 +3798,8 @@ ofputil_pull_ofp14_port(struct ofputil_phy_port *pp, 
> > struct ofpbuf *msg)
> >             break;
> > 
> >         default:
> > -            log_property(true, "unknown port property %"PRIu16, type);
> > +            OFPPROP_LOG(&bad_ofmsg_rl, true,
> > +                        "unknown port property %"PRIu16, type);
> >             error = 0;
> >             break;
> >         }
> > @@ -4499,7 +4392,7 @@ ofputil_decode_port_mod(const struct ofp_header *oh,
> >             enum ofperr error;
> >             uint16_t type;
> > 
> > -            error = ofputil_pull_property(&b, &property, &type);
> > +            error = ofpprop_pull(&b, &property, &type);
> >             if (error) {
> >                 return error;
> >             }
> > @@ -4510,7 +4403,8 @@ ofputil_decode_port_mod(const struct ofp_header *oh,
> >                 break;
> > 
> >             default:
> > -                log_property(loose, "unknown port_mod property %"PRIu16, 
> > type);
> > +                OFPPROP_LOG(&bad_ofmsg_rl, loose,
> > +                            "unknown port_mod property %"PRIu16, type);
> >                 if (loose) {
> >                     error = 0;
> >                 } else if (type == OFPPMPT14_EXPERIMENTER) {
> > @@ -4606,7 +4500,7 @@ pull_table_feature_property(struct ofpbuf *msg, 
> > struct ofpbuf *payload,
> > {
> >     enum ofperr error;
> > 
> > -    error = ofputil_pull_property(msg, payload, typep);
> > +    error = ofpprop_pull(msg, payload, typep);
> >     if (payload && !error) {
> >         ofpbuf_pull(payload, sizeof(struct ofp_prop_header));
> >     }
> > @@ -4623,7 +4517,7 @@ parse_action_bitmap(struct ofpbuf *payload, enum 
> > ofp_version ofp_version,
> >         uint16_t type;
> >         enum ofperr error;
> > 
> > -        error = ofputil_pull_property__(payload, NULL, 1, &type);
> > +        error = ofpprop_pull__(payload, NULL, 1, &type);
> >         if (error) {
> >             return error;
> >         }
> > @@ -4654,7 +4548,7 @@ parse_instruction_ids(struct ofpbuf *payload, bool 
> > loose, uint32_t *insts)
> >          *
> >          * Anyway, we just assume they're all glommed together on byte
> >          * boundaries. */
> > -        error = ofputil_pull_property__(payload, NULL, 1, &ofpit);
> > +        error = ofpprop_pull__(payload, NULL, 1, &ofpit);
> >         if (error) {
> >             return error;
> >         }
> > @@ -4858,8 +4752,8 @@ ofputil_decode_table_features(struct ofpbuf *msg,
> >         case OFPTFPT13_EXPERIMENTER:
> >         case OFPTFPT13_EXPERIMENTER_MISS:
> >         default:
> > -            log_property(loose, "unknown table features property %"PRIu16,
> > -                         type);
> > +            OFPPROP_LOG(&bad_ofmsg_rl, loose,
> > +                        "unknown table features property %"PRIu16, type);
> >             error = loose ? 0 : OFPERR_OFPBPC_BAD_TYPE;
> >             break;
> >         }
> > @@ -4921,12 +4815,12 @@ put_fields_property(struct ofpbuf *reply,
> >     size_t start_ofs;
> >     int field;
> > 
> > -    start_ofs = start_property(reply, property);
> > +    start_ofs = ofpprop_start(reply, property);
> >     BITMAP_FOR_EACH_1 (field, MFF_N_IDS, fields->bm) {
> >         nx_put_header(reply, field, version,
> >                       masks && bitmap_is_set(masks->bm, field));
> >     }
> > -    end_property(reply, start_ofs);
> > +    ofpprop_end(reply, start_ofs);
> > }
> > 
> > static void
> > @@ -4936,9 +4830,9 @@ put_table_action_features(struct ofpbuf *reply,
> >                           enum ofp13_table_feature_prop_type 
> > set_fields_type,
> >                           int miss_offset, enum ofp_version version)
> > {
> > -    put_bitmap_property(reply, actions_type + miss_offset,
> > -                        ntohl(ofpact_bitmap_to_openflow(taf->ofpacts,
> > -                                                        version)));
> > +    ofpprop_put_bitmap(reply, actions_type + miss_offset,
> > +                       ntohl(ofpact_bitmap_to_openflow(taf->ofpacts,
> > +                                                       version)));
> >     put_fields_property(reply, &taf->set_fields, NULL,
> >                         set_fields_type + miss_offset, version);
> > }
> > @@ -4951,15 +4845,15 @@ put_table_instruction_features(
> >     size_t start_ofs;
> >     uint8_t table_id;
> > 
> > -    put_bitmap_property(reply, OFPTFPT13_INSTRUCTIONS + miss_offset,
> > -                        ntohl(ovsinst_bitmap_to_openflow(tif->instructions,
> > -                                                         version)));
> > +    ofpprop_put_bitmap(reply, OFPTFPT13_INSTRUCTIONS + miss_offset,
> > +                       ntohl(ovsinst_bitmap_to_openflow(tif->instructions,
> > +                                                        version)));
> > 
> > -    start_ofs = start_property(reply, OFPTFPT13_NEXT_TABLES + miss_offset);
> > +    start_ofs = ofpprop_start(reply, OFPTFPT13_NEXT_TABLES + miss_offset);
> >     BITMAP_FOR_EACH_1 (table_id, 255, tif->next) {
> >         ofpbuf_put(reply, &table_id, 1);
> >     }
> > -    end_property(reply, start_ofs);
> > +    ofpprop_end(reply, start_ofs);
> > 
> >     put_table_action_features(reply, &tif->write,
> >                               OFPTFPT13_WRITE_ACTIONS,
> > @@ -5085,7 +4979,7 @@ ofputil_decode_table_desc(struct ofpbuf *msg,
> >         enum ofperr error;
> >         uint16_t type;
> > 
> > -        error = ofputil_pull_property(&properties, &payload, &type);
> > +        error = ofpprop_pull(&properties, &payload, &type);
> >         if (error) {
> >             return error;
> >         }
> > @@ -5100,7 +4994,8 @@ ofputil_decode_table_desc(struct ofpbuf *msg,
> >             break;
> > 
> >         default:
> > -            log_property(true, "unknown table_desc property %"PRIu16, 
> > type);
> > +            OFPPROP_LOG(&bad_ofmsg_rl, true,
> > +                        "unknown table_desc property %"PRIu16, type);
> >             error = 0;
> >             break;
> >         }
> > @@ -5188,20 +5083,20 @@ parse_table_mod_vacancy_property(struct ofpbuf 
> > *property,
> >     tm->table_vacancy.vacancy_down = otv->vacancy_down;
> >     tm->table_vacancy.vacancy_up = otv->vacancy_up;
> >     if (tm->table_vacancy.vacancy_down > tm->table_vacancy.vacancy_up) {
> > -        log_property(false, "Value of vacancy_down is greater than "
> > -                     "vacancy_up");
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false,
> > +                    "Value of vacancy_down is greater than vacancy_up");
> >         return OFPERR_OFPBPC_BAD_VALUE;
> >     }
> >     if (tm->table_vacancy.vacancy_down > 100 ||
> >         tm->table_vacancy.vacancy_up > 100) {
> > -        log_property(false, "Vacancy threshold percentage should not be"
> > -                     "greater than 100");
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false, "Vacancy threshold percentage "
> > +                    "should not be greater than 100");
> >         return OFPERR_OFPBPC_BAD_VALUE;
> >     }
> >     tm->table_vacancy.vacancy = otv->vacancy;
> >     if (tm->table_vacancy.vacancy) {
> > -        log_property(false, "Vacancy value should be zero for table-mod "
> > -                     "messages");
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false,
> > +                    "Vacancy value should be zero for table-mod messages");
> >         return OFPERR_OFPBPC_BAD_VALUE;
> >     }
> >     return 0;
> > @@ -5373,7 +5268,7 @@ ofputil_decode_table_mod(const struct ofp_header *oh,
> >             enum ofperr error;
> >             uint16_t type;
> > 
> > -            error = ofputil_pull_property(&b, &property, &type);
> > +            error = ofpprop_pull(&b, &property, &type);
> >             if (error) {
> >                 return error;
> >             }
> > @@ -7294,7 +7189,7 @@ ofputil_pull_ofp14_port_stats(struct 
> > ofputil_port_stats *ops,
> >         enum ofperr error;
> >         uint16_t type;
> > 
> > -        error = ofputil_pull_property(&properties, &payload, &type);
> > +        error = ofpprop_pull(&properties, &payload, &type);
> >         if (error) {
> >             return error;
> >         }
> > @@ -7305,7 +7200,8 @@ ofputil_pull_ofp14_port_stats(struct 
> > ofputil_port_stats *ops,
> >             break;
> > 
> >         default:
> > -            log_property(true, "unknown port stats property %"PRIu16, 
> > type);
> > +            OFPPROP_LOG(&bad_ofmsg_rl, true,
> > +                        "unknown port stats property %"PRIu16, type);
> >             error = 0;
> >             break;
> >         }
> > @@ -7908,11 +7804,11 @@ ofputil_put_ofp15_group_bucket_prop_weight(ovs_be16 
> > weight,
> >     size_t start_ofs;
> >     struct ofp15_group_bucket_prop_weight *prop;
> > 
> > -    start_ofs = start_property(openflow, OFPGBPT15_WEIGHT);
> > +    start_ofs = ofpprop_start(openflow, OFPGBPT15_WEIGHT);
> >     ofpbuf_put_zeros(openflow, sizeof *prop - sizeof(struct 
> > ofp_prop_header));
> >     prop = ofpbuf_at_assert(openflow, start_ofs, sizeof *prop);
> >     prop->weight = weight;
> > -    end_property(openflow, start_ofs);
> > +    ofpprop_end(openflow, start_ofs);
> > }
> > 
> > static void
> > @@ -7922,11 +7818,11 @@ ofputil_put_ofp15_group_bucket_prop_watch(ovs_be32 
> > watch, uint16_t type,
> >     size_t start_ofs;
> >     struct ofp15_group_bucket_prop_watch *prop;
> > 
> > -    start_ofs = start_property(openflow, type);
> > +    start_ofs = ofpprop_start(openflow, type);
> >     ofpbuf_put_zeros(openflow, sizeof *prop - sizeof(struct 
> > ofp_prop_header));
> >     prop = ofpbuf_at_assert(openflow, start_ofs, sizeof *prop);
> >     prop->watch = watch;
> > -    end_property(openflow, start_ofs);
> > +    ofpprop_end(openflow, start_ofs);
> > }
> > 
> > static void
> > @@ -7985,7 +7881,7 @@ ofputil_put_group_prop_ntr_selection_method(enum 
> > ofp_version ofp_version,
> >     prop->exp_type = htonl(NTRT_SELECTION_METHOD);
> >     strcpy(prop->selection_method, gp->selection_method);
> >     prop->selection_method_param = htonll(gp->selection_method_param);
> > -    end_property(openflow, start);
> > +    ofpprop_end(openflow, start);
> > }
> > 
> > static void
> > @@ -8145,8 +8041,8 @@ parse_ofp15_group_bucket_prop_weight(const struct 
> > ofpbuf *payload,
> >     struct ofp15_group_bucket_prop_weight *prop = payload->data;
> > 
> >     if (payload->size != sizeof *prop) {
> > -        log_property(false, "OpenFlow bucket weight property length "
> > -                     "%u is not valid", payload->size);
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false, "OpenFlow bucket weight property 
> > "
> > +                    "length %u is not valid", payload->size);
> >         return OFPERR_OFPBPC_BAD_LEN;
> >     }
> > 
> > @@ -8162,8 +8058,8 @@ parse_ofp15_group_bucket_prop_watch(const struct 
> > ofpbuf *payload,
> >     struct ofp15_group_bucket_prop_watch *prop = payload->data;
> > 
> >     if (payload->size != sizeof *prop) {
> > -        log_property(false, "OpenFlow bucket watch port or group "
> > -                     "property length %u is not valid", payload->size);
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false, "OpenFlow bucket watch port or "
> > +                    "group property length %u is not valid", 
> > payload->size);
> >         return OFPERR_OFPBPC_BAD_LEN;
> >     }
> > 
> > @@ -8234,7 +8130,7 @@ ofputil_pull_ofp15_buckets(struct ofpbuf *msg, size_t 
> > buckets_length,
> >             struct ofpbuf payload;
> >             uint16_t type;
> > 
> > -            err = ofputil_pull_property(&properties, &payload, &type);
> > +            err = ofpprop_pull(&properties, &payload, &type);
> >             if (err) {
> >                 goto err;
> >             }
> > @@ -8255,8 +8151,8 @@ ofputil_pull_ofp15_buckets(struct ofpbuf *msg, size_t 
> > buckets_length,
> >                 break;
> > 
> >             default:
> > -                log_property(false, "unknown group bucket property 
> > %"PRIu16,
> > -                             type);
> > +                OFPPROP_LOG(&bad_ofmsg_rl, false,
> > +                            "unknown group bucket property %"PRIu16, type);
> >                 err = OFPERR_OFPBPC_BAD_TYPE;
> >                 break;
> >             }
> > @@ -8327,8 +8223,8 @@ parse_group_prop_ntr_selection_method(struct ofpbuf 
> > *payload,
> >     case OFPGT11_ALL:
> >     case OFPGT11_INDIRECT:
> >     case OFPGT11_FF:
> > -        log_property(false, "ntr selection method property is only allowed 
> > "
> > -                     "for select groups");
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false, "ntr selection method property 
> > is "
> > +                    "only allowed for select groups");
> >         return OFPERR_OFPBPC_BAD_VALUE;
> >     default:
> >         OVS_NOT_REACHED();
> > @@ -8341,29 +8237,31 @@ parse_group_prop_ntr_selection_method(struct ofpbuf 
> > *payload,
> >     case OFPGC15_DELETE:
> >     case OFPGC15_INSERT_BUCKET:
> >     case OFPGC15_REMOVE_BUCKET:
> > -        log_property(false, "ntr selection method property is only allowed 
> > "
> > -                     "for add and delete group modifications");
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false, "ntr selection method property 
> > is "
> > +                    "only allowed for add and delete group modifications");
> >         return OFPERR_OFPBPC_BAD_VALUE;
> >     default:
> >         OVS_NOT_REACHED();
> >     }
> > 
> >     if (payload->size < sizeof *prop) {
> > -        log_property(false, "ntr selection method property length "
> > -                     "%u is not valid", payload->size);
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false, "ntr selection method property "
> > +                    "length %u is not valid", payload->size);
> >         return OFPERR_OFPBPC_BAD_LEN;
> >     }
> > 
> >     method_len = strnlen(prop->selection_method, 
> > NTR_MAX_SELECTION_METHOD_LEN);
> > 
> >     if (method_len == NTR_MAX_SELECTION_METHOD_LEN) {
> > -        log_property(false, "ntr selection method is not null terminated");
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false,
> > +                    "ntr selection method is not null terminated");
> >         return OFPERR_OFPBPC_BAD_VALUE;
> >     }
> > 
> >     if (strcmp("hash", prop->selection_method)) {
> > -        log_property(false, "ntr selection method '%s' is not supported",
> > -                     prop->selection_method);
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false,
> > +                    "ntr selection method '%s' is not supported",
> > +                    prop->selection_method);
> >         return OFPERR_OFPBPC_BAD_VALUE;
> >     }
> > 
> > @@ -8371,8 +8269,8 @@ parse_group_prop_ntr_selection_method(struct ofpbuf 
> > *payload,
> >     gp->selection_method_param = ntohll(prop->selection_method_param);
> > 
> >     if (!method_len && gp->selection_method_param) {
> > -        log_property(false, "ntr selection method parameter is non-zero 
> > but "
> > -                     "selection method is empty");
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false, "ntr selection method parameter 
> > is "
> > +                    "non-zero but selection method is empty");
> >         return OFPERR_OFPBPC_BAD_VALUE;
> >     }
> > 
> > @@ -8380,15 +8278,16 @@ parse_group_prop_ntr_selection_method(struct ofpbuf 
> > *payload,
> > 
> >     fields_len = ntohs(prop->length) - sizeof *prop;
> >     if (!method_len && fields_len) {
> > -        log_property(false, "ntr selection method parameter is zero "
> > -                     "but fields are provided");
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false, "ntr selection method parameter 
> > is "
> > +                    "zero but fields are provided");
> >         return OFPERR_OFPBPC_BAD_VALUE;
> >     }
> > 
> >     error = oxm_pull_field_array(payload->data, fields_len,
> >                                  &gp->fields);
> >     if (error) {
> > -        log_property(false, "ntr selection method fields are invalid");
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false,
> > +                    "ntr selection method fields are invalid");
> >         return error;
> >     }
> > 
> > @@ -8410,8 +8309,9 @@ parse_group_prop_ntr(struct ofpbuf *payload, uint32_t 
> > exp_type,
> >         break;
> > 
> >     default:
> > -        log_property(false, "unknown group property ntr experimenter type "
> > -                     "%"PRIu32, exp_type);
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false,
> > +                    "unknown group property ntr experimenter type %"PRIu32,
> > +                    exp_type);
> >         error = OFPERR_OFPBPC_BAD_TYPE;
> >         break;
> >     }
> > @@ -8445,8 +8345,9 @@ parse_ofp15_group_prop_exp(struct ofpbuf *payload,
> >         break;
> > 
> >     default:
> > -        log_property(false, "unknown group property experimenter %"PRIu16,
> > -                     experimenter);
> > +        OFPPROP_LOG(&bad_ofmsg_rl, false,
> > +                    "unknown group property experimenter %"PRIu16,
> > +                    experimenter);
> >         error = OFPERR_OFPBPC_BAD_EXPERIMENTER;
> >         break;
> >     }
> > @@ -8471,7 +8372,7 @@ parse_ofp15_group_properties(struct ofpbuf *msg,
> >         enum ofperr error;
> >         uint16_t type;
> > 
> > -        error = ofputil_pull_property(&properties, &payload, &type);
> > +        error = ofpprop_pull(&properties, &payload, &type);
> >         if (error) {
> >             return error;
> >         }
> > @@ -8483,7 +8384,8 @@ parse_ofp15_group_properties(struct ofpbuf *msg,
> >             break;
> > 
> >         default:
> > -            log_property(false, "unknown group property %"PRIu16, type);
> > +            OFPPROP_LOG(&bad_ofmsg_rl, false,
> > +                        "unknown group property %"PRIu16, type);
> >             error = OFPERR_OFPBPC_BAD_TYPE;
> >             break;
> >         }
> > @@ -9700,7 +9602,7 @@ ofputil_decode_set_async_config(const struct 
> > ofp_header *oh,
> >             enum ofperr error;
> >             uint16_t type;
> > 
> > -            error = ofputil_pull_property(&b, &property, &type);
> > +            error = ofpprop_pull(&b, &property, &type);
> >             if (error) {
> >                 return error;
> >             }
> > -- 
> > 2.1.3
> > 
> > _______________________________________________
> > dev mailing list
> > dev@openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
> 
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to