1
0
mirror of https://github.com/solemnwarning/ipxwrapper synced 2024-12-30 16:45:37 +01:00

Reduced packet data limit to 8192 bytes, the standard driver included with XP only supports 1467 anyway.

This commit is contained in:
Daniel Collins 2011-09-17 19:54:53 +00:00
parent f560fae7ad
commit 646ab3b011
5 changed files with 16 additions and 17 deletions

View File

@ -84,7 +84,7 @@ static BOOL recv_packet(int sockfd, char *buf, IDirectPlaySP *sp) {
struct sockaddr_ipx addr; struct sockaddr_ipx addr;
int addrlen = sizeof(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(r == -1) {
if(WSAGetLastError() == WSAEWOULDBLOCK || WSAGetLastError() == WSAECONNRESET) { if(WSAGetLastError() == WSAEWOULDBLOCK || WSAGetLastError() == WSAECONNRESET) {
return TRUE; return TRUE;
@ -106,7 +106,7 @@ static DWORD WINAPI worker_main(LPVOID sp) {
struct sp_data *sp_data = get_sp_data((IDirectPlaySP*)sp); struct sp_data *sp_data = get_sp_data((IDirectPlaySP*)sp);
release_sp_data((IDirectPlaySP*)sp); release_sp_data((IDirectPlaySP*)sp);
char *buf = malloc(PACKET_BUF_SIZE); char *buf = malloc(MAX_DATA_SIZE);
if(!buf) { if(!buf) {
abort(); abort();
} }

View File

@ -27,11 +27,9 @@
#include "config.h" #include "config.h"
#include "router.h" #include "router.h"
/* Maximum UDP data size is 65467, we use a smaller value to ensure we have /* The standard Windows driver (in XP) only allows 1467 bytes anyway */
* plenty of space to play with for headers, etc #define MAX_DATA_SIZE 8192
*/ #define MAX_PKT_SIZE 8219
#define MAX_PACKET_SIZE 63487
#define PACKET_BUF_SIZE 65536
#define IPX_FILTER (int)(1<<0) #define IPX_FILTER (int)(1<<0)
#define IPX_BOUND (int)(1<<1) #define IPX_BOUND (int)(1<<1)

View File

@ -98,7 +98,7 @@ struct router_vars *router_init(BOOL global) {
return NULL; 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"); log_printf("Out of memory! Cannot allocate recv buffer");
router_destroy(router); router_destroy(router);
@ -257,9 +257,9 @@ DWORD router_main(void *arg) {
int addrlen = sizeof(addr); int addrlen = sizeof(addr);
struct rpacket_header *rp_header = (struct rpacket_header*)router->recvbuf; 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(len == -1) {
if(WSAGetLastError() == WSAEWOULDBLOCK || WSAGetLastError() == WSAECONNRESET) { if(WSAGetLastError() == WSAEWOULDBLOCK || WSAGetLastError() == WSAECONNRESET) {
continue; continue;
@ -273,7 +273,7 @@ DWORD router_main(void *arg) {
packet->size = ntohs(packet->size); 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)); LeaveCriticalSection(&(router->crit_sec));
continue; continue;
} }

View File

@ -24,7 +24,6 @@
#include <stdint.h> #include <stdint.h>
#define MAX_ROUTER_CLIENTS 128 #define MAX_ROUTER_CLIENTS 128
#define ROUTER_BUF_SIZE PACKET_BUF_SIZE + sizeof(struct rpacket_header)
struct router_call { struct router_call {
enum { enum {

View File

@ -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 /* Recieve a packet from an IPX socket
* addr must be NULL or a region of memory big enough for a sockaddr_ipx * 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; return -1;
} }
char *recvbuf = malloc(ROUTER_BUF_SIZE); char *recvbuf = malloc(RECVBUF_SIZE);
if(!recvbuf) { if(!recvbuf) {
WSASetLastError(ERROR_OUTOFMEMORY); WSASetLastError(ERROR_OUTOFMEMORY);
return -1; 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 rpacket_header *rp_header = (struct rpacket_header*)recvbuf;
struct ipx_packet *packet = (struct ipx_packet*)(recvbuf + sizeof(*rp_header)); 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) { if(rval == -1) {
free(recvbuf); free(recvbuf);
return -1; return -1;
@ -464,7 +466,7 @@ int WSAAPI getsockopt(SOCKET fd, int level, int optname, char FAR *optval, int F
if(optname == IPX_MAXSIZE) { if(optname == IPX_MAXSIZE) {
CHECK_OPTLEN(sizeof(int)); CHECK_OPTLEN(sizeof(int));
*intval = MAX_PACKET_SIZE; *intval = MAX_DATA_SIZE;
RETURN(0); 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 */ /* TODO: LAN/WAN detection, link speed detection */
ipxdata->wan = FALSE; ipxdata->wan = FALSE;
ipxdata->status = FALSE; ipxdata->status = FALSE;
ipxdata->maxpkt = MAX_PACKET_SIZE; ipxdata->maxpkt = MAX_DATA_SIZE;
ipxdata->linkspeed = 100000; /* 10MBps */ ipxdata->linkspeed = 100000; /* 10MBps */
free_interfaces(nic); 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); RETURN_WSA(WSAEMSGSIZE, -1);
} }