On May 24, 2011, at 4:25 PM, Ben Pfaff wrote:

> +static void
> +put_stats__(ovs_be32 xid, uint8_t ofp_type,
> +            ovs_be16 ofpst_type, ovs_be32 nxst_subtype,
> +            struct ofpbuf *msg)
> +{
> +    if (ofpst_type == htons(OFPST_VENDOR)) {
> +        struct nicira_stats_msg *nsm;
> +
> +        nsm = put_openflow_xid(sizeof *nsm, ofp_type, xid, msg);
> +        nsm->vsm.osm.type = ofpst_type;

Did you want to set "vsm.osm.flags" to "htons(0)" like you did below for 
straight "osm"?  (I don't think either is strictly necessary since 
put_openflow_xid() should clear the contents.)

> +        nsm->vsm.vendor = htonl(NX_VENDOR_ID);
> +        nsm->subtype = nxst_subtype;
> +    } else {
> +        struct ofp_stats_msg *osm;
> +
> +        osm = put_openflow_xid(sizeof *osm, ofp_type, xid, msg);
> +        osm->type = ofpst_type;
> +        osm->flags = htons(0);
> +    }
> +}
...
> /* Creates an ofp_stats_msg with the given 'type' and 'body_len' bytes of 
> space
>  * allocated for the 'body' member.  Returns the first byte of the 'body'
>  * member. */
> void *
> -ofputil_make_stats_request(size_t body_len, uint16_t type,
> -                           struct ofpbuf **bufferp)
> +ofputil_make_stats_request(size_t openflow_len, uint16_t ofpst_type,
> +                           uint32_t nxst_subtype, struct ofpbuf **bufferp)
> {

The comment describing this function should be updated.

> +/* Creates an stats reply message with the given 'type' and 'body_len' bytes 
> of
> + * space allocated for the 'body' member.  Returns the first byte of the 
> 'body'
> + * member. */
> void *
> -ofputil_make_nxstats_request(size_t openflow_len, uint32_t subtype,
> -                             struct ofpbuf **bufferp)
> +ofputil_make_stats_reply(size_t openflow_len,
> +                         const struct ofp_stats_msg *request,
> +                         struct ofpbuf **bufferp)
> {

This comment should be similarly updated.  (Also, the comment has "an stats".)

> +void
> +ofputil_start_stats_reply(const struct ofp_stats_msg *request,
> +                          struct list *replies)
> +{
> +    struct ofpbuf *msg;
> +
> +    msg = ofpbuf_new(1024);
> +    put_stats_reply__(request, msg);
> +
> +    list_init(replies);
> +    list_push_back(replies, &msg->list_node);
> +}
> +
> +struct ofpbuf *
> +ofputil_reserve_stats_reply(size_t len, struct list *replies)
> +{
> +    struct ofpbuf *msg = ofpbuf_from_list(list_back(replies));
> +    struct ofp_stats_msg *osm = msg->data;
> +
> +    if (msg->size + len <= UINT16_MAX) {
> +        ofpbuf_prealloc_tailroom(msg, len);
> +    } else {
> +        osm->flags |= htons(OFPSF_REPLY_MORE);
> +
> +        msg = ofpbuf_new(MAX(1024, sizeof(struct nicira_stats_msg) + len));
> +        put_stats_reply__(osm, msg);
> +        list_push_back(replies, &msg->list_node);
> +    }
> +    return msg;
> +}
> +
> +void *
> +ofputil_append_stats_reply(size_t len, struct list *replies)
> +{
> +    return ofpbuf_put_uninit(ofputil_reserve_stats_reply(len, replies), len);
> }

It may be good to document this set of functions (ofputil_*_stats_reply()) as 
the arguments and behavior are not immediately obvious.

> diff --git a/lib/ofpbuf.c b/lib/ofpbuf.c
> index 8166d6b..3887481 100644
> --- a/lib/ofpbuf.c
> +++ b/lib/ofpbuf.c
> 
> +/* If 'b' is shorter than 'length' bytes, pads its tail out with zeros to 
> that
> + * length. */
> +void
> +ofpbuf_padto(struct ofpbuf *b, size_t length)
> +{
> +    if (b->size < length) {
> +        ofpbuf_put_zeros(b, length - b->size);
> +    }
> +}

If "length" is greater than "b.allocated", couldn't this lead to a situation 
where obpbuf_put_zeros() reallocates "b", and then the pointer will no longer 
be valid?  (I realize the current callers won't be victim to this, but it seems 
dangerous from a general function.)

> static int
> handle_desc_stats_request(struct ofconn *ofconn,
> -                          const struct ofp_header *request)
> +                          const struct ofp_stats_msg *request)
> {
>     struct ofproto *p = ofconn_get_ofproto(ofconn);
>     struct ofp_desc_stats *ods;
>     struct ofpbuf *msg;
> 
> -    msg = start_ofp_stats_reply(request, sizeof *ods);
> -    ods = append_ofp_stats_reply(sizeof *ods, ofconn, &msg);
> +    ods = ofputil_make_stats_reply(sizeof *ods, request, &msg);
>     memset(ods, 0, sizeof *ods);

This memset() is probably not strictly necessary, since the ofpbuf_padto() in 
ofputil_make_stats_reply() should clear it.

> @@ -2116,8 +2038,8 @@ handle_nxst_aggregate(struct ofconn *ofconn,
> 
>     /* Reply. */
>     COVERAGE_INC(ofproto_flows_req);
> -    buf = start_nxstats_reply(&request->nsm, sizeof *reply);
> -    reply = ofpbuf_put_uninit(buf, sizeof *reply);
> +    reply = ofputil_make_stats_reply(sizeof *reply, &request->nsm.vsm.osm,
> +                                     &buf);

Do you think it's worth renaming "buf" to "msg", since this seems to be the 
convention of callers to ofputil_make_stats_reply().

--Justin


_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to