[ovs-dev] [nxm 42/42] ofp-parse: Generalize parse_ofp_add_flow_str() into parse_ofp_flow_mod().

Ben Pfaff blp at nicira.com
Thu Oct 28 17:28:13 UTC 2010


This generalization allows us to delete several lines of code from
ovs-ofctl.c.
---
 lib/ofp-parse.c       |   10 +++---
 lib/ofp-parse.h       |    2 +-
 utilities/ovs-ofctl.c |   71 ++++++------------------------------------------
 3 files changed, 15 insertions(+), 68 deletions(-)

diff --git a/lib/ofp-parse.c b/lib/ofp-parse.c
index 2a45ce6..6bb78a3 100644
--- a/lib/ofp-parse.c
+++ b/lib/ofp-parse.c
@@ -519,10 +519,10 @@ parse_ofp_str(char *string, struct ofp_match *match, struct ofpbuf *actions,
     }
 }
 
-/* Parses 'string' as a OFPT_FLOW_MOD with subtype OFPFC_ADD and returns an
- * ofpbuf that contains it. */
+/* Parses 'string' as a OFPT_FLOW_MOD with command 'command' (one of OFPFC_*)
+ * and returns an ofpbuf that contains it. */
 struct ofpbuf *
-parse_ofp_add_flow_str(char *string)
+parse_ofp_flow_mod(char *string, uint16_t command)
 {
     struct ofpbuf *buffer;
     struct ofp_flow_mod *ofm;
@@ -538,10 +538,10 @@ parse_ofp_add_flow_str(char *string)
                   &cookie);
     ofm = buffer->data;
     ofm->match = match;
-    ofm->command = htons(OFPFC_ADD);
     ofm->cookie = htonll(cookie);
     ofm->idle_timeout = htons(idle_timeout);
     ofm->hard_timeout = htons(hard_timeout);
+    ofm->command = htons(command);
     ofm->buffer_id = htonl(UINT32_MAX);
     ofm->priority = htons(priority);
     update_openflow_length(buffer);
@@ -573,7 +573,7 @@ parse_ofp_add_flow_file(FILE *stream)
             continue;
         }
 
-        b = parse_ofp_add_flow_str(line);
+        b = parse_ofp_flow_mod(line, OFPFC_ADD);
         break;
     }
     ds_destroy(&s);
diff --git a/lib/ofp-parse.h b/lib/ofp-parse.h
index ac8e6d2..c837244 100644
--- a/lib/ofp-parse.h
+++ b/lib/ofp-parse.h
@@ -30,7 +30,7 @@ void parse_ofp_str(char *string, struct ofp_match *match,
                    uint16_t *out_port, uint16_t *priority,
                    uint16_t *idle_timeout, uint16_t *hard_timeout,
                    uint64_t *cookie);
-struct ofpbuf *parse_ofp_add_flow_str(char *string);
+struct ofpbuf *parse_ofp_flow_mod(char *string, uint16_t command);
 struct ofpbuf *parse_ofp_add_flow_file(FILE *);
 
 #endif /* ofp-parse.h */
