diff mbox

dns server not working in QEMU using usermode networking (SLIRP)

Message ID 20170429191402.ebsdilnya67ispla@var.youpi.perso.aquilenet.fr
State New
Headers show

Commit Message

Samuel Thibault April 29, 2017, 7:14 p.m. UTC
FONNEMANN Mark, on sam. 29 avril 2017 18:25:26 +0000, wrote:
> 0 packets received by filter

Ok, so nothing going out from qemu. Could you try to apply the attached
patch to qemu-2.9 and see what it makes qemu print when you resolve a
domain from the guest?

Samuel

Comments

FONNEMANN Mark April 29, 2017, 8:06 p.m. UTC | #1
>Ok, so nothing going out from qemu. Could you try to apply the attached patch to qemu-2.9 and see what it makes qemu print when you resolve a domain from the guest?

After applying patch, compiling, installing and then doing a nslookup request in the guest, I still receive no output in tcpdump and my logfile is empty:

[mfonnemann@localhost qemu-2.9.0]$ make
make  all-recursive
Making all in pixman
make[3]: Nothing to be done for `all'.
Making all in demos
make[3]: Nothing to be done for `all'.
Making all in test
make[3]: Nothing to be done for `all'.
        CHK version_gen.h
  CC      slirp/slirp.o
  CC      slirp/socket.o
  CC      slirp/udp.o
  LINK    i386-softmmu/qemu-system-i386
  LINK    x86_64-softmmu/qemu-system-x86_64

[mfonnemann@localhost qemu-2.9.0]$ sudo make install
[sudo] password for mfonnemann:
make  all-recursive
Making all in pixman
make[3]: Nothing to be done for `all'.
Making all in demos
make[3]: Nothing to be done for `all'.
Making all in test
make[3]: Nothing to be done for `all'.
        CHK version_gen.h
install -d -m 0755 "/usr/local/share/qemu"
install -d -m 0755 "/usr/local/var"/run
install -d -m 0755 "/usr/local/bin"
install -c -m 0755 qemu-ga ivshmem-client ivshmem-server qemu-nbd qemu-img qemu-io  "/usr/local/bin"
strip "/usr/local/bin/qemu-ga" "/usr/local/bin/ivshmem-client" "/usr/local/bin/ivshmem-server" "/usr/local/bin/qemu-nbd" "/usr/local/bin/qemu-img" "/usr/local/bin/qemu-io"
install -d -m 0755 "/usr/local/libexec"
install -c -m 0755 qemu-bridge-helper "/usr/local/libexec"
strip "/usr/local/libexec/qemu-bridge-helper"
set -e; for x in bios.bin bios-256k.bin sgabios.bin vgabios.bin vgabios-cirrus.bin vgabios-stdvga.bin vgabios-vmware.bin vgabios-qxl.bin vgabios-virtio.bin acpi-dsdt.aml ppc_rom.bin openbios-sparc32 openbios-sparc64 openbios-ppc QEMU,tcx.bin QEMU,cgthree.bin pxe-e1000.rom pxe-eepro100.rom pxe-ne2k_pci.rom pxe-pcnet.rom pxe-rtl8139.rom pxe-virtio.rom efi-e1000.rom efi-eepro100.rom efi-ne2k_pci.rom efi-pcnet.rom efi-rtl8139.rom efi-virtio.rom efi-e1000e.rom efi-vmxnet3.rom qemu-icon.bmp qemu_logo_no_text.svg bamboo.dtb petalogix-s3adsp1800.dtb petalogix-ml605.dtb multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin s390-ccw.img spapr-rtas.bin slof.bin skiboot.lid palcode-clipper u-boot.e500; do \
        install -c -m 0644 /home/mfonnemann/qemu-2.9.0/pc-bios/$x "/usr/local/share/qemu"; \
done
install -d -m 0755 "/usr/local/share/qemu/keymaps"
set -e; for x in da     en-gb  et  fr     fr-ch  is  lt  modifiers  no  pt-br  sv ar      de     en-us  fi  fr-be  hr     it  lv  nl         pl  ru     th common  de-ch  es     fo  fr-ca  hu     ja  mk  nl-be      pt  sl     tr bepo    cz; do \
        install -c -m 0644 /home/mfonnemann/qemu-2.9.0/pc-bios/keymaps/$x "/usr/local/share/qemu/keymaps"; \
