X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=utilities%2Fovs-dpctl.c;h=ccc55b5e98ac00e34348f710b3cc0e4ff6b03a07;hb=HEAD;hp=3b1dff1e5da935e92a3547fac639861e23c9b9b8;hpb=bdd534291ff72077390f7b1745c4443ad3833d99;p=sliver-openvswitch.git diff --git a/utilities/ovs-dpctl.c b/utilities/ovs-dpctl.c index 3b1dff1e5..ccc55b5e9 100644 --- a/utilities/ovs-dpctl.c +++ b/utilities/ovs-dpctl.c @@ -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);