X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=utilities%2Fovs-dpctl.c;h=23733fde01dd62d483e3b9eec0fd20b11a4a1df4;hb=b0ec0f279ea4537cb421eba807254aba8f1971f2;hp=b12ceb7586cc5f8c7452b424b357a35c2af9651e;hpb=0ae60917fcc827f69c6e12c2f1afd170178f5668;p=sliver-openvswitch.git diff --git a/utilities/ovs-dpctl.c b/utilities/ovs-dpctl.c index b12ceb758..23733fde0 100644 --- a/utilities/ovs-dpctl.c +++ b/utilities/ovs-dpctl.c @@ -214,21 +214,6 @@ do_del_dp(int argc OVS_UNUSED, char *argv[]) dpif_close(dpif); } -static int -compare_ports(const void *a_, const void *b_) -{ - const struct odp_port *a = a_; - const struct odp_port *b = b_; - return a->port < b->port ? -1 : a->port > b->port; -} - -static void -query_ports(struct dpif *dpif, struct odp_port **ports, size_t *n_ports) -{ - run(dpif_port_list(dpif, ports, n_ports), "listing ports"); - qsort(*ports, *n_ports, sizeof **ports, compare_ports); -} - static void do_add_if(int argc OVS_UNUSED, char *argv[]) { @@ -300,21 +285,15 @@ do_add_if(int argc OVS_UNUSED, char *argv[]) static bool get_port_number(struct dpif *dpif, const char *name, uint16_t *port) { - struct odp_port *ports; - size_t n_ports; - size_t i; - - query_ports(dpif, &ports, &n_ports); - for (i = 0; i < n_ports; i++) { - if (!strcmp(name, ports[i].devname)) { - *port = ports[i].port; - free(ports); - return true; - } + struct odp_port odp_port; + + if (!dpif_port_query_by_name(dpif, name, &odp_port)) { + *port = odp_port.port; + return true; + } else { + ovs_error(0, "no port named %s", name); + return false; } - free(ports); - ovs_error(0, "no port named %s", name); - return false; } static void @@ -352,10 +331,9 @@ do_del_if(int argc OVS_UNUSED, char *argv[]) static void show_dpif(struct dpif *dpif) { - struct odp_port *ports; + struct dpif_port_dump dump; + struct odp_port odp_port; struct odp_stats stats; - size_t n_ports; - size_t i; printf("%s:\n", dpif_name(dpif)); if (!dpif_get_dp_stats(dpif, &stats)) { @@ -372,19 +350,16 @@ show_dpif(struct dpif *dpif) printf("\tqueues: max-miss:%"PRIu16", max-action:%"PRIu16"\n", stats.max_miss_queue, stats.max_action_queue); } - query_ports(dpif, &ports, &n_ports); - for (i = 0; i < n_ports; i++) { - const struct odp_port *p = &ports[i]; + DPIF_PORT_FOR_EACH (&odp_port, &dump, dpif) { struct ds ds; - printf("\tport %u: %s", p->port, p->devname); + printf("\tport %u: %s", odp_port.port, odp_port.devname); ds_init(&ds); - format_odp_port_type(&ds, p); + format_odp_port_type(&ds, &odp_port); printf("%s\n", ds_cstr(&ds)); ds_destroy(&ds); } - free(ports); dpif_close(dpif); } @@ -408,21 +383,37 @@ do_show(int argc, char *argv[]) } } } else { - unsigned int i; - for (i = 0; i < ODP_MAX; i++) { - char name[128]; - struct dpif *dpif; - int error; - - sprintf(name, "dp%u", i); - error = parsed_dpif_open(name, false, &dpif); - if (!error) { - show_dpif(dpif); - } else if (error != ENODEV) { - ovs_error(error, "opening datapath %s failed", name); + struct svec types; + const char *type; + size_t i; + + svec_init(&types); + dp_enumerate_types(&types); + SVEC_FOR_EACH (i, type, &types) { + struct svec names; + const char *name; + size_t j; + + svec_init(&names); + if (dp_enumerate_names(type, &names)) { failure = true; + continue; + } + SVEC_FOR_EACH (j, name, &names) { + struct dpif *dpif; + int error; + + error = dpif_open(name, type, &dpif); + if (!error) { + show_dpif(dpif); + } else { + ovs_error(error, "opening datapath %s failed", name); + failure = true; + } } + svec_destroy(&names); } + svec_destroy(&types); } if (failure) { exit(EXIT_FAILURE); @@ -468,29 +459,35 @@ do_dump_dps(int argc OVS_UNUSED, char *argv[] OVS_UNUSED) static void do_dump_flows(int argc OVS_UNUSED, char *argv[]) { - struct odp_flow *flows; + struct dpif_flow_dump dump; struct dpif *dpif; - size_t n_flows; struct ds ds; - size_t i; run(parsed_dpif_open(argv[1], false, &dpif), "opening datapath"); - run(dpif_flow_list_all(dpif, &flows, &n_flows), "listing all flows"); ds_init(&ds); - for (i = 0; i < n_flows; i++) { - struct odp_flow *f = &flows[i]; + dpif_flow_dump_start(&dump, dpif); + for (;;) { enum { MAX_ACTIONS = 4096 }; /* An arbitrary but large number. */ - struct nlattr actions[MAX_ACTIONS]; - - f->actions = actions; - f->actions_len = sizeof actions; - if (!dpif_flow_get(dpif, f)) { - ds_clear(&ds); - format_odp_flow(&ds, f); - printf("%s\n", ds_cstr(&ds)); + uint32_t actions[MAX_ACTIONS * sizeof(struct nlattr) / 4]; + uint32_t keybuf[ODPUTIL_FLOW_KEY_U32S]; + struct odp_flow f; + + memset(&f, 0, sizeof f); + f.actions = (struct nlattr *) actions; + f.actions_len = sizeof actions; + f.key = (struct nlattr *) keybuf; + f.key_len = sizeof keybuf; + + if (!dpif_flow_dump_next(&dump, &f)) { + break; } + + ds_clear(&ds); + format_odp_flow(&ds, &f); + printf("%s\n", ds_cstr(&ds)); } + dpif_flow_dump_done(&dump); ds_destroy(&ds); dpif_close(dpif); }