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

Fix local packet delivery when using DOSBox encapsulation.

This commit is contained in:
Daniel Collins 2023-09-04 20:24:22 +01:00
parent b987f7abc1
commit dde08ae3a9
3 changed files with 16 additions and 11 deletions

View File

@ -49,8 +49,9 @@ static HANDLE router_thread = NULL;
* will be bound to loopback rather than INADDR_ANY since it is only used for
* forwarding IPX packets on to local sockets.
*
* When running in DOSBox mode, only the private socket will be opened and it
* will be "connected" to the DOSBox server address.
* When running in DOSBox mode, only the private socket will be opened and
* bound to a random port on INADDR_ANY to communicate with the DOSBox server
* and also relay packets to local sockets.
*/
SOCKET shared_socket = -1;
@ -58,7 +59,7 @@ SOCKET private_socket = -1;
#define DOSBOX_CONNECT_TIMEOUT_SECS 10
static struct sockaddr_in dosbox_server_addr;
struct sockaddr_in dosbox_server_addr;
static time_t dosbox_connect_begin;
static void _send_dosbox_registration_request(void);
@ -148,12 +149,6 @@ void router_init(void)
dosbox_server_addr.sin_addr.s_addr = inet_addr(main_config.dosbox_server_addr);
dosbox_server_addr.sin_port = htons(main_config.dosbox_server_port);
if(connect(private_socket, (struct sockaddr*)(&dosbox_server_addr), sizeof(dosbox_server_addr)) != 0)
{
log_printf(LOG_ERROR, "Error connecting private socket: %s", w32_error(WSAGetLastError()));
abort();
}
_send_dosbox_registration_request();
dosbox_state = DOSBOX_REGISTERING;
@ -582,6 +577,14 @@ static bool _do_udp_recv(int fd)
if(ipx_encap_type == ENCAP_TYPE_DOSBOX)
{
if(addr.sin_family != dosbox_server_addr.sin_family
|| memcmp(&(addr.sin_addr), &(dosbox_server_addr.sin_addr), sizeof(struct in_addr)) != 0
|| addr.sin_port != dosbox_server_addr.sin_port)
{
/* Ignore packet from wrong address. */
return true;
}
if(dosbox_state == DOSBOX_REGISTERING)
{
_handle_dosbox_registration_response((novell_ipx_packet*)(buf), len);
@ -691,7 +694,7 @@ static void _send_dosbox_registration_request(void)
memset(reg_pkt.src_node, 0, sizeof(reg_pkt.src_node));
reg_pkt.src_socket = htons(IPX_SOCK_ECHO);
if(send(private_socket, (const void*)(&reg_pkt), sizeof(reg_pkt), 0) < 0)
if(sendto(private_socket, (const void*)(&reg_pkt), sizeof(reg_pkt), 0, (struct sockaddr*)(&dosbox_server_addr), sizeof(dosbox_server_addr)) < 0)
{
log_printf(LOG_ERROR, "Error sending DOSBox IPX registration request: %s", w32_error(WSAGetLastError()));
}

View File

@ -26,6 +26,8 @@
extern SOCKET shared_socket;
extern SOCKET private_socket;
extern struct sockaddr_in dosbox_server_addr;
void router_init(void);
void router_cleanup(void);

View File

@ -1351,7 +1351,7 @@ static DWORD ipx_send_packet(
DWORD error = ERROR_SUCCESS;
if(r_send(private_socket, (const void*)(packet), packet_size, 0) < 0)
if(r_sendto(private_socket, (const void*)(packet), packet_size, 0, (struct sockaddr*)(&dosbox_server_addr), sizeof(dosbox_server_addr)) < 0)
{
error = WSAGetLastError();
log_printf(LOG_ERROR, "Error sending DOSBox IPX packet: %s", w32_error(error));