dpctl: Allow datapath names to be given in place of switch names.
authorBen Pfaff <blp@nicira.com>
Wed, 18 Mar 2009 17:03:14 +0000 (10:03 -0700)
committerBen Pfaff <blp@nicira.com>
Wed, 18 Mar 2009 17:20:55 +0000 (10:20 -0700)
It is convenient to be able to type, e.g., "dpctl show xenbr0" instead of
"dpctl show unix:/var/run/xenbr0.mgmt", so this allows this form.

utilities/dpctl.8.in
utilities/dpctl.c

index d72fcf916c2f186bea6da2cf7a5f2ca1b12484fa..6cd548ce15ea55243c6e0f84afb28cca63a5eedd 100644 (file)
@@ -144,7 +144,15 @@ The specified TCP \fIport\fR (default: 6633) on the given remote
 
 .TP
 \fBunix:\fIfile\fR
-The Unix domain server socket named \fIfile\fR.
+The Unix domain server socket named \fIfile\fR.  
+
+.IP "\fIfile\fR"
+This is short for \fBunix:\fIfile\fR, as long as \fIfile\fR does not
+contain a colon.
+
+.IP \fIdp\fR
+This is short for \fBunix:@RUNDIR@/\fIdp\fB.mgmt\fR, as long as
+\fIdp\fR does not contain a colon.
 .RE
 
 .TP
index e3cbace1656c5e5b981f4b6ab732d5faf094b0cc..c231110448071934688b5b26070acec29ff04f38 100644 (file)
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <sys/stat.h>
 #include <sys/time.h>
 
 #include "command-line.h"
 #include "compiler.h"
+#include "dirs.h"
 #include "dpif.h"
 #include "dynamic-string.h"
 #include "netdev.h"
@@ -597,7 +599,48 @@ do_dp_dump_groups(const struct settings *s UNUSED,
 static void
 open_vconn(const char *name, struct vconn **vconnp)
 {
-    run(vconn_open_block(name, OFP_VERSION, vconnp), "connecting to %s", name);
+    struct dpif dpif;
+    struct stat s;
+
+    if (strstr(name, ":")) {
+        run(vconn_open_block(name, OFP_VERSION, vconnp),
+            "connecting to %s", name);
+    } else if (!stat(name, &s) && S_ISSOCK(s.st_mode)) {
+        char *vconn_name = xasprintf("unix:%s", name);
+        VLOG_INFO("connecting to %s", vconn_name);
+        run(vconn_open_block(vconn_name, OFP_VERSION, vconnp),
+            "connecting to %s", vconn_name);
+        free(vconn_name);
+    } else if (!dpif_open(name, &dpif)) {
+        char dpif_name[IF_NAMESIZE + 1];
+        char *socket_name;
+        char *vconn_name;
+
+        run(dpif_get_name(&dpif, dpif_name, sizeof dpif_name),
+            "obtaining name of %s", dpif_name);
+        dpif_close(&dpif);
+        if (strcmp(dpif_name, name)) {
+            VLOG_INFO("datapath %s is named %s", name, dpif_name);
+        }
+
+        socket_name = xasprintf("%s/%s.mgmt", ofp_rundir, dpif_name);
+        if (stat(socket_name, &s)) {
+            ofp_fatal(errno, "cannot connect to %s: stat failed on %s",
+                      name, socket_name);
+        } else if (!S_ISSOCK(s.st_mode)) {
+            ofp_fatal(0, "cannot connect to %s: %s is not a socket",
+                      name, socket_name);
+        }
+
+        vconn_name = xasprintf("unix:%s", socket_name);
+        VLOG_INFO("connecting to %s", vconn_name);
+        run(vconn_open_block(vconn_name, OFP_VERSION, vconnp),
+            "connecting to %s", vconn_name);
+        free(socket_name);
+        free(vconn_name);
+    } else {
+        ofp_fatal(0, "%s is not a valid connection method", name);
+    }
 }
 
 static void *