Index: qemu/slirp/udp.c =================================================================== --- qemu.orig/slirp/udp.c +++ qemu/slirp/udp.c @@ -205,8 +205,6 @@ udp_input(m, iphlen) /* udp_last_so = so; */ so->so_laddr = ip->ip_src; so->so_lport = uh->uh_sport; - so->so_faddr = ip->ip_dst; /* XXX */ - so->so_fport = uh->uh_dport; /* XXX */ if ((so->so_iptos = udp_tos(so)) == 0) so->so_iptos = ip->ip_tos; @@ -216,6 +214,13 @@ udp_input(m, iphlen) * and if it is, do the fork_exec() etc. */ } + /* Always reset the from address as it can change, + * as with NFS for example where it will talk to + * the same destination port with multiple source + * addresses. Or different gdb session to kgdboe. + */ + so->so_faddr = ip->ip_dst; /* XXX */ + so->so_fport = uh->uh_dport; /* XXX */ iphlen += sizeof(struct udphdr); m->m_len -= iphlen; @@ -312,7 +317,8 @@ int udp_output(struct socket *so, struct struct sockaddr_in saddr, daddr; saddr = *addr; - if ((so->so_faddr.s_addr & htonl(0xffffff00)) == special_addr.s_addr) { + if ((so->so_faddr.s_addr & htonl(0xffffff00)) == special_addr.s_addr && + addr->sin_addr.s_addr == htonl(0x7f000001)) { saddr.sin_addr.s_addr = so->so_faddr.s_addr; if ((so->so_faddr.s_addr & htonl(0x000000ff)) == htonl(0xff)) saddr.sin_addr.s_addr = alias_addr.s_addr;