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;
|
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();
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user