On Wed, Jul 12, 2017 at 11:13:05PM +0200, Jens Freimann wrote: > On Wed, Jul 12, 2017 at 06:10:05PM +0300, Michael S. Tsirkin wrote: > > On Wed, Jul 12, 2017 at 11:41:46AM +0200, Jens Freimann wrote: > > > This implements a testcase for pxe-test using the vhost-user interface. > > > Spawn a > > > vhost-user-bridge process and connect it to the qemu process. > > > > > > It is send as an RFC because: > > > - Patch 3/3: there must be cleaner way to do this. > > > - Does Patch 1/3 make sense or should I just redirect all output to > > > /dev/null? > > > - don't hardcode port numbers in qemu cmdline, create socket and pass > > > fd to -netdev (need to figure out how to do this) > > > > Doesn't this work? > > > > -netdev socket,id=str[,fd=h] > > It should. But I get this: > > dded sock 5 for watching. max_sock: 5 > Sock 3 removed from dispatcher watch. > qemu: error: specified mcastaddr "127.0.0.1" (0x7f000001) does not > contain a multicast address > qemu-system-x86_64: -netdev socket,id=n1,fd=3: Device 'socket' could > not be initialized > Broken pipe
Not sure what's wrong with it, should not be too hard to debug. Or maybe we should add unix domain socket support. Sounds like a reasonable feature to me. > diff --git a/tests/pxe-test.c b/tests/pxe-test.c > index 5a0d182..a14c1d9 100644 > --- a/tests/pxe-test.c > +++ b/tests/pxe-test.c > @@ -29,7 +29,7 @@ > #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,udp=localhost:%d,localaddr=localhost:%d" > + " -netdev socket,id=n1,fd=%d" > #define QEMU_CMD_NET " -device virtio-net-pci,netdev=n0 "\ > " -device virtio-net-pci,netdev=n1 " > > @@ -72,16 +72,42 @@ static const char *init_hugepagefs(const char *path) > return path; > } > > +static int vubr_create_socket(struct sockaddr_in *si_remote, int rport) > +{ > + int sock = -1; > + > + if (inet_aton("127.0.0.1", (struct in_addr *) > &si_remote->sin_addr.s_addr) == 0) { > + g_test_message("inet_aton failed\n"); > + return -1; > + } > + > + sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); > + if (sock == -1) { > + g_test_message("socket creation failed\n"); > + } > + if (connect(sock, (struct sockaddr *) si_remote, sizeof(*si_remote))) { > + printf("connect, %d", errno); > + return -1; > + } > + > + return sock; > +} > + > static void test_pxe_vhost_user(void) > { > char template[] = "/tmp/vhost-user-bridge-XXXXXX"; > char template2[] = "/tmp/hugepages-XXXXXX"; > gchar *vubr_args[] = {NULL, NULL, NULL, NULL}; > + struct sockaddr_in si_remote = { > + .sin_family = AF_INET, > + .sin_port = htons(RPORT), > + }; > const char *hugefs; > GError *error = NULL; > char *vubr_binary; > char *qemu_args; > GPid vubr_pid; > + int sock = -1; > > tmpfs = mkdtemp(template); > if (!tmpfs) { > > tmpfs = mkdtemp(template); > if (!tmpfs) { > @@ -109,9 +135,10 @@ static void test_pxe_vhost_user(void) > root = tmpfs2; > } > > + sock = vubr_create_socket(&si_remote, RPORT); > + > qemu_args = g_strdup_printf(QEMU_CMD, MEMSZ, MEMSZ, (root), > - "char0", vubr_args[2], "char0", disk, > - RPORT, LPORT); > + "char0", vubr_args[2], "char0", disk, sock); > > > > regards, > Jens