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:
parent
f560fae7ad
commit
646ab3b011
@ -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();
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -24,7 +24,6 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#define MAX_ROUTER_CLIENTS 128
|
||||
#define ROUTER_BUF_SIZE PACKET_BUF_SIZE + sizeof(struct rpacket_header)
|
||||
|
||||
struct router_call {
|
||||
enum {
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user