Commit aef8486e authored by Marc-André Lureau's avatar Marc-André Lureau Committed by Michael S. Tsirkin
Browse files

tests/vhost-user-bridge: add client mode



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

Signed-off-by: default avatarMarc-André Lureau <marcandre.lureau@redhat.com>
Tested-by: default avatarYuanhan Liu <yuanhan.liu@linux.intel.com>
Reviewed-by: default avatarYuanhan Liu <yuanhan.liu@linux.intel.com>
Reviewed-by: default avatarVictor Kaplansky <victork@redhat.com>
Reviewed-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent a6553598
Loading
Loading
Loading
Loading
+30 −14
Original line number Diff line number Diff line
@@ -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,6 +1239,8 @@ vubr_new(const char *path)
    un.sun_family = AF_UNIX;
    strcpy(un.sun_path, path);
    len = sizeof(un.sun_family) + strlen(path);

    if (!client) {
        unlink(path);

        if (bind(dev->sock, (struct sockaddr *) &un, len) == -1) {
@@ -1247,12 +1250,19 @@ vubr_new(const char *path)
        if (listen(dev->sock, 1) == -1) {
            vubr_die("listen");
        }
        cb = vubr_accept_cb;

        DPRINT("Waiting for connections on UNIX socket %s ...\n", path);
    } 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 +1379,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 +1397,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;
    }
@@ -1406,13 +1421,14 @@ main(int argc, char *argv[])

out:
    fprintf(stderr, "Usage: %s ", argv[0]);
    fprintf(stderr, "[-u ud_socket_path] [-l lhost:lport] [-r rhost:rport]\n");
    fprintf(stderr, "[-c] [-u ud_socket_path] [-l lhost:lport] [-r rhost:rport]\n");
    fprintf(stderr, "\t-u path to unix doman socket. default: %s\n",
            DEFAULT_UD_SOCKET);
    fprintf(stderr, "\t-l local host and port. default: %s:%s\n",
            DEFAULT_LHOST, DEFAULT_LPORT);
    fprintf(stderr, "\t-r remote host and port. default: %s:%s\n",
            DEFAULT_RHOST, DEFAULT_RPORT);
    fprintf(stderr, "\t-c client mode\n");

    return 1;
}