diff --git a/utilities/ovs-ofctl.c b/utilities/ovs-ofctl.c
index da3e237..01b2971 100644
--- a/utilities/ovs-ofctl.c
+++ b/utilities/ovs-ofctl.c
@@ -495,26 +495,8 @@ do_add_flow(int argc OVS_UNUSED, char *argv[])
 {
     struct vconn *vconn;
     struct ofpbuf *buffer;
-    struct ofp_flow_mod *ofm;
-    uint16_t priority, idle_timeout, hard_timeout;
-    uint64_t cookie;
-    struct ofp_match match;
-
-    /* Parse and send.  parse_ofp_str() will expand and reallocate the
-     * data in 'buffer', so we can't keep pointers to across the
-     * parse_ofp_str() call. */
-    make_openflow(sizeof *ofm, OFPT_FLOW_MOD, &buffer);
-    parse_ofp_str(argv[2], &match, buffer,
-                  NULL, NULL, &priority, &idle_timeout, &hard_timeout,
-                  &cookie);
-    ofm = buffer->data;
-    ofm->match = match;
-    ofm->command = htons(OFPFC_ADD);
-    ofm->cookie = htonll(cookie);
-    ofm->idle_timeout = htons(idle_timeout);
-    ofm->hard_timeout = htons(hard_timeout);
-    ofm->buffer_id = htonl(UINT32_MAX);
-    ofm->priority = htons(priority);
+
+    buffer = parse_ofp_flow_mod(argv[2], OFPFC_ADD);
 
     open_vconn(argv[1], &vconn);
     send_openflow_buffer(vconn, buffer);
@@ -544,33 +526,12 @@ do_add_flows(int argc OVS_UNUSED, char *argv[])
 static void
 do_mod_flows(int argc OVS_UNUSED, char *argv[])
 {
-    uint16_t priority, idle_timeout, hard_timeout;
-    uint64_t cookie;
     struct vconn *vconn;
     struct ofpbuf *buffer;
-    struct ofp_flow_mod *ofm;
-    struct ofp_match match;
-
-    /* Parse and send.  parse_ofp_str() will expand and reallocate the
-     * data in 'buffer', so we can't keep pointers to across the
-     * parse_ofp_str() call. */
-    make_openflow(sizeof *ofm, OFPT_FLOW_MOD, &buffer);
-    parse_ofp_str(argv[2], &match, buffer,
-                  NULL, NULL, &priority, &idle_timeout, &hard_timeout,
-                  &cookie);
-    ofm = buffer->data;
-    ofm->match = match;
-    if (strict) {
-        ofm->command = htons(OFPFC_MODIFY_STRICT);
-    } else {
-        ofm->command = htons(OFPFC_MODIFY);
-    }
-    ofm->idle_timeout = htons(idle_timeout);
-    ofm->hard_timeout = htons(hard_timeout);
-    ofm->cookie = htonll(cookie);
-    ofm->buffer_id = htonl(UINT32_MAX);
-    ofm->priority = htons(priority);
+    uint16_t command;
 
+    command = strict ? OFPFC_MODIFY_STRICT : OFPFC_MODIFY;
+    buffer = parse_ofp_flow_mod(argv[2], command);
     open_vconn(argv[1], &vconn);
     send_openflow_buffer(vconn, buffer);
     vconn_close(vconn);
@@ -579,25 +540,11 @@ do_mod_flows(int argc OVS_UNUSED, char *argv[])
 static void do_del_flows(int argc, char *argv[])
 {
     struct vconn *vconn;
-    uint16_t priority;
-    uint16_t out_port;
     struct ofpbuf *buffer;
-    struct ofp_flow_mod *ofm;
-
-    /* Parse and send. */
-    ofm = make_openflow(sizeof *ofm, OFPT_FLOW_MOD, &buffer);
-    parse_ofp_str(argc > 2 ? argv[2] : "", &ofm->match, NULL, NULL,
-                  &out_port, &priority, NULL, NULL, NULL);
-    if (strict) {
-        ofm->command = htons(OFPFC_DELETE_STRICT);
-    } else {
-        ofm->command = htons(OFPFC_DELETE);
-    }
-    ofm->idle_timeout = htons(0);
-    ofm->hard_timeout = htons(0);
-    ofm->buffer_id = htonl(UINT32_MAX);
-    ofm->out_port = htons(out_port);
-    ofm->priority = htons(priority);
+    uint16_t command;
+
+    command = strict ? OFPFC_DELETE_STRICT : OFPFC_DELETE;
+    buffer = parse_ofp_flow_mod(argc > 2 ? argv[2] : "", command);
 
     open_vconn(argv[1], &vconn);
     send_openflow_buffer(vconn, buffer);
-- 
1.7.1





More information about the dev mailing list