diff mbox

[02/10] vubr: add client mode

Message ID 1462896240-30999-3-git-send-email-marcandre.lureau@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Marc-André Lureau May 10, 2016, 4:03 p.m. UTC
From: Marc-André Lureau <marcandre.lureau@redhat.com>

If -c is specified, vubr will try to connect to the socket instead of
listening for connections.

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
---
 tests/vhost-user-bridge.c | 38 ++++++++++++++++++++++++++------------
 1 file changed, 26 insertions(+), 12 deletions(-)

Comments

Yuanhan Liu May 10, 2016, 5:19 p.m. UTC | #1
Hi,

Just to let you know that as a client, it need to add the reconnect
ability, as the QEMU (as the server) may restart as well. Well, I'm
thinking that you may think it's an example bridge only, so, let it
be simple. Then I'm sorry for the noise.

	--yliu

On Tue, May 10, 2016 at 06:03:52PM +0200, marcandre.lureau@redhat.com wrote:
> From: Marc-André Lureau <marcandre.lureau@redhat.com>
> 
> If -c is specified, vubr will try to connect to the socket instead of
> listening for connections.
> 
> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
> ---
>  tests/vhost-user-bridge.c | 38 ++++++++++++++++++++++++++------------
>  1 file changed, 26 insertions(+), 12 deletions(-)
> 
> diff --git a/tests/vhost-user-bridge.c b/tests/vhost-user-bridge.c
> index 0779ba2..f907ce7 100644
> --- a/tests/vhost-user-bridge.c
> +++ b/tests/vhost-user-bridge.c
> @@ -1204,12 +1204,13 @@ vubr_accept_cb(int sock, void *ctx)
>  }
>  
>  static VubrDev *
> -vubr_new(const char *path)
> +vubr_new(const char *path, bool client)
>  {
>      VubrDev *dev = (VubrDev *) calloc(1, sizeof(VubrDev));
>      dev->nregions = 0;
>      int i;
>      struct sockaddr_un un;
> +    CallbackFunc cb;
>      size_t len;
>  
>      for (i = 0; i < MAX_NR_VIRTQUEUE; i++) {
> @@ -1238,19 +1239,27 @@ vubr_new(const char *path)
>      un.sun_family = AF_UNIX;
>      strcpy(un.sun_path, path);
>      len = sizeof(un.sun_family) + strlen(path);
> -    unlink(path);
>  
> -    if (bind(dev->sock, (struct sockaddr *) &un, len) == -1) {
> -        vubr_die("bind");
> -    }
> +    if (!client) {
> +        unlink(path);
> +
> +        if (bind(dev->sock, (struct sockaddr *) &un, len) == -1) {
> +            vubr_die("bind");
> +        }
>  
> -    if (listen(dev->sock, 1) == -1) {
> -        vubr_die("listen");
> +        if (listen(dev->sock, 1) == -1) {
> +            vubr_die("listen");
> +        }
> +        cb = vubr_accept_cb;
> +    } else {
> +        if (connect(dev->sock, (struct sockaddr *)&un, len) == -1) {
> +            vubr_die("connect");
> +        }
> +        cb = vubr_receive_cb;
>      }
>  
>      dispatcher_init(&dev->dispatcher);
> -    dispatcher_add(&dev->dispatcher, dev->sock, (void *)dev,
> -                   vubr_accept_cb);
> +    dispatcher_add(&dev->dispatcher, dev->sock, (void *)dev, cb);
>  
>      DPRINT("Waiting for connections on UNIX socket %s ...\n", path);
>      return dev;
> @@ -1369,8 +1378,9 @@ main(int argc, char *argv[])
>  {
>      VubrDev *dev;
>      int opt;
> +    bool client = false;
>  
> -    while ((opt = getopt(argc, argv, "l:r:u:")) != -1) {
> +    while ((opt = getopt(argc, argv, "l:r:u:c")) != -1) {
>  
>          switch (opt) {
>          case 'l':
> @@ -1386,16 +1396,20 @@ main(int argc, char *argv[])
>          case 'u':
>              ud_socket_path = strdup(optarg);
>              break;
> +        case 'c':
> +            client = true;
> +            break;
>          default:
>              goto out;
>          }
>      }
>  
> -    DPRINT("ud socket: %s\n", ud_socket_path);
> +    DPRINT("ud socket: %s (%s)\n", ud_socket_path,
> +           client ? "client" : "server");
>      DPRINT("local:     %s:%s\n", lhost, lport);
>      DPRINT("remote:    %s:%s\n", rhost, rport);
>  
> -    dev = vubr_new(ud_socket_path);
> +    dev = vubr_new(ud_socket_path, client);
>      if (!dev) {
>          return 1;
>      }
> -- 
> 2.7.4
Marc-André Lureau May 10, 2016, 6:08 p.m. UTC | #2
Hi

----- Original Message -----
> Hi,
> 
> Just to let you know that as a client, it need to add the reconnect
> ability, as the QEMU (as the server) may restart as well. Well, I'm
> thinking that you may think it's an example bridge only, so, let it
> be simple. Then I'm sorry for the noise.

That's a different use case to me, and a separate possible addition to vubr.

thanks
diff mbox

Patch

diff --git a/tests/vhost-user-bridge.c b/tests/vhost-user-bridge.c
index 0779ba2..f907ce7 100644
--- a/tests/vhost-user-bridge.c
+++ b/tests/vhost-user-bridge.c
@@ -1204,12 +1204,13 @@  vubr_accept_cb(int sock, void *ctx)
 }
 
 static VubrDev *
-vubr_new(const char *path)
+vubr_new(const char *path, bool client)
 {
     VubrDev *dev = (VubrDev *) calloc(1, sizeof(VubrDev));
     dev->nregions = 0;
     int i;
     struct sockaddr_un un;
+    CallbackFunc cb;
     size_t len;
 
     for (i = 0; i < MAX_NR_VIRTQUEUE; i++) {
@@ -1238,19 +1239,27 @@  vubr_new(const char *path)
     un.sun_family = AF_UNIX;
     strcpy(un.sun_path, path);
     len = sizeof(un.sun_family) + strlen(path);
-    unlink(path);
 
-    if (bind(dev->sock, (struct sockaddr *) &un, len) == -1) {
-        vubr_die("bind");
-    }
+    if (!client) {
+        unlink(path);
+
+        if (bind(dev->sock, (struct sockaddr *) &un, len) == -1) {
+            vubr_die("bind");
+        }
 
-    if (listen(dev->sock, 1) == -1) {
-        vubr_die("listen");
+        if (listen(dev->sock, 1) == -1) {
+            vubr_die("listen");
+        }
+        cb = vubr_accept_cb;
+    } else {
+        if (connect(dev->sock, (struct sockaddr *)&un, len) == -1) {
+            vubr_die("connect");
+        }
+        cb = vubr_receive_cb;
     }
 
     dispatcher_init(&dev->dispatcher);
-    dispatcher_add(&dev->dispatcher, dev->sock, (void *)dev,
-                   vubr_accept_cb);
+    dispatcher_add(&dev->dispatcher, dev->sock, (void *)dev, cb);
 
     DPRINT("Waiting for connections on UNIX socket %s ...\n", path);
     return dev;
@@ -1369,8 +1378,9 @@  main(int argc, char *argv[])
 {
     VubrDev *dev;
     int opt;
+    bool client = false;
 
-    while ((opt = getopt(argc, argv, "l:r:u:")) != -1) {
+    while ((opt = getopt(argc, argv, "l:r:u:c")) != -1) {
 
         switch (opt) {
         case 'l':
@@ -1386,16 +1396,20 @@  main(int argc, char *argv[])
         case 'u':
             ud_socket_path = strdup(optarg);
             break;
+        case 'c':
+            client = true;
+            break;
         default:
             goto out;
         }
     }
 
-    DPRINT("ud socket: %s\n", ud_socket_path);
+    DPRINT("ud socket: %s (%s)\n", ud_socket_path,
+           client ? "client" : "server");
     DPRINT("local:     %s:%s\n", lhost, lport);
     DPRINT("remote:    %s:%s\n", rhost, rport);
 
-    dev = vubr_new(ud_socket_path);
+    dev = vubr_new(ud_socket_path, client);
     if (!dev) {
         return 1;
     }