With a minor function naming question below:

Acked-by: Jarno Rajahalme <ja...@ovn.org>

> On Jan 18, 2016, at 11:26 PM, Ben Pfaff <b...@ovn.org> wrote:
> 
> At first glance, OF1.4 queue properties look a lot like those for OF1.0
> to OF1.3, but in fact their different padding makes them incompatible.  In
> addition, OF1.4 switches from using regular OpenFlow messages to request
> queue properties, to using multipart messages.  Thus, we really need to
> use separate code to deal with OF1.4 queues.
> 
> OF1.0, OF1.1, and OF1.2 all have slightly different queue config reply
> messages, but only OF1.0 and OF1.2 had tests, so this adds tests.  (There
> is no test for OF1.3 because it's the same as OF1.2.)
> 
> Signed-off-by: Ben Pfaff <b...@ovn.org>
> ---
> include/openflow/openflow-1.0.h    | 37 ++++++++++++++++++++++++++++++++++++-
> include/openflow/openflow-common.h | 23 -----------------------
> lib/ofp-util.c                     | 27 ++++++++++++++-------------
> tests/ofp-print.at                 | 15 +++++++++++++++
> tests/ofproto.at                   | 14 ++++++++++++++
> 5 files changed, 79 insertions(+), 37 deletions(-)
> 
> diff --git a/include/openflow/openflow-1.0.h b/include/openflow/openflow-1.0.h
> index 54b15f2..db629f7 100644
> --- a/include/openflow/openflow-1.0.h
> +++ b/include/openflow/openflow-1.0.h
> @@ -1,5 +1,5 @@
> /*
> - * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 2014 Nicira, Inc.
> + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013, 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.
> @@ -137,6 +137,41 @@ struct ofp10_packet_queue {
> };
> OFP_ASSERT(sizeof(struct ofp10_packet_queue) == 8);
> 
> +/* Queue properties for OF1.0 to OF1.3.
> + *
> + * OF1.4+ use the same numbers but rename them and change the property 
> formats
> + * in incompatible ways, so there's not much benefit to sharing the names. */
> +enum ofp10_queue_properties {
> +    /* Introduced in OF1.0. */
> +    OFPQT10_MIN_RATE = 1,          /* Minimum datarate guaranteed. */
> +
> +    /* Introduced in OF1.1. */
> +    OFPQT11_MAX_RATE = 2,          /* Maximum guaranteed rate. */
> +    OFPQT11_EXPERIMENTER = 0xffff, /* Experimenter defined property. */
> +};
> +
> +/* Description for a queue in OpenFlow 1.0 to 1.3.
> + *
> + * OF1.4+ also use a TLV format but an incompatible one. */
> +struct ofp10_queue_prop_header {
> +    ovs_be16 property; /* One of OFPQT*. */
> +    ovs_be16 len;      /* Length of property, including this header. */
> +    uint8_t pad[4];    /* 64-bit alignemnt. */
> +};
> +OFP_ASSERT(sizeof(struct ofp10_queue_prop_header) == 8);
> +
> +/* Min-Rate and Max-Rate queue property description (OFPQT10_MIN and
> + * OFPQT11_MAX).
> + *
> + * OF1.4+ use similar TLVs but they are incompatible due to different 
> padding.
> + */
> +struct ofp10_queue_prop_rate {
> +    struct ofp10_queue_prop_header prop_header;
> +    ovs_be16 rate;        /* In 1/10 of a percent; >1000 -> disabled. */
> +    uint8_t pad[6];       /* 64-bit alignment */
> +};
> +OFP_ASSERT(sizeof(struct ofp10_queue_prop_rate) == 16);
> +
> /* Query for port queue configuration. */
> struct ofp10_queue_get_config_request {
>     ovs_be16 port;          /* Port to be queried. Should refer
> diff --git a/include/openflow/openflow-common.h 
> b/include/openflow/openflow-common.h
> index 81f9120..f152718 100644
> --- a/include/openflow/openflow-common.h
> +++ b/include/openflow/openflow-common.h
> @@ -209,29 +209,6 @@ enum ofp_port_features {
>     OFPPF_10GB_FD    = 1 << 6,  /* 10 Gb full-duplex rate support. */
> };
> 
> -enum ofp_queue_properties {
> -    OFPQT_MIN_RATE = 1,          /* Minimum datarate guaranteed. */
> -    OFPQT_MAX_RATE = 2,          /* Maximum guaranteed rate. */
> -    OFPQT_EXPERIMENTER = 0xffff, /* Experimenter defined property. */
> -};
> -
> -/* Common description for a queue. */
> -struct ofp_queue_prop_header {
> -    ovs_be16 property; /* One of OFPQT_. */
> -    ovs_be16 len;      /* Length of property, including this header. */
> -    uint8_t pad[4];    /* 64-bit alignemnt. */
> -};
> -OFP_ASSERT(sizeof(struct ofp_queue_prop_header) == 8);
> -
> -/* Min-Rate and Max-Rate queue property description (OFPQT_MIN and
> - * OFPQT_MAX). */
> -struct ofp_queue_prop_rate {
> -    struct ofp_queue_prop_header prop_header;
> -    ovs_be16 rate;        /* In 1/10 of a percent; >1000 -> disabled. */
> -    uint8_t pad[6];       /* 64-bit alignment */
> -};
> -OFP_ASSERT(sizeof(struct ofp_queue_prop_rate) == 16);
> -
> /* Switch features. */
> struct ofp_switch_features {
>     ovs_be64 datapath_id;   /* Datapath unique ID.  The lower 48-bits are for
> diff --git a/lib/ofp-util.c b/lib/ofp-util.c
> index effd96a..c1cbcea 100644
> --- a/lib/ofp-util.c
> +++ b/lib/ofp-util.c
> @@ -2554,11 +2554,11 @@ ofputil_encode_queue_get_config_reply(const struct 
> ofp_header *oh)
> }
> 
> static void
> -put_queue_rate(struct ofpbuf *reply, enum ofp_queue_properties property,
> -               uint16_t rate)
> +put_ofp11_queue_rate(struct ofpbuf *reply,
> +                     enum ofp10_queue_properties property, uint16_t rate)

It is unclear to me why this function would not be called 
‘put_ofp10_queue_rate’ instead?

> {
>     if (rate != UINT16_MAX) {
> -        struct ofp_queue_prop_rate *oqpr;
> +        struct ofp10_queue_prop_rate *oqpr;
> 
>         oqpr = ofpbuf_put_zeros(reply, sizeof *oqpr);
>         oqpr->prop_header.property = htons(property);
> @@ -2593,8 +2593,8 @@ ofputil_append_queue_get_config_reply(struct ofpbuf 
> *reply,
>         len_ofs = (char *) &opq12->len - (char *) reply->data;
>     }
> 
> -    put_queue_rate(reply, OFPQT_MIN_RATE, oqc->min_rate);
> -    put_queue_rate(reply, OFPQT_MAX_RATE, oqc->max_rate);
> +    put_ofp11_queue_rate(reply, OFPQT10_MIN_RATE, oqc->min_rate);
> +    put_ofp11_queue_rate(reply, OFPQT11_MAX_RATE, oqc->max_rate);
> 
>     len = ofpbuf_at(reply, len_ofs, sizeof *len);
>     *len = htons(reply->size - start_ofs);
> @@ -2628,12 +2628,13 @@ ofputil_decode_queue_get_config_reply(struct ofpbuf 
> *reply, ofp_port_t *port)
> }
> 
> static enum ofperr
> -parse_queue_rate(const struct ofp_queue_prop_header *hdr, uint16_t *rate)
> +parse_ofp11_queue_rate(const struct ofp10_queue_prop_header *hdr,
> +                       uint16_t *rate)

Same here.

> {
> -    const struct ofp_queue_prop_rate *oqpr;
> +    const struct ofp10_queue_prop_rate *oqpr;
> 
>     if (hdr->len == htons(sizeof *oqpr)) {
> -        oqpr = (const struct ofp_queue_prop_rate *) hdr;
> +        oqpr = (const struct ofp10_queue_prop_rate *) hdr;
>         *rate = ntohs(oqpr->rate);
>         return 0;
>     } else {
> @@ -2692,7 +2693,7 @@ ofputil_pull_queue_get_config_reply(struct ofpbuf 
> *reply,
>     len -= opq_len;
> 
>     while (len > 0) {
> -        const struct ofp_queue_prop_header *hdr;
> +        const struct ofp10_queue_prop_header *hdr;
>         unsigned int property;
>         unsigned int prop_len;
>         enum ofperr error = 0;
> @@ -2705,12 +2706,12 @@ ofputil_pull_queue_get_config_reply(struct ofpbuf 
> *reply,
> 
>         property = ntohs(hdr->property);
>         switch (property) {
> -        case OFPQT_MIN_RATE:
> -            error = parse_queue_rate(hdr, &queue->min_rate);
> +        case OFPQT10_MIN_RATE:
> +            error = parse_ofp11_queue_rate(hdr, &queue->min_rate);
>             break;
> 
> -        case OFPQT_MAX_RATE:
> -            error = parse_queue_rate(hdr, &queue->max_rate);
> +        case OFPQT11_MAX_RATE:
> +            error = parse_ofp11_queue_rate(hdr, &queue->max_rate);
>             break;
> 
>         default:
> diff --git a/tests/ofp-print.at b/tests/ofp-print.at
> index 6fae7f0..24e602e 100644
> --- a/tests/ofp-print.at
> +++ b/tests/ofp-print.at
> @@ -2561,6 +2561,21 @@ queue 17476:
> ])
> AT_CLEANUP
> 
> +AT_SETUP([OFPT_QUEUE_GET_CONFIG_REPLY - OF1.1])
> +AT_KEYWORDS([ofp-print])
> +AT_CHECK([ovs-ofctl ofp-print "02 17 00 40 00 00 00 01 \
> +00 00 00 01 00 00 00 00 \
> +00 00 55 55 00 28 00 00 \
> +00 01 00 10 00 00 00 00 01 f4 00 00 00 00 00 00 \
> +00 02 00 10 00 00 00 00 02 ee 00 00 00 00 00 00 \
> +00 00 44 44 00 08 00 00 \
> +"], [0], [dnl
> +OFPT_QUEUE_GET_CONFIG_REPLY (OF1.1) (xid=0x1): port=1
> +queue 21845: min_rate:50.0% max_rate:75.0%
> +queue 17476:
> +])
> +AT_CLEANUP
> +
> AT_SETUP([OFPT_QUEUE_GET_CONFIG_REPLY - OF1.2])
> AT_KEYWORDS([ofp-print])
> AT_CHECK([ovs-ofctl ofp-print "03 17 00 50 00 00 00 01 \
> diff --git a/tests/ofproto.at b/tests/ofproto.at
> index eceff58..f29543e 100644
> --- a/tests/ofproto.at
> +++ b/tests/ofproto.at
> @@ -252,6 +252,20 @@ OFPT_QUEUE_GET_CONFIG_REQUEST (xid=0x2): port=10
> OVS_VSWITCHD_STOP
> AT_CLEANUP
> 
> +AT_SETUP([ofproto - queue configuration - (OpenFlow 1.1)])
> +OVS_VSWITCHD_START
> +ADD_OF_PORTS([br0], [1], [2])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 queue-get-config br0 1], [0], [stdout])
> +AT_CHECK([STRIP_XIDS stdout], [0], [dnl
> +OFPT_QUEUE_GET_CONFIG_REPLY (OF1.2): port=1
> +])
> +AT_CHECK([ovs-ofctl -O OpenFlow12 queue-get-config br0 10], [0],
> +  [OFPT_ERROR (OF1.2) (xid=0x2): OFPQOFC_BAD_PORT
> +OFPT_QUEUE_GET_CONFIG_REQUEST (OF1.2) (xid=0x2): port=10
> +])
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> AT_SETUP([ofproto - queue configuration - (OpenFlow 1.2)])
> OVS_VSWITCHD_START
> ADD_OF_PORTS([br0], [1], [2])
> -- 
> 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