summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrey Nazarov <skuller@skuller.net>2012-02-13 12:30:54 +0400
committerAndrey Nazarov <skuller@skuller.net>2012-04-03 01:25:48 +0400
commit7f606fa751bdfdbbc3c3d271ae113c201b4c166f (patch)
tree53d9d66877ed64e4b16ad19abb633580ae60e893 /src
parente6ccd70cd3cefc96ddb73cf3b1807ff38cf8106b (diff)
Improve NET_GetPacket interface.
Replace external while(NET_GetPacket()) loops with a single call to NET_GetPackets with a callback argument.
Diffstat (limited to 'src')
-rw-r--r--src/cl_main.c13
-rw-r--r--src/net_common.c117
-rw-r--r--src/net_common.h12
-rw-r--r--src/sv_main.c21
4 files changed, 70 insertions, 93 deletions
diff --git a/src/cl_main.c b/src/cl_main.c
index b5f3b79..320d93d 100644
--- a/src/cl_main.c
+++ b/src/cl_main.c
@@ -3257,18 +3257,7 @@ qboolean CL_ProcessEvents(void)
IN_Frame();
- memset(&net_from, 0, sizeof(net_from));
- net_from.type = NA_LOOPBACK;
-
- // process loopback packets
- while (NET_GetLoopPacket(NS_CLIENT)) {
- CL_PacketEvent();
- }
-
- // process network packets
- while (NET_GetPacket(NS_CLIENT)) {
- CL_PacketEvent();
- }
+ NET_GetPackets(NS_CLIENT, CL_PacketEvent);
// process console and stuffed commands
Cbuf_Execute(&cmd_buffer);
diff --git a/src/net_common.c b/src/net_common.c
index 91c2ae8..71dfc4c 100644
--- a/src/net_common.c
+++ b/src/net_common.c
@@ -251,7 +251,7 @@ idnewt:28000
192.246.40.70:28000
=============
*/
-qboolean NET_StringToAdr(const char *s, netadr_t *a, int port)
+qboolean NET_StringToAdr(const char *s, netadr_t *a, int default_port)
{
struct sockaddr_in sadr;
char copy[MAX_STRING_CHARS], *p;
@@ -274,7 +274,7 @@ qboolean NET_StringToAdr(const char *s, netadr_t *a, int port)
if (p)
a->port = BigShort(atoi(p + 1));
if (!a->port)
- a->port = BigShort(port);
+ a->port = BigShort(default_port);
return qtrue;
}
@@ -458,12 +458,7 @@ static size_t NET_DnRate_m(char *buffer, size_t size)
#if USE_CLIENT
-/*
-=============
-NET_GetLoopPacket
-=============
-*/
-qboolean NET_GetLoopPacket(netsrc_t sock)
+static void NET_GetLoopPackets(netsrc_t sock, void (*packet_cb)(void))
{
loopback_t *loop;
loopmsg_t *loopmsg;
@@ -474,28 +469,26 @@ qboolean NET_GetLoopPacket(netsrc_t sock)
loop->get = loop->send - MAX_LOOPBACK + 1;
}
- if (loop->get >= loop->send) {
- return qfalse;
- }
-
- loopmsg = &loop->msgs[loop->get & (MAX_LOOPBACK - 1)];
- loop->get++;
+ while (loop->get < loop->send) {
+ loopmsg = &loop->msgs[loop->get & (MAX_LOOPBACK - 1)];
+ loop->get++;
- memcpy(msg_read_buffer, loopmsg->data, loopmsg->datalen);
+ memcpy(msg_read_buffer, loopmsg->data, loopmsg->datalen);
#ifdef _DEBUG
- if (net_log_enable->integer > 1) {
- NET_LogPacket(&net_from, "LP recv", loopmsg->data, loopmsg->datalen);
- }
+ if (net_log_enable->integer > 1) {
+ NET_LogPacket(&net_from, "LP recv", loopmsg->data, loopmsg->datalen);
+ }
#endif
- if (sock == NS_CLIENT) {
- net_rate_rcvd += loopmsg->datalen;
- }
+ if (sock == NS_CLIENT) {
+ net_rate_rcvd += loopmsg->datalen;
+ }
- SZ_Init(&msg_read, msg_read_buffer, sizeof(msg_read_buffer));
- msg_read.cursize = loopmsg->datalen;
+ SZ_Init(&msg_read, msg_read_buffer, sizeof(msg_read_buffer));
+ msg_read.cursize = loopmsg->datalen;
- return qtrue;
+ (*packet_cb)();
+ }
}
static qboolean NET_SendLoopPacket(netsrc_t sock, const void *data,
@@ -763,52 +756,68 @@ int NET_Sleepv(int msec, ...)
//=============================================================================
-/*
-=============
-NET_GetPacket
-
-Fills msg_read_buffer with packet contents,
-net_from variable receives source address.
-=============
-*/
-qboolean NET_GetPacket(netsrc_t sock)
+static void NET_GetUdpPackets(netsrc_t sock, void (*packet_cb)(void))
{
ioentry_t *e;
ssize_t ret;
if (udp_sockets[sock] == -1)
- return qfalse;
+ return;
e = os_get_io(udp_sockets[sock]);
if (!e->canread)
- return qfalse;
+ return;
- ret = os_udp_recv(sock, msg_read_buffer, MAX_PACKETLEN, &net_from);
- if (ret == NET_AGAIN) {
- e->canread = qfalse;
- return qfalse;
- }
+ while (1) {
+ ret = os_udp_recv(sock, msg_read_buffer, MAX_PACKETLEN, &net_from);
+ if (ret == NET_AGAIN) {
+ e->canread = qfalse;
+ break;
+ }
- if (ret == NET_ERROR) {
- Com_DPrintf("%s: %s from %s\n", __func__,
- NET_ErrorString(), NET_AdrToString(&net_from));
- net_recv_errors++;
- return qfalse;
- }
+ if (ret == NET_ERROR) {
+ Com_DPrintf("%s: %s from %s\n", __func__,
+ NET_ErrorString(), NET_AdrToString(&net_from));
+ net_recv_errors++;
+ break;
+ }
#ifdef _DEBUG
- if (net_log_enable->integer)
- NET_LogPacket(&net_from, "UDP recv", msg_read_buffer, ret);
+ if (net_log_enable->integer)
+ NET_LogPacket(&net_from, "UDP recv", msg_read_buffer, ret);
#endif
- SZ_Init(&msg_read, msg_read_buffer, sizeof(msg_read_buffer));
- msg_read.cursize = ret;
+ net_rate_rcvd += ret;
+ net_bytes_rcvd += ret;
+ net_packets_rcvd++;
- net_rate_rcvd += ret;
- net_bytes_rcvd += ret;
- net_packets_rcvd++;
+ SZ_Init(&msg_read, msg_read_buffer, sizeof(msg_read_buffer));
+ msg_read.cursize = ret;
- return qtrue;
+ (*packet_cb)();
+ }
+}
+
+/*
+=============
+NET_GetPackets
+
+Fills msg_read_buffer with packet contents,
+net_from variable receives source address.
+=============
+*/
+void NET_GetPackets(netsrc_t sock, void (*packet_cb)(void))
+{
+#if USE_CLIENT
+ memset(&net_from, 0, sizeof(net_from));
+ net_from.type = NA_LOOPBACK;
+
+ // process loopback packets
+ NET_GetLoopPackets(sock, packet_cb);
+#endif
+
+ // process UDP packets
+ NET_GetUdpPackets(sock, packet_cb);
}
/*
diff --git a/src/net_common.h b/src/net_common.h
index 9c5ad6f..0d60377 100644
--- a/src/net_common.h
+++ b/src/net_common.h
@@ -184,18 +184,16 @@ static inline qboolean NET_IsLocalAddress(const netadr_t *adr)
void NET_Init(void);
void NET_Shutdown(void);
-
void NET_Config(netflag_t flag);
-qboolean NET_GetAddress(netsrc_t sock, netadr_t *adr);
-
void NET_UpdateStats(void);
-qboolean NET_GetPacket(netsrc_t sock);
-qboolean NET_SendPacket(netsrc_t sock, const void *data, size_t len, const netadr_t *to);
-qboolean NET_GetLoopPacket(netsrc_t sock);
+qboolean NET_GetAddress(netsrc_t sock, netadr_t *adr);
+void NET_GetPackets(netsrc_t sock, void (*packet_cb)(void));
+qboolean NET_SendPacket(netsrc_t sock, const void *data,
+ size_t len, const netadr_t *to);
char *NET_AdrToString(const netadr_t *a);
-qboolean NET_StringToAdr(const char *s, netadr_t *a, int port);
+qboolean NET_StringToAdr(const char *s, netadr_t *a, int default_port);
const char *NET_ErrorString(void);
diff --git a/src/sv_main.c b/src/sv_main.c
index 7b617b2..bd66819 100644
--- a/src/sv_main.c
+++ b/src/sv_main.c
@@ -1431,25 +1431,6 @@ void SV_ErrorEvent(netadr_t *from, int ee_errno, int ee_info)
}
#endif
-static void SV_ReadPackets(void)
-{
-#if USE_CLIENT
- memset(&net_from, 0, sizeof(net_from));
- net_from.type = NA_LOOPBACK;
-
- // process loopback packets
- while (NET_GetLoopPacket(NS_SERVER)) {
- SV_PacketEvent();
- }
-#endif
-
- // process network packets
- while (NET_GetPacket(NS_SERVER)) {
- SV_PacketEvent();
- }
-}
-
-
/*
==================
SV_CheckTimeouts
@@ -1726,7 +1707,7 @@ unsigned SV_Frame(unsigned msec)
#endif
// read packets from UDP clients
- SV_ReadPackets();
+ NET_GetPackets(NS_SERVER, SV_PacketEvent);
if (svs.initialized) {
#if USE_AC_SERVER