]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
kvm tools: Make tcp between guest/host virtual ip work in UIP mode
authorAsias He <asias.hejun@gmail.com>
Thu, 23 Aug 2012 12:47:50 +0000 (20:47 +0800)
committerPekka Enberg <penberg@kernel.org>
Thu, 23 Aug 2012 16:41:31 +0000 (19:41 +0300)
This pach makes tcp between 'guest ip' and 'host virtual ip' work in UIP mode.
(The defulat guest ip is 192.168.33.15, host virtual ip is 192.168.33.1)

  guest$ wget http://192.168.33.1/file
  guest$ ssh 192.168.33.1

Without this patch, user has to figure out the ip address of host's
interface (e.g. eth0) and use that ip address to access host.

With this patch, user can simply use the virtual host ip.

Signed-off-by: Asias He <asias.hejun@gmail.com>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
tools/kvm/net/uip/tcp.c

index 586a45cfd448353de85119f81ce43e754ee0a8da..68a1d6e69cf312d9c48f1411a641f7401ef51f20 100644 (file)
@@ -3,6 +3,7 @@
 #include <linux/virtio_net.h>
 #include <linux/kernel.h>
 #include <linux/list.h>
+#include <arpa/inet.h>
 
 static int uip_tcp_socket_close(struct uip_tcp_socket *sk, int how)
 {
@@ -66,8 +67,11 @@ static struct uip_tcp_socket *uip_tcp_socket_alloc(struct uip_tx_arg *arg, u32 s
 
        sk->fd                          = socket(AF_INET, SOCK_STREAM, 0);
        sk->addr.sin_family             = AF_INET;
-       sk->addr.sin_addr.s_addr        = dip;
        sk->addr.sin_port               = dport;
+       sk->addr.sin_addr.s_addr        = dip;
+
+       if (ntohl(dip) == arg->info->host_ip)
+               sk->addr.sin_addr.s_addr = inet_addr("127.0.0.1");
 
        ret = connect(sk->fd, (struct sockaddr *)&sk->addr, sizeof(sk->addr));
        if (ret) {