acked-by: Andy Zhou <az...@nicira.com>

On Wed, Jul 17, 2013 at 3:58 PM, Ben Pfaff <b...@nicira.com> wrote:

> OpenFlow 1.0, 1.1, and 1.2 all have the same struct size for port and
> queue stats.  OpenFlow 1.3 has larger structs, but the ofp-util code didn't
> realize that.  This fixes the problem.
>
> It appears that the only consequence of this problem would have been
> printing the wrong count in ofp-print output.
>
> Signed-off-by: Ben Pfaff <b...@nicira.com>
> ---
>  lib/ofp-util.c     |   39 +++++++++++++++++++++++++++++++++------
>  tests/ofp-print.at |   31 +++++++++++++++++++++++++++++++
>  2 files changed, 64 insertions(+), 6 deletions(-)
>
> diff --git a/lib/ofp-util.c b/lib/ofp-util.c
> index 8921592..f1ba19c 100644
> --- a/lib/ofp-util.c
> +++ b/lib/ofp-util.c
> @@ -5183,6 +5183,21 @@ ofputil_port_stats_from_ofp13(struct
> ofputil_port_stats *ops,
>      return error;
>  }
>
> +static size_t
> +ofputil_get_port_stats_size(enum ofp_version ofp_version)
> +{
> +    switch (ofp_version) {
> +    case OFP10_VERSION:
> +        return sizeof(struct ofp10_port_stats);
> +    case OFP11_VERSION:
> +    case OFP12_VERSION:
> +        return sizeof(struct ofp11_port_stats);
> +    case OFP13_VERSION:
> +        return sizeof(struct ofp13_port_stats);
> +    default:
> +        NOT_REACHED();
> +    }
> +}
>
>  /* Returns the number of port stats elements in OFPTYPE_PORT_STATS_REPLY
>   * message 'oh'. */
> @@ -5194,9 +5209,7 @@ ofputil_count_port_stats(const struct ofp_header *oh)
>      ofpbuf_use_const(&b, oh, ntohs(oh->length));
>      ofpraw_pull_assert(&b);
>
> -    BUILD_ASSERT(sizeof(struct ofp10_port_stats) ==
> -                 sizeof(struct ofp11_port_stats));
> -    return b.size / sizeof(struct ofp10_port_stats);
> +    return b.size / ofputil_get_port_stats_size(oh->version);
>  }
>
>  /* Converts an OFPST_PORT_STATS reply in 'msg' into an abstract
> @@ -5352,6 +5365,22 @@ ofputil_encode_queue_stats_request(enum ofp_version
> ofp_version,
>      return request;
>  }
>
> +static size_t
> +ofputil_get_queue_stats_size(enum ofp_version ofp_version)
> +{
> +    switch (ofp_version) {
> +    case OFP10_VERSION:
> +        return sizeof(struct ofp10_queue_stats);
> +    case OFP11_VERSION:
> +    case OFP12_VERSION:
> +        return sizeof(struct ofp11_queue_stats);
> +    case OFP13_VERSION:
> +        return sizeof(struct ofp13_queue_stats);
> +    default:
> +        NOT_REACHED();
> +    }
> +}
> +
>  /* Returns the number of queue stats elements in OFPTYPE_QUEUE_STATS_REPLY
>   * message 'oh'. */
>  size_t
> @@ -5362,9 +5391,7 @@ ofputil_count_queue_stats(const struct ofp_header
> *oh)
>      ofpbuf_use_const(&b, oh, ntohs(oh->length));
>      ofpraw_pull_assert(&b);
>
> -    BUILD_ASSERT(sizeof(struct ofp10_queue_stats) ==
> -                 sizeof(struct ofp11_queue_stats));
> -    return b.size / sizeof(struct ofp10_queue_stats);
> +    return b.size / ofputil_get_queue_stats_size(oh->version);
>  }
>
>  static enum ofperr
> diff --git a/tests/ofp-print.at b/tests/ofp-print.at
> index 22886fc..63a89ec 100644
> --- a/tests/ofp-print.at
> +++ b/tests/ofp-print.at
> @@ -1579,6 +1579,37 @@ OFPST_QUEUE reply (OF1.2) (xid=0x1): 6 queues
>    port 2 queue 2: bytes=0, pkts=0, errors=0
>    port 1 queue 1: bytes=0, pkts=0, errors=0
>    port 1 queue 2: bytes=0, pkts=0, errors=0
> +
> +AT_SETUP([OFPST_QUEUE reply - OF1.3])
> +AT_KEYWORDS([ofp-print OFPT_STATS_REPLY])
> +AT_CHECK([ovs-ofctl ofp-print "\
> +04 13 01 00 00 00 00 01 00 05 00 00 00 00 00 00 \
> +00 00 00 03 00 00 00 01 00 00 00 00 00 00 01 2e \
> +00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 \
> +00 00 00 64 1d cd 65 00 \
> +00 00 00 03 00 00 00 02 00 00 00 00 00 00 00 00 \
> +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \
> +00 00 00 64 1d cd 65 00 \
> +00 00 00 02 00 00 00 01 00 00 00 00 00 00 08 34 \
> +00 00 00 00 00 00 00 14 00 00 00 00 00 00 00 00 \
> +00 00 00 64 1d cd 65 00 \
> +00 00 00 02 00 00 00 02 00 00 00 00 00 00 00 00 \
> +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \
> +00 00 00 64 1d cd 65 00 \
> +00 00 00 01 00 00 00 01 00 00 00 00 00 00 00 00 \
> +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \
> +00 00 00 64 1d cd 65 00 \
> +00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 00 \
> +00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 \
> +ff ff ff ff ff ff ff ff \
> +"], [0], [dnl
> +OFPST_QUEUE reply (OF1.3) (xid=0x1): 6 queues
> +  port 3 queue 1: bytes=302, pkts=1, errors=0
> +  port 3 queue 2: bytes=0, pkts=0, errors=0
> +  port 2 queue 1: bytes=2100, pkts=20, errors=0
> +  port 2 queue 2: bytes=0, pkts=0, errors=0
> +  port 1 queue 1: bytes=0, pkts=0, errors=0
> +  port 1 queue 2: bytes=0, pkts=0, errors=0
>  ])
>  AT_CLEANUP
>
> --
> 1.7.10.4
>
> _______________________________________________
> 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