Visual studio does not support 0 size array within a struct, but supports flexible array. For example, char p[0] is not supported, but char p[] is O.K. GCC supports both.
Flexible array can not directly replace a zero sized array. http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html lists the differences. Commits 644cfd84772eb7d8 and 6fdaa45a6f6c9 make use of 0 size array. Convert them to flexible array so that visual studio can compile them as well. Reported-by: Gurucharan Shetty <gshe...@nicira.com> Signed-off-by: Andy Zhou <az...@nicira.com> --- include/openflow/openflow-1.1.h | 8 ++++++-- include/openflow/openflow-1.3.h | 4 ++-- lib/ofp-util.c | 37 +++++++++++++++++++++++-------------- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/include/openflow/openflow-1.1.h b/include/openflow/openflow-1.1.h index e3e2d39..4d0a81e 100644 --- a/include/openflow/openflow-1.1.h +++ b/include/openflow/openflow-1.1.h @@ -696,7 +696,7 @@ struct ofp11_bucket_counter { OFP_ASSERT(sizeof(struct ofp11_bucket_counter) == 16); /* Body of reply to OFPST11_GROUP request */ -struct ofp11_group_stats { +struct ofp11_group_stats_base { ovs_be16 length; /* Length of this entry. */ uint8_t pad[2]; /* Align to 64 bits. */ ovs_be32 group_id; /* Group identifier. */ @@ -705,7 +705,11 @@ struct ofp11_group_stats { uint8_t pad2[4]; /* Align to 64 bits. */ ovs_be64 packet_count; /* Number of packets processed by group. */ ovs_be64 byte_count; /* Number of bytes processed by group. */ - struct ofp11_bucket_counter bucket_stats[0]; +}; + +struct ofp11_group_stats { + struct ofp11_group_stats_base gs; + struct ofp11_bucket_counter bucket_stats[]; }; OFP_ASSERT(sizeof(struct ofp11_group_stats) == 32); diff --git a/include/openflow/openflow-1.3.h b/include/openflow/openflow-1.3.h index 8e9f6f7..e715106 100644 --- a/include/openflow/openflow-1.3.h +++ b/include/openflow/openflow-1.3.h @@ -384,11 +384,11 @@ OFP_ASSERT(sizeof(struct ofp13_queue_stats) == 40); /* Body of reply to OFPMP13_GROUP request */ struct ofp13_group_stats { - struct ofp11_group_stats gs; + struct ofp11_group_stats_base gs; ovs_be32 duration_sec; /* Time group has been alive in seconds. */ ovs_be32 duration_nsec; /* Time group has been alive in nanoseconds beyond duration_sec. */ - struct ofp11_bucket_counter bucket_stats[0]; + struct ofp11_bucket_counter bucket_stats[]; }; OFP_ASSERT(sizeof(struct ofp13_group_stats) == 40); diff --git a/lib/ofp-util.c b/lib/ofp-util.c index 3484394..37dc63f 100644 --- a/lib/ofp-util.c +++ b/lib/ofp-util.c @@ -6274,18 +6274,24 @@ ofputil_encode_group_desc_request(enum ofp_version ofp_version) } static void -ofputil_group_stats_to_ofp11__(const struct ofputil_group_stats *gs, - struct ofp11_group_stats *gs11, size_t length, - struct ofp11_bucket_counter bucket_cnts[]) +ofputil_group_stats_base_to_ofp11__(const struct ofputil_group_stats *gs, + struct ofp11_group_stats_base *gsb11, + size_t length) { - int i; + memset(gsb11, 0, length); + gsb11->length = htons(length); + gsb11->group_id = htonl(gs->group_id); + gsb11->ref_count = htonl(gs->ref_count); + gsb11->packet_count = htonll(gs->packet_count); + gsb11->byte_count = htonll(gs->byte_count); +} - memset(gs11, 0, length); - gs11->length = htons(length); - gs11->group_id = htonl(gs->group_id); - gs11->ref_count = htonl(gs->ref_count); - gs11->packet_count = htonll(gs->packet_count); - gs11->byte_count = htonll(gs->byte_count); +static void +ofputil_group_stats_bucket_counters_to_ofp11__( + const struct ofputil_group_stats *gs, + struct ofp11_bucket_counter bucket_cnts[]) +{ + int i; for (i = 0; i < gs->n_buckets; i++) { bucket_cnts[i].packet_count = htonll(gs->bucket_stats[i].packet_count); @@ -6295,16 +6301,19 @@ ofputil_group_stats_to_ofp11__(const struct ofputil_group_stats *gs, static void ofputil_group_stats_to_ofp11(const struct ofputil_group_stats *gs, - struct ofp11_group_stats *gs11, size_t length) + struct ofp11_group_stats *gs11, + size_t length) { - ofputil_group_stats_to_ofp11__(gs, gs11, length, gs11->bucket_stats); + ofputil_group_stats_base_to_ofp11__(gs, &gs11->gs, length); + ofputil_group_stats_bucket_counters_to_ofp11__(gs, gs11->bucket_stats); } static void ofputil_group_stats_to_ofp13(const struct ofputil_group_stats *gs, struct ofp13_group_stats *gs13, size_t length) { - ofputil_group_stats_to_ofp11__(gs, &gs13->gs, length, gs13->bucket_stats); + ofputil_group_stats_base_to_ofp11__(gs, &gs13->gs, length); + ofputil_group_stats_bucket_counters_to_ofp11__(gs, gs13->bucket_stats); gs13->duration_sec = htonl(gs->duration_sec); gs13->duration_nsec = htonl(gs->duration_nsec); } @@ -6447,7 +6456,7 @@ ofputil_decode_group_stats_reply(struct ofpbuf *msg, struct ofputil_group_stats *gs) { struct ofp11_bucket_counter *obc; - struct ofp11_group_stats *ogs11; + struct ofp11_group_stats_base *ogs11; enum ofpraw raw; enum ofperr error; size_t base_len; -- 1.9.1 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev