mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-12-11 21:31:30 +00:00
ipv6: builds and works now, still can't interact with ipv4 clients/servers
This commit is contained in:
parent
fdb4d885ae
commit
878a9cfb6a
1 changed files with 21 additions and 43 deletions
|
@ -244,35 +244,16 @@ const char *
|
|||
NET_BaseAdrToString (netadr_t a)
|
||||
{
|
||||
static char s[64];
|
||||
struct sockaddr_storage ss;
|
||||
AF_address_t ss;
|
||||
|
||||
// NetadrToSockadr(&a,&sa);
|
||||
NetadrToSockadr(&a,&ss);
|
||||
|
||||
memset (&ss, 0, sizeof (ss));
|
||||
if (IN6_IS_ADDR_V4MAPPED ((struct in6_addr *) a.ip)) {
|
||||
#ifdef HAVE_SS_LEN
|
||||
ss.ss_len = sizeof (struct sockaddr_in);
|
||||
#endif
|
||||
ss.ss_family = AF_INET;
|
||||
memcpy (&((struct sockaddr_in *) &ss)->sin_addr,
|
||||
&((struct in6_addr *) a.ip)->s6_addr[12],
|
||||
|
||||
sizeof (struct in_addr));
|
||||
} else {
|
||||
#ifdef HAVE_SS_LEN
|
||||
ss.ss_len = sizeof (struct sockaddr_in6);
|
||||
#endif
|
||||
ss.ss_family = AF_INET6;
|
||||
memcpy (&((struct sockaddr_in6 *) &ss)->sin6_addr,
|
||||
|
||||
a.ip, sizeof (struct in6_addr));
|
||||
}
|
||||
#ifdef HAVE_SS_LEN
|
||||
if (getnameinfo ((struct sockaddr *) &ss, ss.ss_len, s, sizeof (s),
|
||||
if (getnameinfo (&ss.sa, ss.ss.ss_len, s, sizeof (s),
|
||||
NULL, 0, NI_NUMERICHOST)) strcpy (s, "<invalid>");
|
||||
#else
|
||||
// maybe needs switch for AF_INET6 or AF_INET?
|
||||
if (getnameinfo ((struct sockaddr *) &ss, sizeof (ss), s, sizeof (s),
|
||||
if (getnameinfo (&ss.sa, sizeof (ss.ss), s, sizeof (s),
|
||||
NULL, 0, NI_NUMERICHOST))
|
||||
strcpy (s, "<invalid>");
|
||||
#endif
|
||||
|
@ -296,9 +277,8 @@ NET_StringToAdr (const char *s, netadr_t *a)
|
|||
int err;
|
||||
struct addrinfo hints;
|
||||
struct addrinfo *resultp;
|
||||
struct sockaddr_storage ss;
|
||||
struct sockaddr_in6 *ss6;
|
||||
struct sockaddr_in *ss4;
|
||||
AF_address_t addr;
|
||||
AF_address_t resadr;
|
||||
|
||||
if (!copy)
|
||||
copy = dstring_new ();
|
||||
|
@ -336,20 +316,18 @@ NET_StringToAdr (const char *s, netadr_t *a)
|
|||
switch (resultp->ai_family) {
|
||||
case AF_INET:
|
||||
// convert to ipv6 addr
|
||||
memset (&ss, 0, sizeof (ss));
|
||||
ss6 = (struct sockaddr_in6 *) &ss;
|
||||
ss4 = (struct sockaddr_in *) resultp->ai_addr;
|
||||
ss6->sin6_family = AF_INET6;
|
||||
|
||||
memset (&ss6->sin6_addr, 0, sizeof (ss6->sin6_addr));
|
||||
ss6->sin6_addr.s6_addr[10] = ss6->sin6_addr.s6_addr[11] = 0xff;
|
||||
memcpy (&ss6->sin6_addr.s6_addr[12], &ss4->sin_addr,
|
||||
sizeof (ss4->sin_addr));
|
||||
|
||||
ss6->sin6_port = ss4->sin_port;
|
||||
memset (&addr, 0, sizeof (addr));
|
||||
memset (&resadr, 0, sizeof (resadr));
|
||||
memcpy (&resadr.s4, resultp->ai_addr, sizeof (resadr.s4));
|
||||
|
||||
addr.ss.ss_family = AF_INET6;
|
||||
addr.s6.sin6_addr.s6_addr[10] = addr.s6.sin6_addr.s6_addr[11] = 0xff;
|
||||
memcpy (&(addr.s6.sin6_addr.s6_addr[12]), &resadr.s4.sin_addr,
|
||||
sizeof (resadr.s4.sin_addr));
|
||||
addr.s6.sin6_port = resadr.s4.sin_port;
|
||||
break;
|
||||
case AF_INET6:
|
||||
memcpy (&ss, resultp->ai_addr, sizeof (struct sockaddr_in6));
|
||||
memcpy (&addr, resultp->ai_addr, sizeof (addr.s6));
|
||||
|
||||
break;
|
||||
default:
|
||||
|
@ -358,7 +336,7 @@ NET_StringToAdr (const char *s, netadr_t *a)
|
|||
return 0;
|
||||
}
|
||||
|
||||
SockadrToNetadr ((struct sockaddr_in6 *) &ss, a);
|
||||
SockadrToNetadr (&addr, a);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -399,12 +377,12 @@ NET_GetPacket (void)
|
|||
{
|
||||
int ret;
|
||||
unsigned int fromlen;
|
||||
struct sockaddr_in6 from;
|
||||
AF_address_t from;
|
||||
|
||||
fromlen = sizeof (from);
|
||||
ret =
|
||||
recvfrom (net_socket, (void *) net_message_buffer,
|
||||
sizeof (net_message_buffer), 0, (struct sockaddr *) &from,
|
||||
sizeof (net_message_buffer), 0, &from.sa,
|
||||
&fromlen);
|
||||
SockadrToNetadr (&from, &net_from);
|
||||
|
||||
|
@ -442,12 +420,12 @@ void
|
|||
NET_SendPacket (int length, const void *data, netadr_t to)
|
||||
{
|
||||
int ret;
|
||||
struct sockaddr_in6 addr;
|
||||
AF_address_t addr;
|
||||
|
||||
NetadrToSockadr (&to, &addr);
|
||||
|
||||
ret =
|
||||
sendto (net_socket, data, length, 0, (struct sockaddr *) &addr,
|
||||
sendto (net_socket, data, length, 0, &addr.sa,
|
||||
sizeof (addr));
|
||||
if (ret == -1) {
|
||||
#ifdef _WIN32
|
||||
|
|
Loading…
Reference in a new issue