X-Git-Url: http://git.cascardo.eti.br/?a=blobdiff_plain;f=utilities%2Fovs-dpctl.c;h=ebcf2e23d9726f3e5ee519056aebfd23bd159131;hb=a4af00400a835eb87569ba40e21874c05e872c0f;hp=932aa893fef49e1ced25a03e3752e028fd5cd4bf;hpb=5819a7cdcf44f0277c538353672fb27701c764f9;p=cascardo%2Fovs.git diff --git a/utilities/ovs-dpctl.c b/utilities/ovs-dpctl.c index 932aa893f..ebcf2e23d 100644 --- a/utilities/ovs-dpctl.c +++ b/utilities/ovs-dpctl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009 Nicira Networks. + * Copyright (c) 2008, 2009, 2010 Nicira Networks. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,56 +43,20 @@ #include "vlog.h" #define THIS_MODULE VLM_dpctl -struct command { - const char *name; - int min_args; - int max_args; - void (*handler)(int argc, char *argv[]); -}; - -static struct command all_commands[]; +static const struct command all_commands[]; static void usage(void) NO_RETURN; static void parse_options(int argc, char *argv[]); -int main(int argc, char *argv[]) +int +main(int argc, char *argv[]) { - struct command *p; - set_program_name(argv[0]); time_init(); vlog_init(); parse_options(argc, argv); signal(SIGPIPE, SIG_IGN); - - argc -= optind; - argv += optind; - if (argc < 1) - ovs_fatal(0, "missing command name; use --help for help"); - - for (p = all_commands; p->name != NULL; p++) { - if (!strcmp(p->name, argv[0])) { - int n_arg = argc - 1; - if (n_arg < p->min_args) - ovs_fatal(0, "'%s' command requires at least %d arguments", - p->name, p->min_args); - else if (n_arg > p->max_args) - ovs_fatal(0, "'%s' command takes at most %d arguments", - p->name, p->max_args); - else { - p->handler(argc, argv); - if (ferror(stdout)) { - ovs_fatal(0, "write to stdout failed"); - } - if (ferror(stderr)) { - ovs_fatal(0, "write to stderr failed"); - } - exit(0); - } - } - } - ovs_fatal(0, "unknown command '%s'; use --help for help", argv[0]); - + run_command(argc - optind, argv + optind, all_commands); return 0; } @@ -204,7 +168,7 @@ static int if_up(const char *netdev_name) struct netdev *netdev; int retval; - retval = netdev_open(netdev_name, NETDEV_ETH_TYPE_NONE, &netdev); + retval = netdev_open_default(netdev_name, &netdev); if (!retval) { retval = netdev_turn_flags_on(netdev, NETDEV_UP, true); netdev_close(netdev); @@ -212,11 +176,30 @@ static int if_up(const char *netdev_name) return retval; } +static int +parsed_dpif_open(const char *arg_, bool create, struct dpif **dpifp) +{ + int result; + char *name, *type; + + dp_parse_name(arg_, &name, &type); + + if (create) { + result = dpif_create(name, type, dpifp); + } else { + result = dpif_open(name, type, dpifp); + } + + free(name); + free(type); + return result; +} + static void do_add_dp(int argc UNUSED, char *argv[]) { struct dpif *dpif; - run(dpif_create(argv[1], &dpif), "add_dp"); + run(parsed_dpif_open(argv[1], true, &dpif), "add_dp"); dpif_close(dpif); if (argc > 2) { do_add_if(argc, argv); @@ -227,7 +210,7 @@ static void do_del_dp(int argc UNUSED, char *argv[]) { struct dpif *dpif; - run(dpif_open(argv[1], &dpif), "opening datapath"); + run(parsed_dpif_open(argv[1], false, &dpif), "opening datapath"); run(dpif_delete(dpif), "del_dp"); dpif_close(dpif); } @@ -254,7 +237,7 @@ do_add_if(int argc UNUSED, char *argv[]) struct dpif *dpif; int i; - run(dpif_open(argv[1], &dpif), "opening datapath"); + run(parsed_dpif_open(argv[1], false, &dpif), "opening datapath"); for (i = 2; i < argc; i++) { char *save_ptr = NULL; char *devname, *suboptions; @@ -332,7 +315,7 @@ do_del_if(int argc UNUSED, char *argv[]) struct dpif *dpif; int i; - run(dpif_open(argv[1], &dpif), "opening datapath"); + run(parsed_dpif_open(argv[1], false, &dpif), "opening datapath"); for (i = 2; i < argc; i++) { const char *name = argv[i]; uint16_t port; @@ -404,7 +387,7 @@ do_show(int argc, char *argv[]) struct dpif *dpif; int error; - error = dpif_open(name, &dpif); + error = parsed_dpif_open(name, false, &dpif); if (!error) { show_dpif(dpif); } else { @@ -420,7 +403,7 @@ do_show(int argc, char *argv[]) int error; sprintf(name, "dp%u", i); - error = dpif_open(name, &dpif); + error = parsed_dpif_open(name, false, &dpif); if (!error) { show_dpif(dpif); } else if (error != ENODEV) { @@ -437,22 +420,34 @@ do_show(int argc, char *argv[]) static void do_dump_dps(int argc UNUSED, char *argv[] UNUSED) { - struct svec all_dps; + struct svec dpif_names, dpif_types; unsigned int i; - int error; + int error = 0; + + svec_init(&dpif_names); + svec_init(&dpif_types); + dp_enumerate_types(&dpif_types); + + for (i = 0; i < dpif_types.n; i++) { + unsigned int j; + int retval; - svec_init(&all_dps); - error = dp_enumerate(&all_dps); + retval = dp_enumerate_names(dpif_types.names[i], &dpif_names); + if (retval) { + error = retval; + } - for (i = 0; i < all_dps.n; i++) { - struct dpif *dpif; - if (!dpif_open(all_dps.names[i], &dpif)) { - printf("%s\n", dpif_name(dpif)); - dpif_close(dpif); + for (j = 0; j < dpif_names.n; j++) { + struct dpif *dpif; + if (!dpif_open(dpif_names.names[j], dpif_types.names[i], &dpif)) { + printf("%s\n", dpif_name(dpif)); + dpif_close(dpif); + } } } - svec_destroy(&all_dps); + svec_destroy(&dpif_names); + svec_destroy(&dpif_types); if (error) { exit(EXIT_FAILURE); } @@ -467,7 +462,7 @@ do_dump_flows(int argc UNUSED, char *argv[]) struct ds ds; size_t i; - run(dpif_open(argv[1], &dpif), "opening datapath"); + 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); @@ -493,7 +488,7 @@ do_del_flows(int argc UNUSED, char *argv[]) { struct dpif *dpif; - run(dpif_open(argv[1], &dpif), "opening datapath"); + run(parsed_dpif_open(argv[1], false, &dpif), "opening datapath"); run(dpif_flow_flush(dpif), "deleting all flows"); dpif_close(dpif); } @@ -505,7 +500,7 @@ do_dump_groups(int argc UNUSED, char *argv[]) struct dpif *dpif; unsigned int i; - run(dpif_open(argv[1], &dpif), "opening datapath"); + run(parsed_dpif_open(argv[1], false, &dpif), "opening datapath"); run(dpif_get_dp_stats(dpif, &stats), "get datapath stats"); for (i = 0; i < stats.max_groups; i++) { uint16_t *ports; @@ -531,7 +526,7 @@ do_help(int argc UNUSED, char *argv[] UNUSED) usage(); } -static struct command all_commands[] = { +static const struct command all_commands[] = { { "add-dp", 1, INT_MAX, do_add_dp }, { "del-dp", 1, 1, do_del_dp }, { "add-if", 2, INT_MAX, do_add_if },