+static void NetConn_ClientParsePacket_ServerList_ParseDPList(lhnetaddress_t *senderaddress, const unsigned char *data, int length, qboolean isextended)
+{
+ masterreplycount++;
+ if (serverlist_consoleoutput)
+ Con_Printf("received DarkPlaces %sserver list...\n", isextended ? "extended " : "");
+ while (length >= 7)
+ {
+ char ipstring [128];
+
+ // IPv4 address
+ if (data[0] == '\\')
+ {
+ unsigned short port = data[5] * 256 + data[6];
+
+ if (port != 0 && (data[1] != 0xFF || data[2] != 0xFF || data[3] != 0xFF || data[4] != 0xFF))
+ dpsnprintf (ipstring, sizeof (ipstring), "%u.%u.%u.%u:%hu", data[1], data[2], data[3], data[4], port);
+
+ // move on to next address in packet
+ data += 7;
+ length -= 7;
+ }
+ // IPv6 address
+ else if (data[0] == '/' && isextended && length >= 19)
+ {
+ unsigned short port = data[17] * 256 + data[18];
+
+ if (port != 0)
+ {
+ const char *ifname;
+
+ /// \TODO: make some basic checks of the IP address (broadcast, ...)
+
+ ifname = LHNETADDRESS_GetInterfaceName(senderaddress);
+ if (ifname != NULL)
+ {
+ dpsnprintf (ipstring, sizeof (ipstring), "[%x%02x:%x%02x:%x%02x:%x%02x:%x%02x:%x%02x:%x%02x:%x%02x%%%s]:%hu",
+ data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8],
+ data[9], data[10], data[11], data[12], data[13], data[14], data[15], data[16],
+ ifname, port);
+ }
+ else
+ {
+ dpsnprintf (ipstring, sizeof (ipstring), "[%x%02x:%x%02x:%x%02x:%x%02x:%x%02x:%x%02x:%x%02x:%x%02x]:%hu",
+ data[1], data[2], data[3], data[4], data[5], data[6], data[7], data[8],
+ data[9], data[10], data[11], data[12], data[13], data[14], data[15], data[16],
+ port);
+ }
+ }
+
+ // move on to next address in packet
+ data += 19;
+ length -= 19;
+ }
+ else
+ {
+ Con_Print("Error while parsing the server list\n");
+ break;
+ }
+
+ if (serverlist_consoleoutput && developer_networking.integer)
+ Con_Printf("Requesting info from DarkPlaces server %s\n", ipstring);
+
+ if( !NetConn_ClientParsePacket_ServerList_PrepareQuery( PROTOCOL_DARKPLACES7, ipstring, false ) ) {
+ break;
+ }
+
+ }
+
+ // begin or resume serverlist queries
+ serverlist_querysleep = false;
+ serverlist_querywaittime = realtime + 3;
+}
+