On Thu, Apr 24, 2014 at 2:48 PM, Andy Zhou <az...@nicira.com> wrote: > 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>
Eitan pointed out off-list that Zero sized arrays are supported on visual studio as an extension. In this particular case, zero sized array was indirectly included in the middle of the structure and that is not supported. So the fix is still needed, but the commit message could do with a change. Thanks, Guru > --- > 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 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev