All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Jens Freimann <jfreimann@redhat.com>
Cc: qemu-devel@nongnu.org, victork@redhat.com,
	maxime.coquelin@redhat.com, jasowang@redhat.com,
	stefanha@redhat.com
Subject: Re: [Qemu-devel] [v3 2/2] tests/pxe-test: add testcase using vhost-user-bridge
Date: Thu, 26 Oct 2017 17:53:12 +0300	[thread overview]
Message-ID: <20171026173918-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <20171026124425.17957-3-jfreimann@redhat.com>

On Thu, Oct 26, 2017 at 02:44:25PM +0200, Jens Freimann wrote:
> From: Jens Freimann <jfreiman@redhat.com>
> 
> Add a PXE testcase tunneling traffic through vhost-user-bridge process.
> Create a vhost-user-bridge process and connect it to qemu via a socket.
> 
> Signed-off-by: Jens Freimann <jfreimann@redhat.com>
> ---
>  tests/Makefile.include |   4 +-
>  tests/pxe-test.c       | 111 +++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 114 insertions(+), 1 deletion(-)
> 
> diff --git a/tests/Makefile.include b/tests/Makefile.include
> index 70dc711bca..6cdb783753 100644
> --- a/tests/Makefile.include
> +++ b/tests/Makefile.include
> @@ -740,7 +740,8 @@ tests/boot-order-test$(EXESUF): tests/boot-order-test.o $(libqos-obj-y)
>  tests/boot-serial-test$(EXESUF): tests/boot-serial-test.o $(libqos-obj-y)
>  tests/bios-tables-test$(EXESUF): tests/bios-tables-test.o \
>  	tests/boot-sector.o tests/acpi-utils.o $(libqos-obj-y)
> -tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o $(libqos-obj-y)
> +tests/pxe-test$(EXESUF): tests/pxe-test.o tests/boot-sector.o \
> +    tests/vhost-user-bridge$(EXESUF) $(libqos-obj-y)
>  tests/tmp105-test$(EXESUF): tests/tmp105-test.o $(libqos-omap-obj-y)
>  tests/ds1338-test$(EXESUF): tests/ds1338-test.o $(libqos-imx-obj-y)
>  tests/m25p80-test$(EXESUF): tests/m25p80-test.o
> @@ -849,6 +850,7 @@ $(patsubst %, check-qtest-%, $(QTEST_TARGETS)): check-qtest-%: subdir-%-softmmu
>  	$(if $(CONFIG_GCOV),@rm -f *.gcda */*.gcda */*/*.gcda */*/*/*.gcda,)
>  	$(call quiet-command,QTEST_QEMU_BINARY=$*-softmmu/qemu-system-$* \
>  		QTEST_QEMU_IMG=qemu-img$(EXESUF) \
> +		QTEST_VUBR_BINARY=./tests/vhost-user-bridge$(EXESUF) \
>  		MALLOC_PERTURB_=$${MALLOC_PERTURB_:-$$(( $${RANDOM:-0} % 255 + 1))} \
>  		gtester $(GTESTER_OPTIONS) -m=$(SPEED) $(check-qtest-$*-y) $(check-qtest-generic-y),"GTESTER","$@")
>  	$(if $(CONFIG_GCOV),@for f in $(gcov-files-$*-y) $(gcov-files-generic-y); do \
> diff --git a/tests/pxe-test.c b/tests/pxe-test.c
> index 937f29e631..d2646ee86d 100644
> --- a/tests/pxe-test.c
> +++ b/tests/pxe-test.c
> @@ -7,6 +7,7 @@
>   *  Michael S. Tsirkin <mst@redhat.com>,
>   *  Victor Kaplansky <victork@redhat.com>
>   *  Thomas Huth <thuth@redhat.com>
> + *  Jens Freimann <jfreiman@redhat.com>
>   *
>   * This work is licensed under the terms of the GNU GPL, version 2 or later.
>   * See the COPYING file in the top-level directory.
> @@ -14,14 +15,123 @@
>  
>  #include "qemu/osdep.h"
>  #include <glib/gstdio.h>
> +#include <glib.h>
>  #include "qemu-common.h"
>  #include "libqtest.h"
>  #include "boot-sector.h"
>  
> +#define LPORT 5555

Is this used anywhere?

> +#define RPORT 4444

Using a known port is problematic as you can't run
many instances of the test then. I think you want an option
to bind in the parent.

>  #define NETNAME "net0"
> +#define QEMU_CMD_MEM    "--enable-kvm -m %d "\

enable-kvm won't work on boxes without kvm.
Pls use same technique as other tests to only use kvm
when available.

> +                        "-object memory-backend-file,id=mem,size=%dM,"\
> +                        "mem-path=%s,share=on -numa node,memdev=mem -mem-prealloc "

Do we really need prealloc? And why?

> +#define QEMU_CMD_CHR    " -chardev socket,id=%s,path=%s"
> +#define QEMU_CMD_NETDEV " -device virtio-net-pci,netdev=net0 "\
> +                        " -netdev vhost-user,id=net0,chardev=%s,vhostforce "\
> +                        " -netdev user,id=n0,tftp=./,bootfile=%s "\
> +                        " -netdev socket,id=n1,fd=%d"
> +#define QEMU_CMD_NET    " -device virtio-net-pci,netdev=n0 "\
> +                        " -device virtio-net-pci,netdev=n1 "
> +
> +#define QEMU_CMD        QEMU_CMD_MEM QEMU_CMD_CHR \
> +                        QEMU_CMD_NETDEV QEMU_CMD_NET
> +
> +#define VUBR_SOCK "vubr.sock"
> +#define MEMSZ 1024
>  
>  static char disk[] = "tests/pxe-test-disk-XXXXXX";
>  
> +static int vubr_create_socket(struct sockaddr_in *si_remote, int rport)
> +{
> +    int sock;
> +
> +    si_remote->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
> +    sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
> +    if (sock == -1) {
> +        g_test_message("socket creation failed\n");
> +        return -1;
> +    }
> +    if (connect(sock, (struct sockaddr *) si_remote, sizeof(*si_remote))) {
> +        g_test_message("connect failed: %s", strerror(errno));
> +        return -1;
> +    }
> +
> +    return sock;
> +}
> +
> +static void vubr_watch(GPid pid, gint status, gpointer data)
> +{
> +    g_assert_cmpint(status, ==, 0);
> +    g_spawn_close_pid(pid);
> +}
> +
> +static void abrt_handler(void *data)
> +{
> +    int *pid = data;
> +
> +    g_spawn_close_pid(*pid);
> +    kill(*pid, SIGTERM);
> +    waitpid(*pid, NULL, 0);
> +}
> +
> +static void test_pxe_vhost_user(void)
> +{
> +    char template[] = "/tmp/vhost-user-bridge-XXXXXX";
> +    gchar * vubr_args[] = {NULL, NULL, NULL, NULL};
> +    struct sockaddr_in si_remote = {
> +        .sin_family = AF_INET,
> +        .sin_port = htons(RPORT),
> +    };
> +    const char *hugefs = NULL;
> +    const char *tmpfs = NULL;
> +    GError *error = NULL;
> +    char *vubr_binary;
> +    char *qemu_args;
> +    GPid vubr_pid;
> +    int sock = -1;
> +
> +    qtest_add_abrt_handler(abrt_handler, &vubr_pid);
> +    tmpfs = mkdtemp(template);
> +    if (!tmpfs) {
> +        g_test_message("mkdtemp on path(%s): %s\n",
> +                       template, strerror(errno));
> +    }

defer above until we know it's used (no hugetlbfs?)

> +    vubr_binary = getenv("QTEST_VUBR_BINARY");
> +    g_assert(vubr_binary);
> +    vubr_args[0] = g_strdup_printf("%s", vubr_binary);
> +    vubr_args[1] = g_strdup_printf("-u");
> +    vubr_args[2] = g_strdup_printf("%s/%s", tmpfs, VUBR_SOCK);
> +    g_spawn_async(NULL, vubr_args, NULL,
> +                  G_SPAWN_SEARCH_PATH |
> +                  G_SPAWN_DO_NOT_REAP_CHILD,
> +                  NULL, NULL, &vubr_pid, &error);
> +    g_assert_no_error(error);
> +    g_child_watch_add(vubr_pid, vubr_watch, NULL);
> +
> +    hugefs = getenv("QTEST_HUGETLBFS_PATH");
> +    if (!hugefs) {
> +        hugefs = tmpfs;
> +    }
> +    sock = vubr_create_socket(&si_remote, RPORT);
> +    g_assert_cmpint(sock, !=, -1);
> +    qemu_args = g_strdup_printf(QEMU_CMD, MEMSZ, MEMSZ, (hugefs),
> +                                "char0", vubr_args[2], "char0",
> +                                disk, sock);
> +    qtest_start(qemu_args);
> +    boot_sector_test();
> +    qtest_quit(global_qtest);
> +    g_free(qemu_args);
> +    g_free(vubr_args[0]);
> +    g_free(vubr_args[1]);
> +    g_free(vubr_args[2]);
> +    g_assert_cmpint(g_remove(g_strdup_printf("%s/%s", tmpfs, VUBR_SOCK)),
> +                    ==, 0);
> +    g_assert_cmpint(g_remove(g_strdup_printf("%s", disk)), ==, 0);
> +    g_assert_cmpint(g_rmdir(tmpfs), ==, 0);
> +    g_assert_cmpint(kill(vubr_pid, SIGTERM), ==, 0);
> +}
> +
>  static void test_pxe_one(const char *params, bool ipv6)
>  {
>      char *args;
> @@ -77,6 +187,7 @@ int main(int argc, char *argv[])
>              qtest_add_data_func("pxe/pcnet", "pcnet", test_pxe_ipv4);
>              qtest_add_data_func("pxe/rtl8139", "rtl8139", test_pxe_ipv4);
>              qtest_add_data_func("pxe/vmxnet3", "vmxnet3", test_pxe_ipv4);
> +            qtest_add_func("pxe/vhost-user", test_pxe_vhost_user);
>          }
>      } else if (strcmp(arch, "ppc64") == 0) {
>          qtest_add_func("pxe/spapr-vlan", test_pxe_spapr_vlan);
> -- 
> 2.13.6

  reply	other threads:[~2017-10-26 14:53 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-26 12:44 [Qemu-devel] [v3 0/2] tests/pxe-test: add testcase using vhost-user-bridge Jens Freimann
2017-10-26 12:44 ` [Qemu-devel] [v3 1/2] tests/vhost-user-bridge: disable debug output by default Jens Freimann
2017-10-26 12:44 ` [Qemu-devel] [v3 2/2] tests/pxe-test: add testcase using vhost-user-bridge Jens Freimann
2017-10-26 14:53   ` Michael S. Tsirkin [this message]
2017-10-27  9:40     ` Jens Freimann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171026173918-mutt-send-email-mst@kernel.org \
    --to=mst@redhat.com \
    --cc=jasowang@redhat.com \
    --cc=jfreimann@redhat.com \
    --cc=maxime.coquelin@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@redhat.com \
    --cc=victork@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.