From 646ab3b011d3fed1b1bc1408e1d7e1d085590ea1 Mon Sep 17 00:00:00 2001 From: Daniel Collins Date: Sat, 17 Sep 2011 19:54:53 +0000 Subject: [PATCH] Reduced packet data limit to 8192 bytes, the standard driver included with XP only supports 1467 anyway. --- src/directplay.c | 4 ++-- src/ipxwrapper.h | 8 +++----- src/router.c | 8 ++++---- src/router.h | 1 - src/winsock.c | 12 +++++++----- 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/directplay.c b/src/directplay.c index 9a080a9..8f15a56 100644 --- a/src/directplay.c +++ b/src/directplay.c @@ -84,7 +84,7 @@ static BOOL recv_packet(int sockfd, char *buf, IDirectPlaySP *sp) { struct sockaddr_ipx addr; int addrlen = sizeof(addr); - int r = recvfrom(sockfd, buf, PACKET_BUF_SIZE, 0, (struct sockaddr*)&addr, &addrlen); + int r = recvfrom(sockfd, buf, MAX_DATA_SIZE, 0, (struct sockaddr*)&addr, &addrlen); if(r == -1) { if(WSAGetLastError() == WSAEWOULDBLOCK || WSAGetLastError() == WSAECONNRESET) { return TRUE; @@ -106,7 +106,7 @@ static DWORD WINAPI worker_main(LPVOID sp) { struct sp_data *sp_data = get_sp_data((IDirectPlaySP*)sp); release_sp_data((IDirectPlaySP*)sp); - char *buf = malloc(PACKET_BUF_SIZE); + char *buf = malloc(MAX_DATA_SIZE); if(!buf) { abort(); } diff --git a/src/ipxwrapper.h b/src/ipxwrapper.h index 426e095..7519f16 100644 --- a/src/ipxwrapper.h +++ b/src/ipxwrapper.h @@ -27,11 +27,9 @@ #include "config.h" #include "router.h" -/* Maximum UDP data size is 65467, we use a smaller value to ensure we have - * plenty of space to play with for headers, etc -*/ -#define MAX_PACKET_SIZE 63487 -#define PACKET_BUF_SIZE 65536 +/* The standard Windows driver (in XP) only allows 1467 bytes anyway */ +#define MAX_DATA_SIZE 8192 +#define MAX_PKT_SIZE 8219 #define IPX_FILTER (int)(1<<0) #define IPX_BOUND (int)(1<<1) diff --git a/src/router.c b/src/router.c index 9845ec9..9131688 100644 --- a/src/router.c +++ b/src/router.c @@ -98,7 +98,7 @@ struct router_vars *router_init(BOOL global) { return NULL; } - if(!(router->recvbuf = malloc(ROUTER_BUF_SIZE))) { + if(!(router->recvbuf = malloc(sizeof(struct rpacket_header) + MAX_PKT_SIZE))) { log_printf("Out of memory! Cannot allocate recv buffer"); router_destroy(router); @@ -257,9 +257,9 @@ DWORD router_main(void *arg) { int addrlen = sizeof(addr); struct rpacket_header *rp_header = (struct rpacket_header*)router->recvbuf; - ipx_packet *packet = (ipx_packet*)(router->recvbuf + sizeof(struct rpacket_header)); + ipx_packet *packet = (ipx_packet*)(router->recvbuf + sizeof(*rp_header)); - int len = recvfrom(router->udp_sock, (char*)packet, PACKET_BUF_SIZE, 0, (struct sockaddr*)&addr, &addrlen); + int len = recvfrom(router->udp_sock, (char*)packet, MAX_PKT_SIZE, 0, (struct sockaddr*)&addr, &addrlen); if(len == -1) { if(WSAGetLastError() == WSAEWOULDBLOCK || WSAGetLastError() == WSAECONNRESET) { continue; @@ -273,7 +273,7 @@ DWORD router_main(void *arg) { packet->size = ntohs(packet->size); - if(len < sizeof(ipx_packet) - 1 || packet->size > MAX_PACKET_SIZE || packet->size + sizeof(ipx_packet) - 1 != len) { + if(len < sizeof(ipx_packet) - 1 || packet->size > MAX_DATA_SIZE || packet->size + sizeof(ipx_packet) - 1 != len) { LeaveCriticalSection(&(router->crit_sec)); continue; } diff --git a/src/router.h b/src/router.h index 2f80922..ced160c 100644 --- a/src/router.h +++ b/src/router.h @@ -24,7 +24,6 @@ #include #define MAX_ROUTER_CLIENTS 128 -#define ROUTER_BUF_SIZE PACKET_BUF_SIZE + sizeof(struct rpacket_header) struct router_call { enum { diff --git a/src/winsock.c b/src/winsock.c index f70013a..5ba8358 100644 --- a/src/winsock.c +++ b/src/winsock.c @@ -305,6 +305,8 @@ int WSAAPI getsockname(SOCKET fd, struct sockaddr *addr, int *addrlen) { } } +#define RECVBUF_SIZE (sizeof(struct rpacket_header) + MAX_PKT_SIZE) + /* Recieve a packet from an IPX socket * addr must be NULL or a region of memory big enough for a sockaddr_ipx * @@ -322,7 +324,7 @@ static int recv_packet(ipx_socket *sockptr, char *buf, int bufsize, int flags, s return -1; } - char *recvbuf = malloc(ROUTER_BUF_SIZE); + char *recvbuf = malloc(RECVBUF_SIZE); if(!recvbuf) { WSASetLastError(ERROR_OUTOFMEMORY); return -1; @@ -331,7 +333,7 @@ static int recv_packet(ipx_socket *sockptr, char *buf, int bufsize, int flags, s struct rpacket_header *rp_header = (struct rpacket_header*)recvbuf; struct ipx_packet *packet = (struct ipx_packet*)(recvbuf + sizeof(*rp_header)); - int rval = r_recv(fd, recvbuf, ROUTER_BUF_SIZE, flags); + int rval = r_recv(fd, recvbuf, RECVBUF_SIZE, flags); if(rval == -1) { free(recvbuf); return -1; @@ -464,7 +466,7 @@ int WSAAPI getsockopt(SOCKET fd, int level, int optname, char FAR *optval, int F if(optname == IPX_MAXSIZE) { CHECK_OPTLEN(sizeof(int)); - *intval = MAX_PACKET_SIZE; + *intval = MAX_DATA_SIZE; RETURN(0); } @@ -487,7 +489,7 @@ int WSAAPI getsockopt(SOCKET fd, int level, int optname, char FAR *optval, int F /* TODO: LAN/WAN detection, link speed detection */ ipxdata->wan = FALSE; ipxdata->status = FALSE; - ipxdata->maxpkt = MAX_PACKET_SIZE; + ipxdata->maxpkt = MAX_DATA_SIZE; ipxdata->linkspeed = 100000; /* 10MBps */ free_interfaces(nic); @@ -638,7 +640,7 @@ int WSAAPI sendto(SOCKET fd, const char *buf, int len, int flags, const struct s } } - if(len > MAX_PACKET_SIZE) { + if(len > MAX_DATA_SIZE) { RETURN_WSA(WSAEMSGSIZE, -1); }