done
install -c -m 0644 /home/mfonnemann/qemu-2.9.0/trace-events-all "/usr/local/share/qemu/trace-events-all"
for d in i386-softmmu x86_64-softmmu; do \
make --no-print-directory BUILD_DIR=/home/mfonnemann/qemu-2.9.0 TARGET_DIR=$d/ -C $d install || exit 1 ; \
        done
install -d -m 0755 "/usr/local/bin"
install -c -m 0755 qemu-system-i386  "/usr/local/bin"
strip "/usr/local/bin/qemu-system-i386"
install -d -m 0755 "/usr/local/bin"
install -c -m 0755 qemu-system-x86_64  "/usr/local/bin"
strip "/usr/local/bin/qemu-system-x86_64"

[mfonnemann@localhost qemu]$ /usr/local/bin/qemu-system-i386 -display curses -readconfig qemu.cfg -D logfile

root@qemu:~# nslookup www.google.com

                    *** Unknown host

                    nslookup: www.google.com: Unknown host

[mfonnemann@localhost qemu]$ ls -Al logfile
-rw-rw-r--. 1 mfonnemann mfonnemann 0 Apr 29 15:58 logfile

Mark.
diff mbox

Patch

--- a/slirp/socket.c
+++ b/slirp/socket.c
@@ -814,11 +814,18 @@  void sotranslate_out(struct socket *so,
 
     switch (addr->ss_family) {
     case AF_INET:
+        fprintf(stderr,"translating %x against %x %x\n",
+                so->so_faddr.s_addr,
+                slirp->vnetwork_mask.s_addr,
+                slirp->vnameserver_addr.s_addr);
         if ((so->so_faddr.s_addr & slirp->vnetwork_mask.s_addr) ==
                 slirp->vnetwork_addr.s_addr) {
             /* It's an alias */
+            fprintf(stderr,"it's an alias\n");
             if (so->so_faddr.s_addr == slirp->vnameserver_addr.s_addr) {
+                fprintf(stderr,"it's DNS\n");
                 if (get_dns_addr(&sin->sin_addr) < 0) {
+                    fprintf(stderr,"didn't get DNS address");
                     sin->sin_addr = loopback_addr;
                 }
             } else {
--- a/slirp/udp.c
+++ b/slirp/udp.c
@@ -133,6 +133,10 @@  udp_input(register struct mbuf *m, int i
 	lhost4->sin_addr = ip->ip_src;
 	lhost4->sin_port = uh->uh_sport;
 
+        if (ntohs(uh->uh_dport) == 53 &&
+            ip->ip_dst.s_addr == slirp->vnameserver_addr.s_addr)
+            fprintf(stderr,"UDP packet for DNS server\n");
+
         /*
          *  handle DHCP/BOOTP
          */
--- a/slirp/slirp.c
+++ b/slirp/slirp.c
@@ -165,6 +165,7 @@  static int get_dns_addr_resolv_conf(int
 #endif
     while (fgets(buff, 512, f) != NULL) {
         if (sscanf(buff, "nameserver%*[ \t]%256s", buff2) == 1) {
+            fprintf(stderr,"got resolv.conf entry '%s'\n", buff2);
             char *c = strchr(buff2, '%');
             if (c) {
                 if_index = if_nametoindex(c + 1);
@@ -174,10 +175,16 @@  static int get_dns_addr_resolv_conf(int
             }
 
             if (!inet_pton(af, buff2, tmp_addr)) {
+                fprintf(stderr,"couldn't parse it\n");
                 continue;
             }
             /* If it's the first one, set it to dns_addr */
             if (!found) {
+                if (af == AF_INET)
+                {
+                    struct sockaddr_in *sin = tmp_addr;
+                    fprintf(stderr,"parsed %x\n", sin->sin_addr.s_addr);
+                }
                 memcpy(pdns_addr, tmp_addr, addrlen);
                 memcpy(cached_addr, tmp_addr, addrlen);
                 if (scope_id) {
@@ -219,6 +226,7 @@  int get_dns_addr(struct in_addr *pdns_ad
 
     if (dns_addr.s_addr != 0) {
         int ret;
+        fprintf(stderr,"dns_addr is cached: %x\n", dns_addr.s_addr);
         ret = get_dns_addr_cached(pdns_addr, &dns_addr, sizeof(dns_addr),
                                   &dns_addr_stat, &dns_addr_time);
         if (ret <= 0) {