1
0
Fork 0
forked from fte/fteqw

Allow for the separation of address and tls certificates (eg when the target is a explicit ip:port.

This commit is contained in:
Shpoike 2024-05-12 11:56:25 +01:00
parent 9abb3b479c
commit 3fed00b830
6 changed files with 101 additions and 91 deletions

View file

@ -1439,7 +1439,7 @@ void CL_CheckForResend (void)
connectinfo.clogged = false; connectinfo.clogged = false;
if (connectinfo.tries == 0 && connectinfo.nextadr < connectinfo.numadr) if (connectinfo.tries == 0 && connectinfo.nextadr < connectinfo.numadr)
if (!NET_EnsureRoute(cls.sockets, "conn", &connectinfo.peercred, to, true)) if (!NET_EnsureRoute(cls.sockets, "conn", &connectinfo.peercred, cls.servername, to, true))
{ {
CL_ConnectAbort ("Unable to establish connection to %s\n", cls.servername); CL_ConnectAbort ("Unable to establish connection to %s\n", cls.servername);
return; return;
@ -3580,7 +3580,7 @@ void CL_Packet_f (void)
if (!cls.sockets) if (!cls.sockets)
NET_InitClient(false); NET_InitClient(false);
if (!NET_EnsureRoute(cls.sockets, "packet", &cred, &adr, true)) if (!NET_EnsureRoute(cls.sockets, "packet", &cred, Cmd_Argv(1), &adr, true))
return; return;
NET_SendPacket (cls.sockets, out-send, send, &adr); NET_SendPacket (cls.sockets, out-send, send, &adr);
@ -4037,7 +4037,7 @@ void CL_ConnectionlessPacket (void)
if (CL_IsPendingServerAddress(&net_from)) if (CL_IsPendingServerAddress(&net_from))
{ {
struct dtlspeercred_s cred = {cls.servername}; //FIXME struct dtlspeercred_s cred = {cls.servername}; //FIXME
if (!NET_EnsureRoute(cls.sockets, "redir", &cred, &adr, true)) if (!NET_EnsureRoute(cls.sockets, "redir", &cred, data, &adr, true))
Con_Printf (CON_ERROR"Unable to redirect to %s\n", data); Con_Printf (CON_ERROR"Unable to redirect to %s\n", data);
else else
{ {

View file

@ -499,7 +499,7 @@ static void SV_Master_Worker_Resolved(void *ctx, void *data, size_t a, size_t b)
if (NET_AddrIsReliable(na)) if (NET_AddrIsReliable(na))
{ {
struct dtlspeercred_s cred = {master->cv.string}; struct dtlspeercred_s cred = {master->cv.string};
NET_EnsureRoute(svs.sockets, master->cv.name, &cred, na, true); NET_EnsureRoute(svs.sockets, master->cv.name, &cred, NULL, na, true);
} }
//q2+qw masters are given a ping to verify that they're still up //q2+qw masters are given a ping to verify that they're still up

View file

@ -153,7 +153,7 @@ int NET_LocalAddressForRemote(struct ftenet_connections_s *collection, netadr_
void NET_PrintAddresses(struct ftenet_connections_s *collection); void NET_PrintAddresses(struct ftenet_connections_s *collection);
qboolean NET_AddressSmellsFunny(netadr_t *a); qboolean NET_AddressSmellsFunny(netadr_t *a);
struct dtlspeercred_s; struct dtlspeercred_s;
qboolean NET_EnsureRoute(struct ftenet_connections_s *collection, char *routename, const struct dtlspeercred_s *peerinfo, netadr_t *adr, qboolean outgoing); qboolean NET_EnsureRoute(struct ftenet_connections_s *collection, char *routename, const struct dtlspeercred_s *peerinfo, const char *adrstring, netadr_t *adr, qboolean outgoing);
void NET_TerminateRoute(struct ftenet_connections_s *collection, netadr_t *adr); void NET_TerminateRoute(struct ftenet_connections_s *collection, netadr_t *adr);
void NET_PrintConnectionsStatus(struct ftenet_connections_s *collection); void NET_PrintConnectionsStatus(struct ftenet_connections_s *collection);

View file

@ -5712,7 +5712,7 @@ static qboolean FTENET_ICE_ChangeLocalAddress(struct ftenet_generic_connection_s
return true; return true;
} }
ftenet_generic_connection_t *FTENET_ICE_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr) ftenet_generic_connection_t *FTENET_ICE_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo)
{ {
ftenet_ice_connection_t *newcon; ftenet_ice_connection_t *newcon;
const char *path; const char *path;

View file

@ -80,7 +80,7 @@ FTE_ALIGN(4) qbyte net_message_buffer[MAX_OVERALLMSGLEN];
#if (defined(Q2CLIENT) || defined(Q2SERVER)) && (defined(HAVE_CLIENT) || defined(HAVE_SERVER)) && defined(HAVE_DTLS) && defined(HAVE_PACKET) //q2e's lobby/tunnel crap #if (defined(Q2CLIENT) || defined(Q2SERVER)) && (defined(HAVE_CLIENT) || defined(HAVE_SERVER)) && defined(HAVE_DTLS) && defined(HAVE_PACKET) //q2e's lobby/tunnel crap
#define KEXLOBBY "q2e" //enables the feature, and defines the name of the sceme we use for it. #define KEXLOBBY "q2e" //enables the feature, and defines the name of the sceme we use for it.
#ifdef HAVE_SERVER #ifdef HAVE_SERVER
cvar_t net_enable_kexlobby = CVARD("net_enable_"KEXLOBBY, "0", "If enabled, accept connection requests from the quake2-remaster engine on our listening udp ports.\nNote that this defaults to disabled due to it being highly vulnerable to applification attacks."); static cvar_t net_enable_kexlobby = CVARD("net_enable_"KEXLOBBY, "0", "If enabled, accept connection requests from the quake2-remaster engine on our listening udp ports.\nNote that this defaults to disabled due to it being highly vulnerable to applification attacks.");
#endif #endif
#endif #endif
@ -2871,7 +2871,7 @@ static void FTENET_Loop_Close(ftenet_generic_connection_t *con)
Z_Free(con); Z_Free(con);
} }
static ftenet_generic_connection_t *FTENET_Loop_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr) static ftenet_generic_connection_t *FTENET_Loop_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo)
{ {
ftenet_generic_connection_t *newcon; ftenet_generic_connection_t *newcon;
int sock; int sock;
@ -2914,23 +2914,23 @@ ftenet_connections_t *FTENET_CreateCollection(qboolean listen, void(*ReadPacket)
return col; return col;
} }
#if defined(HAVE_CLIENT) && defined(HAVE_SERVER) #if defined(HAVE_CLIENT) && defined(HAVE_SERVER)
static ftenet_generic_connection_t *FTENET_Loop_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_Loop_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo);
#endif #endif
#ifdef HAVE_PACKET #ifdef HAVE_PACKET
ftenet_generic_connection_t *FTENET_Datagram_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr); ftenet_generic_connection_t *FTENET_Datagram_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo);
#endif #endif
#ifdef TCPCONNECT #ifdef TCPCONNECT
static ftenet_generic_connection_t *FTENET_TCP_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_TCP_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo);
#endif #endif
#ifdef HAVE_WEBSOCKCL #ifdef HAVE_WEBSOCKCL
static ftenet_generic_connection_t *FTENET_WebSocket_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_WebSocket_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo);
static ftenet_generic_connection_t *FTENET_WebRTC_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_WebRTC_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo);
#endif #endif
#ifdef IRCCONNECT #ifdef IRCCONNECT
static ftenet_generic_connection_t *FTENET_IRCConnect_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_IRCConnect_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo);
#endif #endif
#ifdef HAVE_NATPMP #ifdef HAVE_NATPMP
static ftenet_generic_connection_t *FTENET_NATPMP_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr); static ftenet_generic_connection_t *FTENET_NATPMP_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo);
#endif #endif
#ifdef HAVE_NATPMP #ifdef HAVE_NATPMP
@ -3168,7 +3168,7 @@ void FTENET_NATPMP_Close(struct ftenet_generic_connection_s *con)
Z_Free(con); Z_Free(con);
} }
//qboolean Net_OpenUDPPort(char *privateip, int privateport, char *publicip, size_t publiciplen, int *publicport); //qboolean Net_OpenUDPPort(char *privateip, int privateport, char *publicip, size_t publiciplen, int *publicport);
ftenet_generic_connection_t *FTENET_NATPMP_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t pmpadr) ftenet_generic_connection_t *FTENET_NATPMP_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t pmpadr, const struct dtlspeercred_s *peerinfo)
{ {
pmpcon_t *pmp; pmpcon_t *pmp;
@ -3484,7 +3484,7 @@ int NET_GetConnectionCertificate(struct ftenet_connections_s *col, netadr_t *a,
static qboolean FTENET_AddToCollection_Ptr(ftenet_connections_t *col, const char *name, ftenet_generic_connection_t *(*establish)(ftenet_connections_t *col, const char *address, netadr_t adr), const char *address, netadr_t *adr) static qboolean FTENET_AddToCollection_Ptr(ftenet_connections_t *col, const char *name, const char *address, netadr_t *adr, const struct dtlspeercred_s *peerinfo)
{ {
int count = 0; int count = 0;
int i; int i;
@ -3511,13 +3511,67 @@ static qboolean FTENET_AddToCollection_Ptr(ftenet_connections_t *col, const char
} }
} }
if (adr && establish) if (adr)
{
//FIXME: combine with urischemes somehow
ftenet_generic_connection_t *(*establish)(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo);
#ifdef HAVE_WEBSOCKCL
if (adr->prot == NP_WS && adr->type == NA_WEBSOCKET) establish = FTENET_WebSocket_EstablishConnection; else
if (adr->prot == NP_WSS && adr->type == NA_WEBSOCKET) establish = FTENET_WebSocket_EstablishConnection; else
if (adr->prot == NP_RTC_TCP) establish = FTENET_WebRTC_EstablishConnection; else
if (adr->prot == NP_RTC_TLS) establish = FTENET_WebRTC_EstablishConnection; else
#endif
#ifdef HAVE_NATPMP
if (adr->prot == NP_NATPMP && adr->type == NA_IP) establish = FTENET_NATPMP_EstablishConnection; else
#endif
#if defined(HAVE_CLIENT) && defined(HAVE_SERVER)
if (adr->prot == NP_DGRAM && adr->type == NA_LOOPBACK) establish = FTENET_Loop_EstablishConnection; else
#endif
#ifdef HAVE_IPV4
if ((adr->prot == NP_DGRAM) && adr->type == NA_IP) establish = FTENET_Datagram_EstablishConnection; else
#endif
#ifdef HAVE_IPV6
if ((adr->prot == NP_DGRAM) && adr->type == NA_IPV6) establish = FTENET_Datagram_EstablishConnection; else
#endif
#ifdef HAVE_IPX
if (adr->prot == NP_DGRAM && adr->type == NA_IPX) establish = FTENET_Datagram_EstablishConnection; else
#endif
#ifdef UNIXSOCKETS
if (adr->prot == NP_DGRAM && adr->type == NA_UNIX) establish = FTENET_Datagram_EstablishConnection; else
#if defined(TCPCONNECT)
if (adr->prot == NP_STREAM&& adr->type == NA_UNIX) establish = FTENET_TCP_EstablishConnection; else
if (adr->prot == NP_WS && adr->type == NA_UNIX) establish = FTENET_TCP_EstablishConnection; else
if (adr->prot == NP_TLS && adr->type == NA_UNIX) establish = FTENET_TCP_EstablishConnection; else
#endif
#endif
#if defined(TCPCONNECT) && defined(HAVE_IPV4)
if (adr->prot == NP_WS && adr->type == NA_IP) establish = FTENET_TCP_EstablishConnection; else
if (adr->prot == NP_WSS && adr->type == NA_IP) establish = FTENET_TCP_EstablishConnection; else
if (adr->prot == NP_STREAM&& adr->type == NA_IP) establish = FTENET_TCP_EstablishConnection; else
if (adr->prot == NP_TLS && adr->type == NA_IP) establish = FTENET_TCP_EstablishConnection; else
#endif
#if defined(TCPCONNECT) && defined(HAVE_IPV6)
if (adr->prot == NP_WS && adr->type == NA_IPV6) establish = FTENET_TCP_EstablishConnection; else
if (adr->prot == NP_WSS && adr->type == NA_IPV6) establish = FTENET_TCP_EstablishConnection; else
if (adr->prot == NP_STREAM&& adr->type == NA_IPV6) establish = FTENET_TCP_EstablishConnection; else
if (adr->prot == NP_TLS && adr->type == NA_IPV6) establish = FTENET_TCP_EstablishConnection; else
#endif
#ifdef SUPPORT_ICE
if (adr->prot == NP_RTC_TCP) establish = FTENET_ICE_EstablishConnection; else
if (adr->prot == NP_RTC_TLS) establish = FTENET_ICE_EstablishConnection; else
#endif
#ifdef IRCCONNECT
if (adr->prot == NP_TLS && adr->type == NA_IRC) establish = FTENET_IRCConnect_EstablishConnection; else
#endif
establish = NULL;
if (establish)
{ {
for (i = 0; i < MAX_CONNECTIONS; i++) for (i = 0; i < MAX_CONNECTIONS; i++)
{ {
if (!col->conn[i]) if (!col->conn[i])
{ {
col->conn[i] = establish(col, address, *adr); col->conn[i] = establish(col, address, *adr, peerinfo);
if (!col->conn[i]) if (!col->conn[i])
break; break;
col->conn[i]->connum = i+1; col->conn[i]->connum = i+1;
@ -3528,12 +3582,12 @@ static qboolean FTENET_AddToCollection_Ptr(ftenet_connections_t *col, const char
} }
} }
} }
}
return count > 0; return count > 0;
} }
qboolean FTENET_AddToCollection(ftenet_connections_t *col, const char *name, const char *addresslist, netadrtype_t addrtype, netproto_t addrprot) qboolean FTENET_AddToCollection(ftenet_connections_t *col, const char *name, const char *addresslist, netadrtype_t addrtype, netproto_t addrprot)
{ {
netadr_t adr[8]; netadr_t adr[8];
ftenet_generic_connection_t *(*establish[countof(adr)])(ftenet_connections_t *col, const char *address, netadr_t adr);
char address[countof(adr)][256]; char address[countof(adr)][256];
unsigned int i, j; unsigned int i, j;
qboolean success = false; qboolean success = false;
@ -3552,66 +3606,17 @@ qboolean FTENET_AddToCollection(ftenet_connections_t *col, const char *name, con
if (!NET_PortToAdr(addrtype, addrprot, address[i], &adr[i])) if (!NET_PortToAdr(addrtype, addrprot, address[i], &adr[i]))
return false; return false;
} }
#ifdef HAVE_WEBSOCKCL
if (adr[i].prot == NP_WS && adr[i].type == NA_WEBSOCKET) establish[i] = FTENET_WebSocket_EstablishConnection; else
if (adr[i].prot == NP_WSS && adr[i].type == NA_WEBSOCKET) establish[i] = FTENET_WebSocket_EstablishConnection; else
if (adr[i].prot == NP_RTC_TCP) establish[i] = FTENET_WebRTC_EstablishConnection; else
if (adr[i].prot == NP_RTC_TLS) establish[i] = FTENET_WebRTC_EstablishConnection; else
#endif
#ifdef HAVE_NATPMP
if (adr[i].prot == NP_NATPMP && adr[i].type == NA_IP) establish[i] = FTENET_NATPMP_EstablishConnection; else
#endif
#if defined(HAVE_CLIENT) && defined(HAVE_SERVER)
if (adr[i].prot == NP_DGRAM && adr[i].type == NA_LOOPBACK) establish[i] = FTENET_Loop_EstablishConnection; else
#endif
#ifdef HAVE_IPV4
if ((adr[i].prot == NP_DGRAM) && adr[i].type == NA_IP) establish[i] = FTENET_Datagram_EstablishConnection; else
#endif
#ifdef HAVE_IPV6
if ((adr[i].prot == NP_DGRAM) && adr[i].type == NA_IPV6) establish[i] = FTENET_Datagram_EstablishConnection; else
#endif
#ifdef HAVE_IPX
if (adr[i].prot == NP_DGRAM && adr[i].type == NA_IPX) establish[i] = FTENET_Datagram_EstablishConnection; else
#endif
#ifdef UNIXSOCKETS
if (adr[i].prot == NP_DGRAM && adr[i].type == NA_UNIX) establish[i] = FTENET_Datagram_EstablishConnection; else
#if defined(TCPCONNECT)
if (adr[i].prot == NP_STREAM&& adr[i].type == NA_UNIX) establish[i] = FTENET_TCP_EstablishConnection; else
if (adr[i].prot == NP_WS && adr[i].type == NA_UNIX) establish[i] = FTENET_TCP_EstablishConnection; else
if (adr[i].prot == NP_TLS && adr[i].type == NA_UNIX) establish[i] = FTENET_TCP_EstablishConnection; else
#endif
#endif
#if defined(TCPCONNECT) && defined(HAVE_IPV4)
if (adr[i].prot == NP_WS && adr[i].type == NA_IP) establish[i] = FTENET_TCP_EstablishConnection; else
if (adr[i].prot == NP_WSS && adr[i].type == NA_IP) establish[i] = FTENET_TCP_EstablishConnection; else
if (adr[i].prot == NP_STREAM&& adr[i].type == NA_IP) establish[i] = FTENET_TCP_EstablishConnection; else
if (adr[i].prot == NP_TLS && adr[i].type == NA_IP) establish[i] = FTENET_TCP_EstablishConnection; else
#endif
#if defined(TCPCONNECT) && defined(HAVE_IPV6)
if (adr[i].prot == NP_WS && adr[i].type == NA_IPV6) establish[i] = FTENET_TCP_EstablishConnection; else
if (adr[i].prot == NP_WSS && adr[i].type == NA_IPV6) establish[i] = FTENET_TCP_EstablishConnection; else
if (adr[i].prot == NP_STREAM&& adr[i].type == NA_IPV6) establish[i] = FTENET_TCP_EstablishConnection; else
if (adr[i].prot == NP_TLS && adr[i].type == NA_IPV6) establish[i] = FTENET_TCP_EstablishConnection; else
#endif
#ifdef SUPPORT_ICE
if (adr[i].prot == NP_RTC_TCP) establish[i] = FTENET_ICE_EstablishConnection; else
if (adr[i].prot == NP_RTC_TLS) establish[i] = FTENET_ICE_EstablishConnection; else
#endif
#ifdef IRCCONNECT
if (adr[i].prot == NP_TLS) establish[i] = FTENET_IRCConnect_EstablishConnection; else
#endif
establish[i] = NULL;
} }
if (i == 1) if (i == 1)
{ {
success |= FTENET_AddToCollection_Ptr(col, name, establish[0], address[0], &adr[0]); success |= FTENET_AddToCollection_Ptr(col, name, address[0], &adr[0], NULL);
i = 0; i = 0;
} }
else else
success |= FTENET_AddToCollection_Ptr(col, name, NULL, NULL, NULL); success |= FTENET_AddToCollection_Ptr(col, name, NULL, NULL, NULL);
for (j = 0; j < i; j++) for (j = 0; j < i; j++)
success |= FTENET_AddToCollection_Ptr(col, va("%s:%i", name, j), establish[j], address[j], &adr[j]); success |= FTENET_AddToCollection_Ptr(col, va("%s:%i", name, j), address[j], &adr[j], NULL);
for (; j < countof(adr); j++) for (; j < countof(adr); j++)
success |= FTENET_AddToCollection_Ptr(col, va("%s:%i", name, j), NULL, NULL, NULL); success |= FTENET_AddToCollection_Ptr(col, va("%s:%i", name, j), NULL, NULL, NULL);
return success; return success;
@ -4163,7 +4168,7 @@ static void FTENET_Datagram_Polled(epollctx_t *ctx, unsigned int events)
} }
#endif #endif
ftenet_generic_connection_t *FTENET_Datagram_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr) ftenet_generic_connection_t *FTENET_Datagram_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo)
{ {
#ifndef HAVE_PACKET #ifndef HAVE_PACKET
return NULL; return NULL;
@ -6537,7 +6542,7 @@ static const char *FTENET_TCP_ParseHTTPRequest(ftenet_tcp_connection_t *con, fte
if (st->webrtc.target.prot == NP_DGRAM) if (st->webrtc.target.prot == NP_DGRAM)
st->webrtc.target.prot = NP_DTLS; st->webrtc.target.prot = NP_DTLS;
if (st->webrtc.target.prot == NP_DTLS) //don't make expensive tcp connections! if (st->webrtc.target.prot == NP_DTLS) //don't make expensive tcp connections!
NET_EnsureRoute(con->generic.owner, NULL, &cred, &st->webrtc.target, true); NET_EnsureRoute(con->generic.owner, NULL, &cred, idstart+4, &st->webrtc.target, true);
//we'll sythesise some rdp when we get an offer. //we'll sythesise some rdp when we get an offer.
net_message_buffer[0] = ICEMSG_NEWPEER; net_message_buffer[0] = ICEMSG_NEWPEER;
@ -7966,7 +7971,7 @@ static int FTENET_TCP_SetFDSets(ftenet_generic_connection_t *gcon, fd_set *readf
} }
#endif #endif
ftenet_generic_connection_t *FTENET_TCP_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr) ftenet_generic_connection_t *FTENET_TCP_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo)
{ {
//this is written to support either ipv4 or ipv6, depending on the remote addr. //this is written to support either ipv4 or ipv6, depending on the remote addr.
ftenet_tcp_connection_t *newcon; ftenet_tcp_connection_t *newcon;
@ -8078,7 +8083,7 @@ ftenet_generic_connection_t *FTENET_TCP_EstablishConnection(ftenet_connections_t
#ifdef HAVE_SSL #ifdef HAVE_SSL
if (newcon->tls) //if we're meant to be using tls, wrap the stream in a tls connection if (newcon->tls) //if we're meant to be using tls, wrap the stream in a tls connection
{ //remove any markup junk, get just the hostname out of it. { //remove any markup junk, get just the hostname out of it.
newcon->tcpstreams->clientstream = FS_OpenSSL(hostonly, newcon->tcpstreams->clientstream, false); newcon->tcpstreams->clientstream = FS_OpenSSL((peerinfo && peerinfo->name)?peerinfo->name:hostonly, newcon->tcpstreams->clientstream, false);
if (!newcon->tcpstreams->clientstream) if (!newcon->tcpstreams->clientstream)
return NULL; return NULL;
} }
@ -9223,7 +9228,7 @@ static qboolean FTENET_WebRTC_ChangeLocalAddress(struct ftenet_generic_connectio
// return false; // return false;
} }
static ftenet_generic_connection_t *FTENET_WebSocket_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr) static ftenet_generic_connection_t *FTENET_WebSocket_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo)
{ {
qboolean isserver = col->islisten; qboolean isserver = col->islisten;
ftenet_websocket_connection_t *newcon; ftenet_websocket_connection_t *newcon;
@ -9270,7 +9275,7 @@ static ftenet_generic_connection_t *FTENET_WebSocket_EstablishConnection(ftenet_
return NULL; return NULL;
} }
static ftenet_generic_connection_t *FTENET_WebRTC_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr) static ftenet_generic_connection_t *FTENET_WebRTC_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo)
{ {
qboolean isserver = col->islisten; qboolean isserver = col->islisten;
ftenet_websocket_connection_t *newcon; ftenet_websocket_connection_t *newcon;
@ -9574,8 +9579,9 @@ neterr_t NET_SendPacket (ftenet_connections_t *collection, int length, const voi
return NET_SendPacketCol (collection, length, data, to); return NET_SendPacketCol (collection, length, data, to);
} }
qboolean NET_EnsureRoute(ftenet_connections_t *collection, char *routename, const struct dtlspeercred_s *peerinfo, netadr_t *adr, qboolean outgoing) qboolean NET_EnsureRoute(ftenet_connections_t *collection, char *routename, const struct dtlspeercred_s *peerinfo, const char *adrstring, netadr_t *adr, qboolean outgoing)
{ {
char temp[MAX_QPATH];
switch(adr->prot) switch(adr->prot)
{ {
case NP_DGRAM: case NP_DGRAM:
@ -9590,7 +9596,7 @@ qboolean NET_EnsureRoute(ftenet_connections_t *collection, char *routename, cons
case NP_DTLS: case NP_DTLS:
#ifdef HAVE_DTLS #ifdef HAVE_DTLS
adr->prot = NP_DGRAM; adr->prot = NP_DGRAM;
if (NET_EnsureRoute(collection, routename, peerinfo, adr, outgoing)) if (NET_EnsureRoute(collection, routename, peerinfo, adrstring, adr, outgoing))
{ {
dtlscred_t cred; dtlscred_t cred;
memset(&cred, 0, sizeof(cred)); memset(&cred, 0, sizeof(cred));
@ -9607,7 +9613,7 @@ qboolean NET_EnsureRoute(ftenet_connections_t *collection, char *routename, cons
#ifdef KEXLOBBY #ifdef KEXLOBBY
case NP_KEXLAN: case NP_KEXLAN:
adr->prot = NP_DGRAM; adr->prot = NP_DGRAM;
if (NET_EnsureRoute(collection, routename, peerinfo, adr, outgoing)) if (NET_EnsureRoute(collection, routename, peerinfo, adrstring, adr, outgoing))
{ {
if (NET_KexLobby_Create(collection, adr, outgoing)) if (NET_KexLobby_Create(collection, adr, outgoing))
{ {
@ -9623,14 +9629,18 @@ qboolean NET_EnsureRoute(ftenet_connections_t *collection, char *routename, cons
case NP_WSS: case NP_WSS:
case NP_TLS: case NP_TLS:
case NP_STREAM: case NP_STREAM:
if (!FTENET_AddToCollection(collection, routename, peerinfo->name, adr->type, adr->prot)) if (!adrstring)
adrstring = NET_AdrToString(temp, sizeof(temp), adr); //urgh
if (!FTENET_AddToCollection_Ptr(collection, routename, adrstring, adr, peerinfo))
return false; return false;
Con_Printf("Establishing connection to %s\n", peerinfo->name); Con_Printf("Establishing connection to %s\n", temp);
break; break;
#if defined(SUPPORT_ICE) || defined(FTE_TARGET_WEB) #if defined(SUPPORT_ICE) || defined(FTE_TARGET_WEB)
case NP_RTC_TCP: case NP_RTC_TCP:
case NP_RTC_TLS: case NP_RTC_TLS:
if (!FTENET_AddToCollection(collection, routename, peerinfo->name, adr->type, adr->prot)) if (!adrstring)
adrstring = NET_AdrToString(temp, sizeof(temp), adr); //urgh
if (!FTENET_AddToCollection_Ptr(collection, routename, adrstring, adr, peerinfo))
return false; return false;
break; break;
#endif #endif

View file

@ -442,7 +442,7 @@ void ICE_Tick(void);
qboolean ICE_WasStun(ftenet_connections_t *col); qboolean ICE_WasStun(ftenet_connections_t *col);
void QDECL ICE_AddLCandidateConn(ftenet_connections_t *col, netadr_t *addr, int type); void QDECL ICE_AddLCandidateConn(ftenet_connections_t *col, netadr_t *addr, int type);
void QDECL ICE_AddLCandidateInfo(struct icestate_s *con, netadr_t *adr, int adrno, int type); void QDECL ICE_AddLCandidateInfo(struct icestate_s *con, netadr_t *adr, int adrno, int type);
ftenet_generic_connection_t *FTENET_ICE_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr); ftenet_generic_connection_t *FTENET_ICE_EstablishConnection(ftenet_connections_t *col, const char *address, netadr_t adr, const struct dtlspeercred_s *peerinfo);
enum icemsgtype_s enum icemsgtype_s
{ //shared by rtcpeers+broker { //shared by rtcpeers+broker
ICEMSG_PEERLOST=0, //other side dropped connection ICEMSG_PEERLOST=0, //other side dropped connection