vswitchd: Don't make and pass socketpair to secchan if we won't use it.
authorBen Pfaff <blp@nicira.com>
Sat, 3 Jan 2009 00:39:59 +0000 (16:39 -0800)
committerBen Pfaff <blp@nicira.com>
Sat, 3 Jan 2009 00:40:23 +0000 (16:40 -0800)
If there's a remote controller then secchan will talk to it, not to
vswitchd, so there's no need to make a socketpair for communication in
that case.

vswitchd/bridge.c

index 447a8819d47cdf686529091fb9b59f97a7b5ded3..17c6dc88e0f20985ced77e5bc0d5c1533bfc8d09 100644 (file)
@@ -553,19 +553,24 @@ start_secchan(struct bridge *br)
         br->secchan = NULL;
     }
 
-    /* Create socketpair for communicating with secchan subprocess. */
-    if (socketpair(AF_LOCAL, SOCK_STREAM, 0, sockets)) {
-        VLOG_ERR("%s: failed to create socket pair: %s",
-                 br->name, strerror(errno));
-        goto error;
+    if (!br->controller) {
+        /* Create socketpair for communicating with secchan subprocess. */
+        if (socketpair(AF_LOCAL, SOCK_STREAM, 0, sockets)) {
+            VLOG_ERR("%s: failed to create socket pair: %s",
+                     br->name, strerror(errno));
+            goto error;
+        }
+        set_nonblocking(sockets[0]);
+        set_nonblocking(sockets[1]);
+
+        /* Connect to our end of the socketpair. */
+        dp_name = xasprintf("fd:%d", sockets[0]);
+        rconn_connect(br->rconn, dp_name);
+        free(dp_name);
+    } else {
+        /* secchan will connect to the external controller, not to us, so there
+         * is nothing for us to do. */
     }
-    set_nonblocking(sockets[0]);
-    set_nonblocking(sockets[1]);
-
-    /* Connect to our end of the socketpair. */
-    dp_name = xasprintf("fd:%d", sockets[0]);
-    rconn_connect(br->rconn, dp_name);
-    free(dp_name);
 
     /* Assemble command-line arguments. */
     svec_init(&argv);
@@ -598,9 +603,13 @@ start_secchan(struct bridge *br)
     svec_terminate(&argv);
 
     /* Start secchan. */
-    retval = process_start(argv.names, &sockets[1], 1, &br->secchan);
+    if (!br->controller) {
+        retval = process_start(argv.names, &sockets[1], 1, &br->secchan);
+        close(sockets[1]);
+    } else {
+        retval = process_start(argv.names, NULL, 0, &br->secchan);
+    }
     svec_destroy(&argv);
-    close(sockets[1]);
     if (retval) {
         VLOG_ERR("%s: failed to start secchan for datapath nl:%d: %s",
                  br->name, br->dp_idx, strerror(retval));