netdev: Decouple creating and configuring network devices.
[sliver-openvswitch.git] / utilities / ovs-dpctl.c
index 40048b4..3b4749c 100644 (file)
@@ -46,7 +46,7 @@
 VLOG_DEFINE_THIS_MODULE(dpctl);
 
 /* -s, --statistics: Print port statistics? */
-bool print_statistics;
+static bool print_statistics;
 
 static const struct command all_commands[];
 
@@ -71,12 +71,12 @@ parse_options(int argc, char *argv[])
         VLOG_OPTION_ENUMS
     };
     static struct option long_options[] = {
-        {"statistics", no_argument, 0, 's'},
-        {"timeout", required_argument, 0, 't'},
-        {"help", no_argument, 0, 'h'},
-        {"version", no_argument, 0, 'V'},
+        {"statistics", no_argument, NULL, 's'},
+        {"timeout", required_argument, NULL, 't'},
+        {"help", no_argument, NULL, 'h'},
+        {"version", no_argument, NULL, 'V'},
         VLOG_LONG_OPTIONS,
-        {0, 0, 0, 0},
+        {NULL, 0, NULL, 0},
     };
     char *short_options = long_options_to_short_options(long_options);
 
@@ -108,7 +108,7 @@ parse_options(int argc, char *argv[])
             usage();
 
         case 'V':
-            OVS_PRINT_VERSION(0, 0);
+            ovs_print_version(0, 0);
             exit(EXIT_SUCCESS);
 
         VLOG_OPTION_HANDLERS
@@ -224,15 +224,13 @@ do_add_if(int argc OVS_UNUSED, char *argv[])
     for (i = 2; i < argc; i++) {
         char *save_ptr = NULL;
         struct netdev_options options;
-        struct netdev *netdev;
+        struct netdev *netdev = NULL;
         struct shash args;
         char *option;
         int error;
 
         options.name = strtok_r(argv[i], ",", &save_ptr);
         options.type = "system";
-        options.args = &args;
-        options.ethertype = NETDEV_ETH_TYPE_NONE;
 
         if (!options.name) {
             ovs_error(0, "%s is not a valid network device name", argv[i]);
@@ -261,16 +259,26 @@ do_add_if(int argc OVS_UNUSED, char *argv[])
         if (error) {
             ovs_error(error, "%s: failed to open network device",
                       options.name);
-        } else {
-            error = dpif_port_add(dpif, netdev, NULL);
-            if (error) {
-                ovs_error(error, "adding %s to %s failed",
-                          options.name, argv[1]);
-            } else {
-                error = if_up(options.name);
-            }
-            netdev_close(netdev);
+            goto next;
+        }
+
+        error = netdev_set_config(netdev, &args);
+        if (error) {
+            ovs_error(error, "%s: failed to configure network device",
+                      options.name);
+            goto next;
         }
+
+        error = dpif_port_add(dpif, netdev, NULL);
+        if (error) {
+            ovs_error(error, "adding %s to %s failed", options.name, argv[1]);
+            goto next;
+        }
+
+        error = if_up(options.name);
+
+next:
+        netdev_close(netdev);
         if (error) {
             failure = true;
         }
@@ -369,6 +377,7 @@ show_dpif(struct dpif *dpif)
                (unsigned long long int) stats.n_hit,
                (unsigned long long int) stats.n_missed,
                (unsigned long long int) stats.n_lost);
+        printf("\tflows: %llu\n", (unsigned long long int)stats.n_flows);
     }
     DPIF_PORT_FOR_EACH (&dpif_port, &dump, dpif) {
         printf("\tport %u: %s", dpif_port.port_no, dpif_port.name);
@@ -382,22 +391,28 @@ show_dpif(struct dpif *dpif)
 
             netdev_options.name = dpif_port.name;
             netdev_options.type = dpif_port.type;
-            netdev_options.args = NULL;
-            netdev_options.ethertype = NETDEV_ETH_TYPE_NONE;
             error = netdev_open(&netdev_options, &netdev);
             if (!error) {
-                const struct shash_node **nodes;
-                const struct shash *config;
-                size_t i;
-
-                config = netdev_get_config(netdev);
-                nodes = shash_sort(config);
-                for (i = 0; i < shash_count(config); i++) {
-                    const struct shash_node *node = nodes[i];
-                    printf("%c %s=%s", i ? ',' : ':',
-                           node->name, (char *) node->data);
+                struct shash config;
+
+                shash_init(&config);
+                error = netdev_get_config(netdev, &config);
+                if (!error) {
+                    const struct shash_node **nodes;
+                    size_t i;
+
+                    nodes = shash_sort(&config);
+                    for (i = 0; i < shash_count(&config); i++) {
+                        const struct shash_node *node = nodes[i];
+                        printf("%c %s=%s", i ? ',' : ':',
+                               node->name, (char *) node->data);
+                    }
+                    free(nodes);
+                } else {
+                    printf(", could not retrieve configuration (%s)",
+                           strerror(error));
                 }
-                free(nodes);
+                shash_destroy_free_data(&config);
 
                 netdev_close(netdev);
             } else {