[qw] Use a callback for netchan logging

This gets outgoing packet logging working again. Yay, fill my hard-drive
faster ;)
This commit is contained in:
Bill Currie 2021-12-27 17:54:58 +09:00
parent 58bbed722a
commit 94871671d2
6 changed files with 72 additions and 30 deletions

View file

@ -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.

View file

@ -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);
}

View file

@ -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);

View file

@ -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;
}
}

View file

@ -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",

View file

@ -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