Looks good, thanks.

Ethan

On Tue, Jul 3, 2012 at 2:48 PM, Ben Pfaff <b...@nicira.com> wrote:
> I want to use this code in another function in an upcoming commit.
>
> Signed-off-by: Ben Pfaff <b...@nicira.com>
> ---
>  utilities/ovs-ofctl.c |  123 
> +++++++++++++++++++++++++++----------------------
>  1 files changed, 68 insertions(+), 55 deletions(-)
>
> diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
> index 2375762..2f7a1bb 100644
> --- a/utilities/ovs-ofctl.c
> +++ b/utilities/ovs-ofctl.c
> @@ -1650,6 +1650,59 @@ read_flows_from_file(const char *filename, struct 
> classifier *cls, int index)
>      return usable_protocols;
>  }
>
> +static bool
> +recv_flow_stats_reply(struct vconn *vconn, ovs_be32 send_xid,
> +                      struct ofpbuf **replyp, struct ofputil_flow_stats *fs)
> +{
> +    struct ofpbuf *reply = *replyp;
> +
> +    for (;;) {
> +        ovs_be16 flags;
> +        int retval;
> +
> +        /* Get a flow stats reply message, if we don't already have one. */
> +        if (!reply) {
> +            const struct ofputil_msg_type *type;
> +            enum ofputil_msg_code code;
> +
> +            do {
> +                run(vconn_recv_block(vconn, &reply),
> +                    "OpenFlow packet receive failed");
> +            } while (((struct ofp_header *) reply->data)->xid != send_xid);
> +
> +            ofputil_decode_msg_type(reply->data, &type);
> +            code = ofputil_msg_type_code(type);
> +            if (code != OFPUTIL_OFPST_FLOW_REPLY &&
> +                code != OFPUTIL_NXST_FLOW_REPLY) {
> +                ovs_fatal(0, "received bad reply: %s",
> +                          ofp_to_string(reply->data, reply->size,
> +                                        verbosity + 1));
> +            }
> +        }
> +
> +        /* Pull an individual flow stats reply out of the message. */
> +        retval = ofputil_decode_flow_stats_reply(fs, reply, false);
> +        switch (retval) {
> +        case 0:
> +            *replyp = reply;
> +            return true;
> +
> +        case EOF:
> +            flags = ((const struct ofp_stats_msg *) reply->l2)->flags;
> +            ofpbuf_delete(reply);
> +            if (!(flags & htons(OFPSF_REPLY_MORE))) {
> +                *replyp = NULL;
> +                return false;
> +            }
> +            break;
> +
> +        default:
> +            ovs_fatal(0, "parse error in reply (%s)",
> +                      ofperr_to_string(retval));
> +        }
> +    }
> +}
> +
>  /* Reads the OpenFlow flow table from 'vconn', which has currently active 
> flow
>   * format 'protocol', and adds them as flow table entries in 'cls' for the
>   * version with the specified 'index'. */
> @@ -1659,9 +1712,10 @@ read_flows_from_switch(struct vconn *vconn,
>                         struct classifier *cls, int index)
>  {
>      struct ofputil_flow_stats_request fsr;
> +    struct ofputil_flow_stats fs;
>      struct ofpbuf *request;
> +    struct ofpbuf *reply;
>      ovs_be32 send_xid;
> -    bool done;
>
>      fsr.aggregate = false;
>      cls_rule_init_catchall(&fsr.match, 0);
> @@ -1672,61 +1726,20 @@ read_flows_from_switch(struct vconn *vconn,
>      send_xid = ((struct ofp_header *) request->data)->xid;
>      send_openflow_buffer(vconn, request);
>
> -    done = false;
> -    while (!done) {
> -        ovs_be32 recv_xid;
> -        struct ofpbuf *reply;
> -
> -        run(vconn_recv_block(vconn, &reply), "OpenFlow packet receive 
> failed");
> -        recv_xid = ((struct ofp_header *) reply->data)->xid;
> -        if (send_xid == recv_xid) {
> -            const struct ofputil_msg_type *type;
> -            const struct ofp_stats_msg *osm;
> -            enum ofputil_msg_code code;
> -
> -            ofputil_decode_msg_type(reply->data, &type);
> -            code = ofputil_msg_type_code(type);
> -            if (code != OFPUTIL_OFPST_FLOW_REPLY &&
> -                code != OFPUTIL_NXST_FLOW_REPLY) {
> -                ovs_fatal(0, "received bad reply: %s",
> -                          ofp_to_string(reply->data, reply->size,
> -                                        verbosity + 1));
> -            }
> -
> -            osm = reply->data;
> -            if (!(osm->flags & htons(OFPSF_REPLY_MORE))) {
> -                done = true;
> -            }
> -
> -            for (;;) {
> -                struct fte_version *version;
> -                struct ofputil_flow_stats fs;
> -                int retval;
> -
> -                retval = ofputil_decode_flow_stats_reply(&fs, reply, false);
> -                if (retval) {
> -                    if (retval != EOF) {
> -                        ovs_fatal(0, "parse error in reply");
> -                    }
> -                    break;
> -                }
> -
> -                version = xmalloc(sizeof *version);
> -                version->cookie = fs.cookie;
> -                version->idle_timeout = fs.idle_timeout;
> -                version->hard_timeout = fs.hard_timeout;
> -                version->flags = 0;
> -                version->n_actions = fs.n_actions;
> -                version->actions = xmemdup(fs.actions,
> -                                           fs.n_actions * sizeof 
> *fs.actions);
> +    reply = NULL;
> +    while (recv_flow_stats_reply(vconn, send_xid, &reply, &fs)) {
> +        struct fte_version *version;
>
> -                fte_insert(cls, &fs.rule, version, index);
> -            }
> -        } else {
> -            VLOG_DBG("received reply with xid %08"PRIx32" "
> -                     "!= expected %08"PRIx32, recv_xid, send_xid);
> -        }
> -        ofpbuf_delete(reply);
> +        version = xmalloc(sizeof *version);
> +        version->cookie = fs.cookie;
> +        version->idle_timeout = fs.idle_timeout;
> +        version->hard_timeout = fs.hard_timeout;
> +        version->flags = 0;
> +        version->n_actions = fs.n_actions;
> +        version->actions = xmemdup(fs.actions,
> +                                   fs.n_actions * sizeof *fs.actions);
> +
> +        fte_insert(cls, &fs.rule, version, index);
>      }
>  }
>
> --
> 1.7.2.5
>
> _______________________________________________
> 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