From 69ad164bbcdcfa6962d8ca5323a0b63baff4a166 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Wed, 13 Aug 2025 19:49:22 -0400 Subject: [PATCH] Get rid of netbuffer global Thx SRB2classic --- src/d_clisrv.c | 22 ++++++++++++++++++++++ src/d_clisrv.h | 1 - src/d_net.c | 30 ++++++++++++++++-------------- src/d_netcmd.c | 2 ++ src/d_netfil.c | 11 +++++++++++ src/i_net.h | 5 ++++- src/i_tcp.c | 4 ++++ 7 files changed, 59 insertions(+), 16 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 4546aa1fc..56ab40253 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -811,6 +811,7 @@ static inline void CL_DrawConnectionStatus(void) static boolean CL_AskFileList(INT32 firstfile) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); netbuffer->packettype = PT_TELLFILESNEEDED; netbuffer->u.filesneedednum = firstfile; @@ -829,6 +830,7 @@ static boolean CL_AskFileList(INT32 firstfile) */ static boolean CL_SendJoin(void) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); UINT8 localplayers = 1; UINT8 i; @@ -932,6 +934,7 @@ static void SV_SendServerInfo(INT32 node, tic_t servertime) UINT8 prefgametype = (cv_kartgametypepreference.value == -1) ? gametype : cv_kartgametypepreference.value; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); netbuffer->packettype = PT_SERVERINFO; netbuffer->u.serverinfo._255 = 255; @@ -1053,6 +1056,7 @@ static void SV_SendServerInfo(INT32 node, tic_t servertime) static void SV_SendPlayerInfo(INT32 node) { UINT8 i; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); netbuffer->packettype = PT_PLAYERINFO; for (i = 0; i < MSCOMPAT_MAXPLAYERS; i++) @@ -1108,6 +1112,7 @@ static void SV_SendPlayerInfo(INT32 node) static boolean SV_SendServerConfig(INT32 node) { boolean waspacketsent; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); memset(&netbuffer->u.servercfg, 0, sizeof netbuffer->u.servercfg); @@ -1282,6 +1287,7 @@ static void CL_LoadReceivedSavegame(boolean reloading) savebuffer_t save = {0}; size_t length, decompressedlen; char tmpsave[256]; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); sprintf(tmpsave, "%s" PATHSEP TMPSAVENAME, srb2home); @@ -1384,6 +1390,7 @@ static void CL_ReloadReceivedSavegame(void) static void SendAskInfo(INT32 node) { tic_t asktime; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); if (node != 0 && node != BROADCASTADDR && cv_rendezvousserver.string[0]) @@ -3312,6 +3319,7 @@ static void Command_list_http_logins (void) static void Command_ResendGamestate(void) { SINT8 playernum; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); if (COM_Argc() == 1) { @@ -3556,6 +3564,7 @@ static inline void SV_GenContext(void) // void D_QuitNetGame(void) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); if (!netgame || !netbuffer) return; @@ -4052,6 +4061,7 @@ void SV_StartSinglePlayerServer(void) static void SV_SendRefuse(INT32 node, const char *reason) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); strcpy(netbuffer->u.serverrefuse.reason, reason); netbuffer->packettype = PT_SERVERREFUSE; @@ -4082,6 +4092,7 @@ static size_t TotalTextCmdPerTic(tic_t tic) */ static void HandleConnect(SINT8 node) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); char names[MAXSPLITSCREENPLAYERS][MAXPLAYERNAME + 1]; INT32 i; @@ -4287,6 +4298,7 @@ static void HandleTimeout(SINT8 node) */ static void HandleServerInfo(SINT8 node) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); char servername[MAXSERVERNAME]; // compute ping in ms const tic_t ticnow = I_GetTime(); @@ -4307,6 +4319,7 @@ static void HandleServerInfo(SINT8 node) static void HandlePlayerInfo(SINT8 node) { (void)node; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); for (INT32 i = 0; i < MAXPLAYERS; i++) { playerinfo[i] = netbuffer->u.playerinfo[i]; @@ -4317,6 +4330,7 @@ static void HandlePlayerInfo(SINT8 node) static void PT_WillResendGamestate(void) { char tmpsave[256]; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); if (server || cl_redownloadinggamestate) return; @@ -4361,6 +4375,7 @@ static void PT_CanReceiveGamestate(SINT8 node) */ static void HandlePacketFromAwayNode(SINT8 node) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); if (node != servernode) DEBFILE(va("Received packet from unknown host %d\n", node)); @@ -4609,6 +4624,7 @@ static boolean CheckForSpeedHacks(UINT8 p) */ static void HandlePacketFromPlayer(SINT8 node) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); INT32 netconsole; tic_t realend, realstart; UINT8 *pak, *txtpak, numtxtpak; @@ -5079,6 +5095,7 @@ static void HandlePacketFromPlayer(SINT8 node) */ static void GetPackets(void) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); SINT8 node; // The packet sender player_joining = false; @@ -5283,6 +5300,7 @@ static INT16 Consistancy(void) // used during wipes to tell the server that a node is still connected static void CL_SendClientKeepAlive(void) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); netbuffer->packettype = PT_BASICKEEPALIVE; HSendPacket(servernode, false, 0, 0); @@ -5291,6 +5309,7 @@ static void CL_SendClientKeepAlive(void) static void SV_SendServerKeepAlive(void) { INT32 n; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); for (n = 1; n < MAXNETNODES; n++) { @@ -5305,6 +5324,7 @@ static void SV_SendServerKeepAlive(void) // send the client packet to the server static void CL_SendClientCmd(void) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); size_t packetsize = 0; boolean mis = false; @@ -5407,6 +5427,7 @@ static void SV_SendTics(void) size_t packsize; UINT8 *bufpos; UINT8 *ntextcmd; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); // send to all client but not to me // for each node create a packet with x tics and send it @@ -5732,6 +5753,7 @@ static inline void PingUpdate(void) INT32 i, j; boolean laggers[MAXPLAYERS]; UINT8 numlaggers = 0; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); memset(laggers, 0, sizeof(boolean) * MAXPLAYERS); netbuffer->packettype = PT_PING; diff --git a/src/d_clisrv.h b/src/d_clisrv.h index e2c9da955..36e273074 100644 --- a/src/d_clisrv.h +++ b/src/d_clisrv.h @@ -403,7 +403,6 @@ extern UINT32 serverlistcount; extern INT32 mapchangepending; // Points inside doomcom -extern doomdata_t *netbuffer; extern consvar_t cv_stunserver; extern consvar_t cv_httpsource; extern consvar_t cv_kicktime; diff --git a/src/d_net.c b/src/d_net.c index 34ca7dce2..7cfffbce9 100644 --- a/src/d_net.c +++ b/src/d_net.c @@ -52,10 +52,6 @@ tic_t connectiontimeout = (10*TICRATE); /// \brief network packet doomcom_t *doomcom = NULL; -/// \brief network packet data, points inside doomcom -doomdata_t *netbuffer = NULL; -/// \brief hole punching packet, also points inside doomcom -holepunch_t *holepunchpacket = NULL; #ifdef DEBUGFILE FILE *debugfile = NULL; // put some net info in a file during the game @@ -207,13 +203,9 @@ static netnode_t nodes[MAXNETNODES]; // 0 if a = n (mod 256) // >0 if a > b (mod 256) // mnemonic: to use it compare to 0: cmpack(a,b)<0 is "a < b" ... -FUNCMATH static INT32 cmpack(UINT8 a, UINT8 b) +FUNCMATH static inline INT32 cmpack(UINT8 a, UINT8 b) { - register INT32 d = a - b; - - if (d >= 127 || d < -128) - return -d; - return d; + return (SINT8)(a - b); } /** Sets freeack to a free acknum and copies the netbuffer in the ackpak table @@ -227,6 +219,8 @@ static boolean GetFreeAcknum(UINT8 *freeack, boolean lowtimer) netnode_t *node = &nodes[doomcom->remotenode]; INT32 i, numfreeslot = 0; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); + if (cmpack((UINT8)((node->remotefirstack + MAXACKTOSEND) % 256), node->nextacknum) < 0) { DEBFILE(va("too fast %d %d\n",node->remotefirstack,node->nextacknum)); @@ -339,6 +333,7 @@ static int Processackpak(void) INT32 i; int goodpacket = GPACK_OK; netnode_t *node = &nodes[doomcom->remotenode]; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); // Received an ack return, so remove the ack in the list if (netbuffer->ackreturn && cmpack(node->remotefirstack, netbuffer->ackreturn) < 0) @@ -449,6 +444,7 @@ static int Processackpak(void) // send special packet with only ack on it void Net_SendAcks(INT32 node) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); netbuffer->packettype = PT_NOTHING; M_Memcpy(netbuffer->u.textcmd, nodes[node].acktosend, MAXACKTOSEND); HSendPacket(node, false, 0, MAXACKTOSEND); @@ -458,6 +454,8 @@ static void GotAcks(void) { INT32 i, j; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); + for (j = 0; j < MAXACKTOSEND; j++) if (netbuffer->u.textcmd[j]) for (i = 0; i < MAXACKPACKETS; i++) @@ -502,6 +500,7 @@ void Net_ConnectionTimeout(INT32 node) void Net_AckTicker(void) { INT32 i; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); for (i = 0; i < MAXACKPACKETS; i++) { @@ -553,6 +552,7 @@ void Net_AckTicker(void) // (the higher layer doesn't have room, or something else ....) void Net_UnAcknowledgePacket(INT32 node) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); INT32 hm1 = (nodes[node].acktosend_head-1+MAXACKTOSEND) % MAXACKTOSEND; DEBFILE(va("UnAcknowledge node %d\n", node)); if (!node) @@ -720,6 +720,7 @@ void Net_CloseConnection(INT32 node) // static UINT32 NetbufferChecksum(void) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); UINT32 c = 0x1234567; const INT32 l = doomcom->datalength - 4; const UINT8 *buf = (UINT8 *)netbuffer + 4; @@ -822,6 +823,8 @@ static const char *packettypename[NUMPACKETTYPE] = static void DebugPrintpacket(const char *header) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); + fprintf(debugfile, "%-12s (node %d,ack %d,ackret %d,size %d) type(%d) : %s\n", header, doomcom->remotenode, netbuffer->ack, netbuffer->ackreturn, doomcom->datalength, netbuffer->packettype, packettypename[netbuffer->packettype]); @@ -1001,6 +1004,7 @@ void Command_Droprate(void) static boolean ShouldDropPacket(void) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); return (packetdropquantity[netbuffer->packettype]) || (packetdroprate != 0 && rand() < (RAND_MAX * (packetdroprate / 100.f))) || packetdroprate == 100; } @@ -1011,6 +1015,7 @@ static boolean ShouldDropPacket(void) // boolean HSendPacket(INT32 node, boolean reliable, UINT8 acknum, size_t packetlength) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); doomcom->datalength = (INT16)(packetlength + BASEPACKETSIZE); if (node == 0) // Packet is to go back to us { @@ -1109,7 +1114,7 @@ boolean HSendPacket(INT32 node, boolean reliable, UINT8 acknum, size_t packetlen // boolean HGetPacket(void) { - //boolean nodejustjoined; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); // Get a packet from self if (rebound_tail != rebound_head) @@ -1352,9 +1357,6 @@ boolean D_CheckNetGame(void) if (doomcom->numnodes > MAXNETNODES) I_Error("Too many nodes (%d), max:%d", doomcom->numnodes, MAXNETNODES); - netbuffer = (doomdata_t *)(void *)&doomcom->data; - holepunchpacket = (holepunch_t *)(void *)&doomcom->data; - #ifdef DEBUGFILE if (M_CheckParm("-debugfile")) { diff --git a/src/d_netcmd.c b/src/d_netcmd.c index a8e4b5c59..02686c592 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -30,6 +30,7 @@ #include "p_setup.h" #include "s_sound.h" #include "i_sound.h" +#include "i_net.h" #include "m_misc.h" #include "am_map.h" #include "byteptr.h" @@ -4090,6 +4091,7 @@ static void Command_Changepassword_f(void) static void Command_Login_f(void) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); #ifdef NOMD5 // If we have no MD5 support then completely disable XD_LOGIN responses for security. CONS_Alert(CONS_NOTICE, "Remote administration commands are not supported in this build.\n"); diff --git a/src/d_netfil.c b/src/d_netfil.c index c4a5fe841..6a001bed7 100644 --- a/src/d_netfil.c +++ b/src/d_netfil.c @@ -149,6 +149,7 @@ UINT8 *PutFileNeeded(UINT16 firstfile) { size_t i; UINT8 count = 0; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); UINT8 *p_start = netbuffer->packettype == PT_MOREFILESNEEDED ? netbuffer->u.filesneededcfg.files : netbuffer->u.serverinfo.fileneeded; UINT8 *p = p_start; char wadfilename[MAX_WADPATH] = ""; @@ -361,6 +362,7 @@ boolean CL_SendFileRequest(void) #ifdef MORELEGACYDOWNLOADER boolean firstloop = true; #endif + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); #ifdef PARANOIA if (M_CheckParm("-nodownload")) @@ -492,9 +494,11 @@ tryagain: // returns false if a requested file was not found or cannot be sent boolean PT_RequestFile(INT32 node) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); char wad[MAX_WADPATH+1]; UINT8 *p = netbuffer->u.textcmd; UINT8 id; + while (p < netbuffer->u.textcmd + MAXTEXTCMD) // Don't allow hacked client to overflow { id = READUINT8(p); @@ -731,6 +735,7 @@ static void SV_PrepareSendLuaFileToNextNode(void) { INT32 i; UINT8 success = 1; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); // Find a client to send the file to for (i = 1; i < MAXNETNODES; i++) @@ -835,6 +840,7 @@ void SV_AbortLuaFileTransfer(INT32 node) void CL_PrepareDownloadLuaFile(void) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); // If there is no transfer in the list, this normally means the server // called io.open before us, so we have to wait until we call it too if (!luafiletransfers) @@ -1101,6 +1107,7 @@ void FileSendTicker(void) size_t fragmentsize; filetx_t *f; INT32 packetsent, ram, i, j; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); // If someone is taking too long to download, kick them with a timeout // to prevent blocking the rest of the server... @@ -1247,6 +1254,7 @@ void FileSendTicker(void) void PT_FileAck(void) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); fileack_pak *packet = (void*)&netbuffer->u.fileack; INT32 node = doomcom->remotenode; filetran_t *trans = &transfer[node]; @@ -1301,6 +1309,7 @@ void PT_FileAck(void) void PT_FileReceived(void) { filetx_t *trans = transfer[doomcom->remotenode].txlist; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); if (trans && netbuffer->u.filereceived == trans->fileid) SV_EndFileSend(doomcom->remotenode); @@ -1310,6 +1319,7 @@ static void SendAckPacket(fileack_pak *packet, UINT8 fileid) { size_t packetsize; INT32 i; + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); packetsize = sizeof(*packet) + packet->numsegments * sizeof(*packet->segments); @@ -1391,6 +1401,7 @@ void FileReceiveTicker(void) void PT_FileFragment(void) { + doomdata_t *netbuffer = DOOMCOM_DATA(doomcom); filetx_pak *pak = (void*)&netbuffer->u.filetxpak; INT32 filenum = pak->fileid; fileneeded_t *file = &fileneeded[filenum]; diff --git a/src/i_net.h b/src/i_net.h index 2d4eb6072..d237e2096 100644 --- a/src/i_net.h +++ b/src/i_net.h @@ -79,6 +79,8 @@ struct doomcom_t char data[MAXPACKETLENGTH]; } ATTRPACK; +#define DOOMCOM_DATA(d) (doomdata_t *)&(d)->data + struct holepunch_t { INT32 magic; @@ -86,12 +88,13 @@ struct holepunch_t INT16 port; } ATTRPACK; +#define HOLEPUNCH_DATA(d) (holepunch_t *)&(d)->data + #if defined(_MSC_VER) #pragma pack() #endif extern doomcom_t *doomcom; -extern holepunch_t *holepunchpacket; /** \brief return packet in doomcom struct */ diff --git a/src/i_tcp.c b/src/i_tcp.c index c5298f5d6..5cc6940b5 100644 --- a/src/i_tcp.c +++ b/src/i_tcp.c @@ -579,6 +579,8 @@ void Command_Numnodes(void) static boolean hole_punch(ssize_t c) { + holepunch_t *holepunchpacket = HOLEPUNCH_DATA(doomcom); + if (cv_rendezvousserver.string[0] && c == 10 && holepunchpacket->magic == hole_punch_magic) { @@ -1415,6 +1417,7 @@ static void rendezvous(int size) static tic_t refreshtic = (tic_t)-1; tic_t tic = I_GetTime(); + holepunch_t *holepunchpacket = HOLEPUNCH_DATA(doomcom); if (tic != refreshtic) { @@ -1441,6 +1444,7 @@ static void rendezvous(int size) static void SOCK_RequestHolePunch(INT32 node) { mysockaddr_t * addr = &clientaddress[node]; + holepunch_t *holepunchpacket = HOLEPUNCH_DATA(doomcom); holepunchpacket->addr = addr->ip4.sin_addr.s_addr; holepunchpacket->port = addr->ip4.sin_port;