mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 14:53:54 -06:00
slirp: Make Socket structure IPv6 compatible
This patch replaces foreign and local address/port couples in Socket structure by 2 sockaddr_storage which can be casted in sockaddr_in. Direct access to address and port is still possible thanks to some \#define, so retrocompatibility of the existing code is assured. The ss_family field of sockaddr_storage is declared after each socket creation. The whole structure is also saved/restored when a Qemu session is saved/restored. This prepares for IPv6 support. Signed-off-by: Guillaume Subiron <maethor@subiron.org> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
parent
18137fba35
commit
eae303ff23
7 changed files with 78 additions and 16 deletions
|
@ -437,8 +437,8 @@ sowrite(struct socket *so)
|
|||
void
|
||||
sorecvfrom(struct socket *so)
|
||||
{
|
||||
struct sockaddr_in addr;
|
||||
socklen_t addrlen = sizeof(struct sockaddr_in);
|
||||
struct sockaddr_storage addr;
|
||||
socklen_t addrlen = sizeof(struct sockaddr_storage);
|
||||
|
||||
DEBUG_CALL("sorecvfrom");
|
||||
DEBUG_ARG("so = %p", so);
|
||||
|
@ -527,7 +527,13 @@ sorecvfrom(struct socket *so)
|
|||
* If this packet was destined for CTL_ADDR,
|
||||
* make it look like that's where it came from, done by udp_output
|
||||
*/
|
||||
udp_output(so, m, &addr);
|
||||
switch (so->so_ffamily) {
|
||||
case AF_INET:
|
||||
udp_output(so, m, (struct sockaddr_in *) &addr);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} /* rx error */
|
||||
} /* if ping packet */
|
||||
}
|
||||
|
@ -619,6 +625,7 @@ tcp_listen(Slirp *slirp, uint32_t haddr, u_int hport, uint32_t laddr,
|
|||
|
||||
so->so_state &= SS_PERSISTENT_MASK;
|
||||
so->so_state |= (SS_FACCEPTCONN | flags);
|
||||
so->so_lfamily = AF_INET;
|
||||
so->so_lport = lport; /* Kept in network format */
|
||||
so->so_laddr.s_addr = laddr; /* Ditto */
|
||||
|
||||
|
@ -645,6 +652,7 @@ tcp_listen(Slirp *slirp, uint32_t haddr, u_int hport, uint32_t laddr,
|
|||
qemu_setsockopt(s, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(int));
|
||||
|
||||
getsockname(s,(struct sockaddr *)&addr,&addrlen);
|
||||
so->so_ffamily = AF_INET;
|
||||
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 = slirp->vhost_addr;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue