Setting tag sliver-openvswitch-2.2.90-1
[sliver-openvswitch.git] / utilities / ovs-dpctl.c
index 3b1dff1..ccc55b5 100644 (file)
@@ -35,6 +35,7 @@
 #include "dirs.h"
 #include "dpif.h"
 #include "dynamic-string.h"
+#include "fatal-signal.h"
 #include "flow.h"
 #include "match.h"
 #include "netdev.h"
@@ -73,7 +74,7 @@ main(int argc, char *argv[])
 {
     set_program_name(argv[0]);
     parse_options(argc, argv);
-    signal(SIGPIPE, SIG_IGN);
+    fatal_ignore_sigpipe();
     run_command(argc - optind, argv + optind, get_all_commands());
     return 0;
 }
@@ -760,9 +761,11 @@ dpctl_dump_flows(int argc, char *argv[])
     size_t key_len;
     size_t mask_len;
     struct ds ds;
-    char *name, *error, *filter = NULL;
+    char *name, *filter = NULL;
     struct flow flow_filter;
     struct flow_wildcards wc_filter;
+    void *state = NULL;
+    int error;
 
     if (argc > 1 && !strncmp(argv[argc - 1], "filter=", 7)) {
         filter = xstrdup(argv[--argc] + 7);
@@ -781,18 +784,22 @@ dpctl_dump_flows(int argc, char *argv[])
     }
 
     if (filter) {
-        error = parse_ofp_exact_flow(&flow_filter, &wc_filter.masks, filter,
-                                     &names_portno);
-        if (error) {
-            ovs_fatal(0, "Failed to parse filter (%s)", error);
+        char *err = parse_ofp_exact_flow(&flow_filter, &wc_filter.masks,
+                                         filter, &names_portno);
+        if (err) {
+            ovs_fatal(0, "Failed to parse filter (%s)", err);
         }
     }
 
     ds_init(&ds);
-    dpif_flow_dump_start(&flow_dump, dpif);
-    while (dpif_flow_dump_next(&flow_dump, &key, &key_len,
-                               &mask, &mask_len,
-                               &actions, &actions_len, &stats)) {
+    error = dpif_flow_dump_start(&flow_dump, dpif);
+    if (error) {
+        goto exit;
+    }
+    dpif_flow_dump_state_init(dpif, &state);
+    while (dpif_flow_dump_next(&flow_dump, state, &key, &key_len,
+                               &mask, &mask_len, &actions, &actions_len,
+                               &stats)) {
         if (filter) {
             struct flow flow;
             struct flow_wildcards wc;
@@ -823,8 +830,13 @@ dpctl_dump_flows(int argc, char *argv[])
         format_odp_actions(&ds, actions, actions_len);
         printf("%s\n", ds_cstr(&ds));
     }
-    dpif_flow_dump_done(&flow_dump);
+    dpif_flow_dump_state_uninit(dpif, state);
+    error = dpif_flow_dump_done(&flow_dump);
 
+exit:
+    if (error) {
+        ovs_fatal(error, "Failed to dump flows from datapath");
+    }
     free(filter);
     odp_portno_names_destroy(&portno_names);
     hmap_destroy(&portno_names);
@@ -871,9 +883,10 @@ dpctl_put_flow(int argc, char *argv[], enum dpif_flow_put_flags flags)
     run(odp_actions_from_string(actions_s, NULL, &actions), "parsing actions");
 
     run(dpif_flow_put(dpif, flags,
-                      key.data, key.size,
-                      mask.size == 0 ? NULL : mask.data, mask.size,
-                      actions.data, actions.size,
+                      ofpbuf_data(&key), ofpbuf_size(&key),
+                      ofpbuf_size(&mask) == 0 ? NULL : ofpbuf_data(&mask),
+                      ofpbuf_size(&mask),
+                      ofpbuf_data(&actions), ofpbuf_size(&actions),
                       print_statistics ? &stats : NULL),
         "updating flow table");
 
@@ -940,7 +953,7 @@ dpctl_del_flow(int argc, char *argv[])
     run(odp_flow_from_string(key_s, &port_names, &key, &mask), "parsing flow key");
 
     run(dpif_flow_del(dpif,
-                      key.data, key.size,
+                      ofpbuf_data(&key), ofpbuf_size(&key),
                       print_statistics ? &stats : NULL), "deleting flow");
 
     simap_destroy(&port_names);
@@ -993,7 +1006,7 @@ dpctl_parse_actions(int argc, char *argv[])
             "odp_actions_from_string");
 
         ds_init(&s);
-        format_odp_actions(&s, actions.data, actions.size);
+        format_odp_actions(&s, ofpbuf_data(&actions), ofpbuf_size(&actions));
         puts(ds_cstr(&s));
         ds_destroy(&s);
 
@@ -1129,10 +1142,10 @@ dpctl_normalize_actions(int argc, char *argv[])
         "odp_flow_key_from_string");
 
     ds_clear(&s);
-    odp_flow_format(keybuf.data, keybuf.size, NULL, 0, NULL, &s, verbosity);
+    odp_flow_format(ofpbuf_data(&keybuf), ofpbuf_size(&keybuf), NULL, 0, NULL, &s, verbosity);
     printf("input flow: %s\n", ds_cstr(&s));
 
-    run(odp_flow_key_to_flow(keybuf.data, keybuf.size, &flow),
+    run(odp_flow_key_to_flow(ofpbuf_data(&keybuf), ofpbuf_size(&keybuf), &flow),
         "odp_flow_key_to_flow");
     ofpbuf_uninit(&keybuf);
 
@@ -1144,12 +1157,12 @@ dpctl_normalize_actions(int argc, char *argv[])
 
     if (verbosity) {
         ds_clear(&s);
-        format_odp_actions(&s, odp_actions.data, odp_actions.size);
+        format_odp_actions(&s, ofpbuf_data(&odp_actions), ofpbuf_size(&odp_actions));
         printf("input actions: %s\n", ds_cstr(&s));
     }
 
     hmap_init(&actions_per_flow);
-    NL_ATTR_FOR_EACH (a, left, odp_actions.data, odp_actions.size) {
+    NL_ATTR_FOR_EACH (a, left, ofpbuf_data(&odp_actions), ofpbuf_size(&odp_actions)) {
         const struct ovs_action_push_vlan *push;
         switch(nl_attr_type(a)) {
         case OVS_ACTION_ATTR_POP_VLAN:
@@ -1180,7 +1193,7 @@ dpctl_normalize_actions(int argc, char *argv[])
     for (i = 0; i < n_afs; i++) {
         const struct actions_for_flow *af = afs[i];
 
-        sort_output_actions(af->actions.data, af->actions.size);
+        sort_output_actions(ofpbuf_data(&af->actions), ofpbuf_size(&af->actions));
 
         if (af->flow.vlan_tci != htons(0)) {
             printf("vlan(vid=%"PRIu16",pcp=%d): ",
@@ -1200,7 +1213,7 @@ dpctl_normalize_actions(int argc, char *argv[])
         }
 
         ds_clear(&s);
-        format_odp_actions(&s, af->actions.data, af->actions.size);
+        format_odp_actions(&s, ofpbuf_data(&af->actions), ofpbuf_size(&af->actions));
         puts(ds_cstr(&s));
     }
     ds_destroy(&s);