aboutsummaryrefslogtreecommitdiff
path: root/udp.c
diff options
context:
space:
mode:
authorJan Kiszka <jan.kiszka@siemens.com>2009-06-24 14:42:28 +0200
committerAnthony Liguori <aliguori@us.ibm.com>2009-06-29 08:52:45 -0500
commit12531b49b9735ade00b3dd565c00745bb04459e0 (patch)
tree26d9107e2d329219e8656646b08a509d0c7da0f0 /udp.c
parent4326f42547d52b5ca9c7444d1a56ed2a5d84d826 (diff)
downloadslirp-12531b49b9735ade00b3dd565c00745bb04459e0.zip
slirp-12531b49b9735ade00b3dd565c00745bb04459e0.tar.gz
slirp-12531b49b9735ade00b3dd565c00745bb04459e0.tar.bz2
slirp: Rework internal configuration
The user mode IP stack is currently only minimally configurable /wrt to its virtual IP addresses. This is unfortunate if some guest has a fixed idea of which IP addresses to use. Therefore this patch prepares the stack for fully configurable IP addresses and masks. The user interface and default addresses remain untouched in this step, they will be enhanced in the following patch. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'udp.c')
-rw-r--r--udp.c22
1 files changed, 12 insertions, 10 deletions
diff --git a/udp.c b/udp.c
index 09eb5ff..7bb7323 100644
--- a/udp.c
+++ b/udp.c
@@ -312,12 +312,14 @@ int udp_output(struct socket *so, struct mbuf *m, struct sockaddr_in *addr)
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(0x000000ff)) == htonl(0xff))
- saddr.sin_addr.s_addr = alias_addr.s_addr;
- else if (addr->sin_addr.s_addr == loopback_addr.s_addr ||
- (ntohl(so->so_faddr.s_addr) & 0xff) != CTL_ALIAS)
- saddr.sin_addr.s_addr = so->so_faddr.s_addr;
+ if ((so->so_faddr.s_addr & vnetwork_mask.s_addr) == vnetwork_addr.s_addr) {
+ if ((so->so_faddr.s_addr & ~vnetwork_mask.s_addr) ==
+ ~vnetwork_mask.s_addr) {
+ saddr.sin_addr = vhost_addr;
+ } else if (addr->sin_addr.s_addr == loopback_addr.s_addr ||
+ so->so_faddr.s_addr != vhost_addr.s_addr) {
+ saddr.sin_addr = so->so_faddr;
+ }
}
daddr.sin_addr = so->so_laddr;
daddr.sin_port = so->so_lport;
@@ -647,11 +649,11 @@ struct socket *udp_listen(u_int port, u_int32_t laddr, u_int lport, int flags)
getsockname(so->s, (struct sockaddr *)&addr, &addrlen);
so->so_fport = addr.sin_port;
if (addr.sin_addr.s_addr == 0 ||
- addr.sin_addr.s_addr == loopback_addr.s_addr)
- so->so_faddr = alias_addr;
- else
+ addr.sin_addr.s_addr == loopback_addr.s_addr) {
+ so->so_faddr = vhost_addr;
+ } else {
so->so_faddr = addr.sin_addr;
-
+ }
so->so_lport = lport;
so->so_laddr.s_addr = laddr;
if (flags != SS_FACCEPTONCE)