Message ID | 1462896240-30999-3-git-send-email-marcandre.lureau@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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
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 --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; }