aboutsummaryrefslogtreecommitdiffstats
path: root/code/client/cl_main.c
diff options
context:
space:
mode:
authorthilo <thilo@edf5b092-35ff-0310-97b2-ce42778d08ea>2008-08-31 19:54:29 +0000
committerthilo <thilo@edf5b092-35ff-0310-97b2-ce42778d08ea>2008-08-31 19:54:29 +0000
commitc6d2bfb53ab3821c6429355d2c6d1f7f44ef4a14 (patch)
tree1f4bda2c5b9fe6c9a2fb5c2e0035057061cb19bf /code/client/cl_main.c
parent60bee81ce803959461493d107ad5a0e568c958c8 (diff)
downloadioquake3-aero-c6d2bfb53ab3821c6429355d2c6d1f7f44ef4a14.tar.gz
ioquake3-aero-c6d2bfb53ab3821c6429355d2c6d1f7f44ef4a14.zip
- Add scope id to ipv6 addresses.
- Clean up a few other ipv6 issues like removing the seemingly unnecessary MacOSX workaround. - Bring ipv6 master server up to speed for dpmaster Thanks go out to Mathieu Olivier for this work. git-svn-id: svn://svn.icculus.org/quake3/trunk@1468 edf5b092-35ff-0310-97b2-ce42778d08ea
Diffstat (limited to 'code/client/cl_main.c')
-rw-r--r--code/client/cl_main.c35
1 files changed, 29 insertions, 6 deletions
diff --git a/code/client/cl_main.c b/code/client/cl_main.c
index 45f884f..23a07d6 100644
--- a/code/client/cl_main.c
+++ b/code/client/cl_main.c
@@ -2172,7 +2172,7 @@ void CL_InitServerInfo( serverInfo_t *server, netadr_t *address ) {
CL_ServersResponsePacket
===================
*/
-void CL_ServersResponsePacket( netadr_t from, msg_t *msg ) {
+void CL_ServersResponsePacket( const netadr_t* from, msg_t *msg, qboolean extended ) {
int i, count, total;
netadr_t addresses[MAX_SERVERSPERPACKET];
int numservers;
@@ -2195,7 +2195,7 @@ void CL_ServersResponsePacket( netadr_t from, msg_t *msg ) {
// advance to initial token
do
{
- if(*buffptr == '\\' || *buffptr == '/')
+ if(*buffptr == '\\' || (extended && *buffptr == '/'))
break;
buffptr++;
@@ -2203,6 +2203,7 @@ void CL_ServersResponsePacket( netadr_t from, msg_t *msg ) {
while (buffptr + 1 < buffend)
{
+ // IPv4 address
if (*buffptr == '\\')
{
buffptr++;
@@ -2215,7 +2216,8 @@ void CL_ServersResponsePacket( netadr_t from, msg_t *msg ) {
addresses[numservers].type = NA_IP;
}
- else
+ // IPv6 address, if it's an extended response
+ else if (extended && *buffptr == '/')
{
buffptr++;
@@ -2226,7 +2228,11 @@ void CL_ServersResponsePacket( netadr_t from, msg_t *msg ) {
addresses[numservers].ip6[i] = *buffptr++;
addresses[numservers].type = NA_IP6;
+ addresses[numservers].scope_id = from->scope_id;
}
+ else
+ // syntax error!
+ break;
// parse out port
addresses[numservers].port = (*buffptr++) << 8;
@@ -2378,9 +2384,15 @@ void CL_ConnectionlessPacket( netadr_t from, msg_t *msg ) {
return;
}
- // echo request from server
+ // list of servers sent back by a master server (classic)
if ( !Q_strncmp(c, "getserversResponse", 18) ) {
- CL_ServersResponsePacket( from, msg );
+ CL_ServersResponsePacket( &from, msg, qfalse );
+ return;
+ }
+
+ // list of servers sent back by a master server (extended)
+ if ( !Q_strncmp(c, "getserversExtResponse", 21) ) {
+ CL_ServersResponsePacket( &from, msg, qtrue );
return;
}
@@ -3616,6 +3628,7 @@ void CL_GlobalServers_f( void ) {
netadr_t to;
int count, i, masterNum;
char command[1024], *masteraddress;
+ char *cmdname;
if ((count = Cmd_Argc()) < 3 || (masterNum = atoi(Cmd_Argv(1))) < 0 || masterNum > 4)
{
@@ -3650,7 +3663,17 @@ void CL_GlobalServers_f( void ) {
cls.numglobalservers = -1;
cls.pingUpdateSource = AS_GLOBAL;
- Com_sprintf( command, sizeof(command), "getservers %s", Cmd_Argv(2) );
+ // Use the extended query for IPv6 masters
+ if (to.type == NA_IP6 || to.type == NA_MULTICAST6)
+ {
+ cmdname = "getserversExt " GAMENAME;
+
+ // TODO: test if we only have an IPv6 connection. If it's the case,
+ // request IPv6 servers only by appending " ipv6" to the command
+ }
+ else
+ cmdname = "getservers";
+ Com_sprintf( command, sizeof(command), "%s %s", cmdname, Cmd_Argv(2) );
for (i=3; i < count; i++)
{