X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=utilities%2Fovs-dpctl.c;h=4b00118ab2b96af46cdfff7fe9b3400d7fe3d070;hb=7685b7a9e5b3f6db6832e52e111000ff36d3acb4;hp=29f115158431b12dedf8d323e86424d3e406b93c;hpb=c2c28dfd68eeb4744edb1375eae6ccc74201e812;p=sliver-openvswitch.git diff --git a/utilities/ovs-dpctl.c b/utilities/ovs-dpctl.c index 29f115158..4b00118ab 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; } @@ -350,7 +351,6 @@ dpctl_add_if(int argc OVS_UNUSED, char *argv[]) error = netdev_set_config(netdev, &args); if (error) { - ovs_error(error, "%s: failed to configure network device", name); goto next; } @@ -459,7 +459,6 @@ dpctl_set_if(int argc, char *argv[]) error = netdev_set_config(netdev, &args); smap_destroy(&args); if (error) { - ovs_error(error, "%s: failed to configure network device", name); goto next; } @@ -563,11 +562,11 @@ show_dpif(struct dpif *dpif) printf("\tlookups: hit:%"PRIu64" missed:%"PRIu64" lost:%"PRIu64"\n" "\tflows: %"PRIu64"\n", stats.n_hit, stats.n_missed, stats.n_lost, stats.n_flows); - if (stats.n_masks != UINT64_MAX) { + if (stats.n_masks != UINT32_MAX) { uint64_t n_pkts = stats.n_hit + stats.n_missed; double avg = n_pkts ? (double) stats.n_mask_hit / n_pkts : 0.0; - printf("\tmasks: hit:%"PRIu64" total:%"PRIu64" hit/pkt:%.2f\n", + printf("\tmasks: hit:%"PRIu64" total:%"PRIu32" hit/pkt:%.2f\n", stats.n_mask_hit, stats.n_masks, avg); } } @@ -762,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); @@ -783,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; @@ -825,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); @@ -1194,9 +1204,9 @@ dpctl_normalize_actions(int argc, char *argv[]) if (eth_type_mpls(af->flow.dl_type)) { printf("mpls(label=%"PRIu32",tc=%d,ttl=%d): ", - mpls_lse_to_label(af->flow.mpls_lse), - mpls_lse_to_tc(af->flow.mpls_lse), - mpls_lse_to_ttl(af->flow.mpls_lse)); + mpls_lse_to_label(af->flow.mpls_lse[0]), + mpls_lse_to_tc(af->flow.mpls_lse[0]), + mpls_lse_to_ttl(af->flow.mpls_lse[0])); } else { printf("no mpls: "); }