#ifdef _MSC_VER
#pragma comment(lib, "ws2_32.lib")
#endif
-# ifdef SUPPORTIPV6
+# ifndef NOSUPPORTIPV6
// Windows XP or higher is required for getaddrinfo, but the inclusion of wspiapi provides fallbacks for older versions
# define _WIN32_WINNT 0x0501
# endif
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
#include <net/if.h>
#endif
#endif
{
struct sockaddr sock;
struct sockaddr_in in;
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
struct sockaddr_in6 in6;
#endif
}
address->addr.in.sin_family = AF_INET;
address->addr.in.sin_port = htons((unsigned short)port);
return 1;
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
case LHNETADDRESSTYPE_INET6:
// [0:0:0:0:0:0:0:0]:port (IN6ADDR_ANY, binds to all interfaces)
memset(address, 0, sizeof(*address));
return 0;
}
-#ifdef SUPPORTIPV6
-int LHNETADDRESS_Resolve(lhnetaddressnative_t *address, const char *name, int port)
+#ifndef NOSUPPORTIPV6
+static int LHNETADDRESS_Resolve(lhnetaddressnative_t *address, const char *name, int port)
{
char port_buff [16];
struct addrinfo hints;
address->port = port;
if (address->addresstype == LHNETADDRESSTYPE_INET6)
{
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
address->addr.in6.sin6_port = htons((unsigned short)port);
return 1;
#endif
{
if (hostentry->h_addrtype == AF_INET6)
{
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
// great it worked
address->addresstype = LHNETADDRESSTYPE_INET6;
address->port = port;
{
lhnetaddressnative_t *address = (lhnetaddressnative_t *)vaddress;
const unsigned char *a;
- *string = 0;
if (!address || !string || stringbuffersize < 1)
return 0;
+ *string = 0;
switch(address->addresstype)
{
default:
}
}
break;
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
case LHNETADDRESSTYPE_INET6:
a = (const unsigned char *)(&address->addr.in6.sin6_addr);
if (includeport)
const char *LHNETADDRESS_GetInterfaceName(const lhnetaddress_t *vaddress, char *ifname, size_t ifnamelength)
{
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
lhnetaddressnative_t *address = (lhnetaddressnative_t *)vaddress;
if (address && address->addresstype == LHNETADDRESSTYPE_INET6)
case LHNETADDRESSTYPE_INET4:
address->addr.in.sin_port = htons((unsigned short)port);
return 1;
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
case LHNETADDRESSTYPE_INET6:
address->addr.in6.sin6_port = htons((unsigned short)port);
return 1;
if (address1->port != address2->port)
return -1;
return 0;
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
case LHNETADDRESSTYPE_INET6:
if (address1->addr.in6.sin6_family != address2->addr.in6.sin6_family)
return 1;
static int lhnet_active;
static lhnetsocket_t lhnet_socketlist;
static lhnetpacket_t lhnet_packetlist;
+static int lhnet_default_dscp = 0;
#ifdef WIN32
static int lhnet_didWSAStartup = 0;
static WSADATA lhnet_winsockdata;
#endif
}
+int LHNET_DefaultDSCP(int dscp)
+{
+#ifdef IP_TOS
+ int prev = lhnet_default_dscp;
+ if(dscp >= 0)
+ lhnet_default_dscp = dscp;
+ return prev;
+#else
+ return -1;
+#endif
+}
+
void LHNET_Shutdown(void)
{
lhnetpacket_t *p;
}
break;
case LHNETADDRESSTYPE_INET4:
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
case LHNETADDRESSTYPE_INET6:
#endif
#ifdef WIN32
if (lhnet_didWSAStartup)
{
#endif
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
if ((lhnetsocket->inetsocket = socket(address->addresstype == LHNETADDRESSTYPE_INET6 ? PF_INET6 : PF_INET, SOCK_DGRAM, IPPROTO_UDP)) != -1)
#else
if ((lhnetsocket->inetsocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) != -1)
lhnetaddressnative_t *localaddress = (lhnetaddressnative_t *)&lhnetsocket->address;
SOCKLEN_T namelen;
int bindresult;
-#ifdef SUPPORTIPV6
+
+#if defined(SOL_RFC1149) && defined(RFC1149_1149ONLY)
+ // we got reports of massive lags when this protocol was chosen as transport
+ // so better turn it off
+ {
+ int rfc1149only = 0;
+ int rfc1149enabled = 0;
+ if(setsockopt(lhnetsocket->inetsocket, SOL_RFC1149, RFC1149_1149ONLY, &rfc1149only))
+ Con_Printf("LHNET_OpenSocket_Connectionless: warning: setsockopt(RFC1149_1149ONLY) returned error: %s\n", LHNETPRIVATE_StrError());
+ if(setsockopt(lhnetsocket->inetsocket, SOL_RFC1149, RFC1149_ENABLED, &rfc1149enabled))
+ Con_Printf("LHNET_OpenSocket_Connectionless: warning: setsockopt(RFC1149_ENABLED) returned error: %s\n", LHNETPRIVATE_StrError());
+ }
+#endif
+
+#ifndef NOSUPPORTIPV6
if (address->addresstype == LHNETADDRESSTYPE_INET6)
{
namelen = sizeof(localaddress->addr.in6);
bindresult = bind(lhnetsocket->inetsocket, &localaddress->addr.sock, namelen);
if (bindresult != -1)
- getsockname(lhnetsocket->inetsocket, &localaddress->addr.sock, &namelen);
+ {
+ if (getsockname(lhnetsocket->inetsocket, &localaddress->addr.sock, &namelen))
+ {
+ // If getsockname failed, we can assume the bound socket is useless.
+ bindresult = -1;
+ }
+ }
}
else
#endif
namelen = sizeof(localaddress->addr.in);
bindresult = bind(lhnetsocket->inetsocket, &localaddress->addr.sock, namelen);
if (bindresult != -1)
- getsockname(lhnetsocket->inetsocket, &localaddress->addr.sock, &namelen);
+ {
+ if (getsockname(lhnetsocket->inetsocket, &localaddress->addr.sock, &namelen))
+ {
+ // If getsockname failed, we can assume the bound socket is useless.
+ bindresult = -1;
+ }
+ }
}
if (bindresult != -1)
{
int i = 1;
// enable broadcast on this socket
setsockopt(lhnetsocket->inetsocket, SOL_SOCKET, SO_BROADCAST, (char *)&i, sizeof(i));
+#ifdef IP_TOS
+ {
+ // enable DSCP for ToS support
+ int tos = lhnet_default_dscp << 2;
+ if (setsockopt(lhnetsocket->inetsocket, IPPROTO_IP, IP_TOS, (char *) &tos, sizeof(tos)))
+ {
+ // Error in setsockopt - fine, we'll simply set no TOS then.
+ }
+ }
+#endif
lhnetsocket->next = &lhnet_socketlist;
lhnetsocket->prev = lhnetsocket->next->prev;
lhnetsocket->next->prev = lhnetsocket;
Con_DPrintf("LHNET_Read: recvfrom returned error: %s\n", LHNETPRIVATE_StrError());
}
}
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
else if (lhnetsocket->address.addresstype == LHNETADDRESSTYPE_INET6)
{
SOCKLEN_T inetaddresslength;
Con_DPrintf("LHNET_Write: sendto returned error: %s\n", LHNETPRIVATE_StrError());
}
}
-#ifdef SUPPORTIPV6
+#ifndef NOSUPPORTIPV6
else if (lhnetsocket->address.addresstype == LHNETADDRESSTYPE_INET6)
{
value = sendto(lhnetsocket->inetsocket, (char *)content, contentlength, 0, (struct sockaddr *)&address->addr.in6, sizeof(struct sockaddr_in6));