diff --git a/include/netchan.h b/include/netchan.h index f90e4f170..2ef30d896 100644 --- a/include/netchan.h +++ b/include/netchan.h @@ -297,6 +297,10 @@ extern int net_blocksend; */ extern double *net_realtime; +/** Callback to log outgoing packets +*/ +extern void (*net_log_packet) (int length, const void *data, netadr_t to); + /** Initialize the netchan system. Currently only sets the qport cvar default to a random value. diff --git a/libs/net/net_chan.c b/libs/net/net_chan.c index 1289866d7..58da40169 100644 --- a/libs/net/net_chan.c +++ b/libs/net/net_chan.c @@ -57,6 +57,7 @@ double *net_realtime; cvar_t *showpackets; cvar_t *showdrop; cvar_t *qport; +void (*net_log_packet) (int length, const void *data, netadr_t to); void @@ -375,9 +376,8 @@ Netchan_Process (netchan_t *chan) void Netchan_SendPacket (int length, const void *data, netadr_t to) { -#if 0 - if (net_packetlog->int_val) - Log_Outgoing_Packet (data, length, 1); -#endif + if (net_log_packet) { + net_log_packet (length, data, to); + } NET_SendPacket (length, data, to); } diff --git a/qw/include/server.h b/qw/include/server.h index c75cfa659..ebe9cf2ce 100644 --- a/qw/include/server.h +++ b/qw/include/server.h @@ -483,6 +483,11 @@ extern struct clip_hull_s *pf_hull_list[]; // sv_main.c // +void SV_OutOfBand (netadr_t adr, unsigned length, byte *data); +void SV_OutOfBandPrint (netadr_t adr, const char *format, ...) + __attribute__ ((format (PRINTF,2,3))); + + client_t *SV_AllocClient (int spectator, int server); void SV_SavePenaltyFilter (client_t *cl, filtertype_t type, double pentime); diff --git a/qw/source/net_packetlog.c b/qw/source/net_packetlog.c index 3d2c58dc8..72dbe22d0 100644 --- a/qw/source/net_packetlog.c +++ b/qw/source/net_packetlog.c @@ -949,13 +949,21 @@ Analyze_Client_Packet (const byte * data, int len, int has_sequence) Net_PacketLog = NULL; } +static void +net_packet_log_f (int length, const void *data, netadr_t to) +{ + Log_Outgoing_Packet (data, length, 1, 1); +} + static void Net_PacketLog_f (cvar_t *var) { if (var->int_val) { Net_LogStart ("qfpacket.log"); + net_log_packet = net_packet_log_f; } else { Net_LogStop (0); + net_log_packet = 0; } } diff --git a/qw/source/sv_main.c b/qw/source/sv_main.c index 915ea58ea..c97fc8647 100644 --- a/qw/source/sv_main.c +++ b/qw/source/sv_main.c @@ -701,8 +701,8 @@ SVC_GetChallenge (void) } // send it to the client - Netchan_OutOfBandPrint (net_from, "%c%i%s", S2C_CHALLENGE, - svs.challenges[i].challenge, extended); + SV_OutOfBandPrint (net_from, "%c%i%s", S2C_CHALLENGE, + svs.challenges[i].challenge, extended); } client_t * @@ -776,8 +776,8 @@ SVC_DirectConnect (void) } else { version = atoi (s); if (version != PROTOCOL_VERSION) { - Netchan_OutOfBandPrint (net_from, "%c\nServer is version %s.\n", - A2C_PRINT, QW_VERSION); + SV_OutOfBandPrint (net_from, "%c\nServer is version %s.\n", + A2C_PRINT, QW_VERSION); SV_Printf ("* rejected connect from version %i\n", version); return; } @@ -793,8 +793,8 @@ SVC_DirectConnect (void) // Validate the userinfo string. if (!userinfo) { - Netchan_OutOfBandPrint (net_from, "%c\nInvalid userinfo string.\n", - A2C_PRINT); + SV_OutOfBandPrint (net_from, "%c\nInvalid userinfo string.\n", + A2C_PRINT); return; } @@ -803,14 +803,13 @@ SVC_DirectConnect (void) if (NET_CompareBaseAdr (net_from, svs.challenges[i].adr)) { if (challenge == svs.challenges[i].challenge) break; // good - Netchan_OutOfBandPrint (net_from, "%c\nBad challenge.\n", - A2C_PRINT); + SV_OutOfBandPrint (net_from, "%c\nBad challenge.\n", A2C_PRINT); return; } } if (i == MAX_CHALLENGES) { - Netchan_OutOfBandPrint (net_from, "%c\nNo challenge for address.\n", - A2C_PRINT); + SV_OutOfBandPrint (net_from, "%c\nNo challenge for address.\n", + A2C_PRINT); return; } @@ -826,10 +825,10 @@ SVC_DirectConnect (void) NET_AdrToString (net_from), s, sv_minqfversion->string); - Netchan_OutOfBandPrint (net_from, "%c\nserver requires QuakeForge " - "v%s or greater. Get it from " - "http://www.quakeforge.net/\n", A2C_PRINT, - sv_minqfversion->string); + SV_OutOfBandPrint (net_from, "%c\nserver requires QuakeForge " + "v%s or greater. Get it from " + "http://www.quakeforge.net/\n", A2C_PRINT, + sv_minqfversion->string); return; } } @@ -841,9 +840,9 @@ SVC_DirectConnect (void) !strequal (spectator_password->string, s)) { // failed SV_Printf ("%s: spectator password failed\n", NET_AdrToString (net_from)); - Netchan_OutOfBandPrint (net_from, - "%c\nrequires a spectator password\n\n", - A2C_PRINT); + SV_OutOfBandPrint (net_from, + "%c\nrequires a spectator password\n\n", + A2C_PRINT); return; } Info_RemoveKey (userinfo, "spectator"); // remove passwd @@ -856,9 +855,9 @@ SVC_DirectConnect (void) && !strcaseequal (password->string, "none") && !strequal (password->string, s)) { SV_Printf ("%s:password failed\n", NET_AdrToString (net_from)); - Netchan_OutOfBandPrint (net_from, - "%c\nserver requires a password\n\n", - A2C_PRINT); + SV_OutOfBandPrint (net_from, + "%c\nserver requires a password\n\n", + A2C_PRINT); return; } spectator = false; @@ -886,7 +885,7 @@ SVC_DirectConnect (void) } if (!(newcl = SV_AllocClient (spectator, 0))) { SV_Printf ("%s:full connect\n", NET_AdrToString (adr)); - Netchan_OutOfBandPrint (adr, "%c\nserver is full\n\n", A2C_PRINT); + SV_OutOfBandPrint (adr, "%c\nserver is full\n\n", A2C_PRINT); return; } newcl->userinfo = userinfo; @@ -901,7 +900,7 @@ SVC_DirectConnect (void) } newcl->delta.client = newcl; - Netchan_OutOfBandPrint (adr, "%c", S2C_CONNECTION); + SV_OutOfBandPrint (adr, "%c", S2C_CONNECTION); Netchan_Setup (&newcl->netchan, adr, qport, NC_QPORT_READ); newcl->backbuf.netchan = &newcl->netchan; @@ -1744,6 +1743,32 @@ SV_RestorePenaltyFilter (client_t *cl, filtertype_t type) return 0.0; } +void +SV_OutOfBand (netadr_t adr, unsigned length, byte *data) +{ + if (net_packetlog->int_val) { + Log_Outgoing_Packet (data, length, 0, 1); + } + Netchan_OutOfBand (adr, length, data); +} + +void +SV_OutOfBandPrint (netadr_t adr, const char *format, ...) +{ + static dstring_t *string; + va_list argptr; + + if (!string) { + string = dstring_new (); + } + + va_start (argptr, format); + dvsprintf (string, format, argptr); + va_end (argptr); + + SV_OutOfBand (adr, string->size - 1, (byte *) string->str); +} + static void SV_ReadPackets (void) { @@ -2368,8 +2393,8 @@ SV_ExtractFromUserinfo (client_t *cl) // If the new name was not set (due to the info string being too // long), drop the client. if (strcmp (val, newname)) { - Netchan_OutOfBandPrint (net_from, "%c\nPlease choose a " - "different name.\n", A2C_PRINT); + SV_OutOfBandPrint (net_from, "%c\nPlease choose a " + "different name.\n", A2C_PRINT); SV_ClientPrintf (1, cl, PRINT_HIGH, "Please choose a " "different name.\n"); SV_Printf ("Client %d kicked for having a invalid name\n", diff --git a/qw/source/sv_qtv.c b/qw/source/sv_qtv.c index 91e310114..3b9069ea9 100644 --- a/qw/source/sv_qtv.c +++ b/qw/source/sv_qtv.c @@ -404,7 +404,7 @@ SV_qtvConnect (int qport, info_t *info) if (!(proxy = alloc_proxy ())) { SV_Printf ("%s:full proxy connect\n", NET_AdrToString (net_from)); - Netchan_OutOfBandPrint (net_from, "%c\nserver is full\n\n", A2C_PRINT); + SV_OutOfBandPrint (net_from, "%c\nserver is full\n\n", A2C_PRINT); return; } proxy->info = info; @@ -418,7 +418,7 @@ SV_qtvConnect (int qport, info_t *info) proxy->datagram.maxsize = sizeof (proxy->datagram_buf); proxy->begun = 0; - Netchan_OutOfBandPrint (net_from, "%c", S2C_CONNECTION); + SV_OutOfBandPrint (net_from, "%c", S2C_CONNECTION); } int