ovs-openflowd: Add support for userspace-only switching.
[openvswitch] / utilities / ovs-openflowd.c
index d6b2c51f3b032fa9e637f9fb63f2f6b797b7f668..c275cd6a599703b58ed65cc707fd9c4936a609e7 100644 (file)
@@ -64,6 +64,7 @@ struct ofsettings {
     /* Datapath. */
     uint64_t datapath_id;       /* Datapath ID. */
     const char *dp_name;        /* Name of local datapath. */
+    struct svec ports;          /* Set of ports to add to datapath (if any). */
 
     /* Description strings. */
     const char *mfr_desc;       /* Manufacturer. */
@@ -135,6 +136,26 @@ main(int argc, char *argv[])
     VLOG_INFO("Open vSwitch version %s", VERSION BUILDNR);
     VLOG_INFO("OpenFlow protocol version 0x%02x", OFP_VERSION);
 
+    /* Create the datapath and add ports to it, if requested by the user. */
+    if (s.ports.n) {
+        struct dpif *dpif;
+        const char *port;
+        size_t i;
+
+        error = dpif_create_and_open(s.dp_name, &dpif);
+        if (error) {
+            ovs_fatal(error, "could not create datapath");
+        }
+
+        SVEC_FOR_EACH (i, port, &s.ports) {
+            error = dpif_port_add(dpif, port, 0, NULL);
+            if (error) {
+                ovs_fatal(error, "failed to add %s as a port", port);
+            }
+        }
+        dpif_close(dpif);
+    }
+
     /* Start OpenFlow processing. */
     error = ofproto_create(s.dp_name, NULL, NULL, &ofproto);
     if (error) {
@@ -246,6 +267,7 @@ parse_options(int argc, char *argv[], struct ofsettings *s)
         OPT_COMMAND_DIR,
         OPT_NETFLOW,
         OPT_MGMT_ID,
+        OPT_PORTS,
         VLOG_OPTION_ENUMS,
         LEAK_CHECKER_OPTION_ENUMS
     };
@@ -275,6 +297,7 @@ parse_options(int argc, char *argv[], struct ofsettings *s)
         {"command-dir", required_argument, 0, OPT_COMMAND_DIR},
         {"netflow",     required_argument, 0, OPT_NETFLOW},
         {"mgmt-id",     required_argument, 0, OPT_MGMT_ID},
+        {"ports",       required_argument, 0, OPT_PORTS},
         {"verbose",     optional_argument, 0, 'v'},
         {"help",        no_argument, 0, 'h'},
         {"version",     no_argument, 0, 'V'},
@@ -311,6 +334,7 @@ parse_options(int argc, char *argv[], struct ofsettings *s)
     s->command_dir = NULL;
     svec_init(&s->netflow);
     s->mgmt_id = 0;
+    svec_init(&s->ports);
     for (;;) {
         int c;
 
@@ -462,6 +486,10 @@ parse_options(int argc, char *argv[], struct ofsettings *s)
             svec_add(&s->snoops, optarg);
             break;
 
+        case OPT_PORTS:
+            svec_split(&s->ports, optarg, ",");
+            break;
+
         case 'h':
             usage();