[ovs-dev] [sort 2/3] ovs-ofctl: Factor code out of read_flows_from_switch().
Ben Pfaff
blp at nicira.com
Tue Jul 3 19:48:40 UTC 2012
I want to use this code in another function in an upcoming commit.
Signed-off-by: Ben Pfaff <blp at 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
More information about the dev
mailing list