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

Receive multiple packets in the same router loop iteration.

This commit is contained in:
Daniel Collins 2023-12-02 18:38:07 +00:00
parent d50a12a186
commit 0dd7f08993

View File

@ -35,6 +35,9 @@
#define IPX_SOCK_ECHO 2 #define IPX_SOCK_ECHO 2
/* Maximum number of packets to dispatch per iteration of the router loop. */
#define MAX_RECV_PER_LOOP 50
static bool router_running = false; static bool router_running = false;
static WSAEVENT router_event = WSA_INVALID_EVENT; static WSAEVENT router_event = WSA_INVALID_EVENT;
static HANDLE router_thread = NULL; static HANDLE router_thread = NULL;
@ -638,7 +641,7 @@ static void _handle_dosbox_recv(novell_ipx_packet *packet, size_t packet_size)
} }
} }
static bool _do_udp_recv(int fd) static int _do_udp_recv(int fd)
{ {
struct sockaddr_in addr; struct sockaddr_in addr;
int addrlen = sizeof(addr); int addrlen = sizeof(addr);
@ -647,12 +650,14 @@ static bool _do_udp_recv(int fd)
int len = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr*)(&addr), &addrlen); int len = recvfrom(fd, buf, sizeof(buf), 0, (struct sockaddr*)(&addr), &addrlen);
if(len == -1) if(len == -1)
{ {
if(WSAGetLastError() == WSAEWOULDBLOCK || WSAGetLastError() == WSAECONNRESET) DWORD err = WSAGetLastError();
{
return true;
}
return false; switch(err)
{
case WSAEWOULDBLOCK: return 0;
case WSAECONNRESET: return 1;
default: return -1;
}
} }
__atomic_add_fetch(&recv_packets_udp, 1, __ATOMIC_RELAXED); __atomic_add_fetch(&recv_packets_udp, 1, __ATOMIC_RELAXED);
@ -665,7 +670,7 @@ static bool _do_udp_recv(int fd)
|| addr.sin_port != dosbox_server_addr.sin_port) || addr.sin_port != dosbox_server_addr.sin_port)
{ {
/* Ignore packet from wrong address. */ /* Ignore packet from wrong address. */
return true; return 1;
} }
if(dosbox_state == DOSBOX_REGISTERING) if(dosbox_state == DOSBOX_REGISTERING)
@ -685,7 +690,7 @@ static bool _do_udp_recv(int fd)
_handle_udp_recv((ipx_packet*)(buf), len, addr); _handle_udp_recv((ipx_packet*)(buf), len, addr);
} }
return true; return 1;
} }
static void _handle_pcap_frame(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data) static void _handle_pcap_frame(u_char *user, const struct pcap_pkthdr *pkt_header, const u_char *pkt_data)
@ -885,14 +890,43 @@ static DWORD router_main(void *arg)
} }
else if(ipx_encap_type == ENCAP_TYPE_DOSBOX) else if(ipx_encap_type == ENCAP_TYPE_DOSBOX)
{ {
if(!_do_udp_recv(private_socket)) int status = 0;
for(int i = 0; i < MAX_RECV_PER_LOOP; ++i)
{
status = _do_udp_recv(private_socket);
if(status <= 0)
{
break;
}
}
if(status < 0)
{ {
exit_status = 1; exit_status = 1;
break; break;
} }
} }
else{ else{
if(!_do_udp_recv(shared_socket) || !_do_udp_recv(private_socket)) int status = 0;
for(int i = 0; i < MAX_RECV_PER_LOOP; ++i)
{
int s1 = _do_udp_recv(shared_socket);
int s2 = _do_udp_recv(private_socket);
if(s1 < 0 || s2 < 0)
{
status = -1;
break;
}
else if(s1 == 0 && s2 == 0)
{
break;
}
}
if(status < 0)
{ {
exit_status = 1; exit_status = 1;
break; break;