Release Open vSwitch 1.1.0
[sliver-openvswitch.git] / utilities / ovs-ofctl.c
index e7997c6..201a963 100644 (file)
@@ -18,6 +18,7 @@
 #include <errno.h>
 #include <getopt.h>
 #include <inttypes.h>
+#include <sys/socket.h>
 #include <net/if.h>
 #include <signal.h>
 #include <stdlib.h>
@@ -633,56 +634,67 @@ check_final_format_for_flow_mod(enum nx_flow_format flow_format)
 }
 
 static void
-do_flow_mod__(int argc OVS_UNUSED, char *argv[], uint16_t command)
+do_flow_mod_file__(int argc OVS_UNUSED, char *argv[], uint16_t command)
 {
     enum nx_flow_format flow_format;
     struct list requests;
     struct vconn *vconn;
+    FILE *file;
+
+    file = !strcmp(argv[2], "-") ? stdin : fopen(argv[2], "r");
+    if (file == NULL) {
+        ovs_fatal(errno, "%s: open", argv[2]);
+    }
 
     list_init(&requests);
     flow_format = set_initial_format_for_flow_mod(&requests);
 
-    parse_ofp_flow_mod_str(&requests, &flow_format, argc > 2 ? argv[2] : "",
-                           command);
-    check_final_format_for_flow_mod(flow_format);
-
     open_vconn(argv[1], &vconn);
-    transact_multiple_noreply(vconn, &requests);
+    while (parse_ofp_flow_mod_file(&requests, &flow_format, file, command)) {
+        check_final_format_for_flow_mod(flow_format);
+        transact_multiple_noreply(vconn, &requests);
+    }
     vconn_close(vconn);
-}
 
-static void
-do_add_flow(int argc, char *argv[])
-{
-    do_flow_mod__(argc, argv, OFPFC_ADD);
+    if (file != stdin) {
+        fclose(file);
+    }
 }
 
 static void
-do_add_flows(int argc OVS_UNUSED, char *argv[])
+do_flow_mod__(int argc, char *argv[], uint16_t command)
 {
     enum nx_flow_format flow_format;
     struct list requests;
     struct vconn *vconn;
-    FILE *file;
 
-    file = !strcmp(argv[2], "-") ? stdin : fopen(argv[2], "r");
-    if (file == NULL) {
-        ovs_fatal(errno, "%s: open", argv[2]);
+    if (argc > 2 && !strcmp(argv[2], "-")) {
+        do_flow_mod_file__(argc, argv, command);
+        return;
     }
 
     list_init(&requests);
     flow_format = set_initial_format_for_flow_mod(&requests);
 
+    parse_ofp_flow_mod_str(&requests, &flow_format, argc > 2 ? argv[2] : "",
+                           command);
+    check_final_format_for_flow_mod(flow_format);
+
     open_vconn(argv[1], &vconn);
-    while (parse_ofp_add_flow_file(&requests, &flow_format, file)) {
-        check_final_format_for_flow_mod(flow_format);
-        transact_multiple_noreply(vconn, &requests);
-    }
+    transact_multiple_noreply(vconn, &requests);
     vconn_close(vconn);
+}
 
-    if (file != stdin) {
-        fclose(file);
-    }
+static void
+do_add_flow(int argc, char *argv[])
+{
+    do_flow_mod__(argc, argv, OFPFC_ADD);
+}
+
+static void
+do_add_flows(int argc, char *argv[])
+{
+    do_flow_mod_file__(argc, argv, OFPFC_ADD);
 }
 
 static void
@@ -1139,8 +1151,6 @@ read_flows_from_switch(struct vconn *vconn, enum nx_flow_format flow_format,
 
                 fte_insert(cls, &fs.rule, version, index);
             }
-
-            osr = ofpbuf_at(reply, 0, sizeof *osr);
         } else {
             VLOG_DBG("received reply with xid %08"PRIx32" "
                      "!= expected %08"PRIx32, recv_xid, send_xid);
@@ -1339,7 +1349,7 @@ do_parse_flows(int argc OVS_UNUSED, char *argv[])
     }
 
     list_init(&packets);
-    while (parse_ofp_add_flow_file(&packets, &flow_format, file)) {
+    while (parse_ofp_flow_mod_file(&packets, &flow_format, file, OFPFC_ADD)) {
         print_packet_list(&packets);
     }
     fclose(file);