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

Removed bcast_all, src_filter and iface_mode options. The former two are now

implemented by the wildcard interface.
This commit is contained in:
Daniel Collins 2012-11-10 22:24:47 +00:00
parent 6c1ab421da
commit 1f77b0f90e
4 changed files with 67 additions and 124 deletions

View File

@ -30,14 +30,10 @@ main_config_t get_main_config(void)
config.udp_port = DEFAULT_PORT;
config.router_port = DEFAULT_ROUTER_PORT;
config.w95_bug = true;
config.bcast_all = false;
config.src_filter = true;
HKEY reg = reg_open_main(false);
DWORD version = reg_get_dword(reg, "config_version", 1);
config.iface_mode = reg_get_dword(reg, "iface_mode", IFACE_MODE_ALL);
if(version == 1)
{
struct v1_global_config reg_config;
@ -46,8 +42,6 @@ main_config_t get_main_config(void)
{
config.udp_port = reg_config.udp_port;
config.w95_bug = reg_config.w95_bug;
config.bcast_all = reg_config.bcast_all;
config.src_filter = reg_config.filter;
}
config.router_port = reg_get_dword(reg, "control_port", config.router_port);
@ -59,8 +53,6 @@ main_config_t get_main_config(void)
config.udp_port = reg_get_dword(reg, "port", config.udp_port);
config.router_port = reg_get_dword(reg, "router_port", config.router_port);
config.w95_bug = reg_get_dword(reg, "w95_bug", config.w95_bug);
config.bcast_all = reg_get_dword(reg, "bcast_all", config.bcast_all);
config.src_filter = reg_get_dword(reg, "src_filter", config.src_filter);
config.log_level = reg_get_dword(reg, "log_level", LOG_INFO);
}
@ -74,13 +66,9 @@ bool set_main_config(const main_config_t *config)
{
HKEY reg = reg_open_main(true);
bool ok = reg_set_dword(reg, "iface_mode", config->iface_mode)
&& reg_set_dword(reg, "port", config->udp_port)
bool ok = reg_set_dword(reg, "port", config->udp_port)
&& reg_set_dword(reg, "router_port", config->router_port)
&& reg_set_dword(reg, "w95_bug", config->w95_bug)
&& reg_set_dword(reg, "bcast_all", config->bcast_all)
&& reg_set_dword(reg, "src_filter", config->src_filter)
&& reg_set_dword(reg, "log_level", config->log_level)

View File

@ -21,26 +21,6 @@
#define DEFAULT_PORT 54792
#define DEFAULT_ROUTER_PORT 54793
/* IFACE_MODE_ALL
*
* Packets are sent/received on all interfaces and no source address filtering
* is performed. A single IPX interface is presented.
*
* IFACE_MODE_SINGLE
*
* Packets are sent/received on user-chosen interfaces. A single IPX interface
* is presented.
*
* IFACE_MODE_MULTI
*
* An IPX interface is presented for each (enabled) real interface and packets
* are sent or received on the single underlying interface of the IPX one.
*/
#define IFACE_MODE_ALL 1
#define IFACE_MODE_SINGLE 2
#define IFACE_MODE_MULTI 3
#include "common.h"
#ifdef __cplusplus
@ -52,12 +32,8 @@ typedef struct main_config {
uint16_t router_port;
bool w95_bug;
bool bcast_all;
bool src_filter;
enum ipx_log_level log_level;
int iface_mode;
} main_config_t;
struct v1_global_config {

View File

@ -304,51 +304,48 @@ DWORD router_main(void *arg) {
addr32_t ra_net = addr32_in(ra->addr.sa_netnum);
addr48_t ra_node = addr48_in(ra->addr.sa_nodenum);
/* Check source address */
/* Fetch the interface this socket is bound to. */
if(main_config.iface_mode != IFACE_MODE_ALL)
ipx_interface_t *iface = ipx_interface_by_addr(ra_net, ra_node);
if(!iface)
{
/* Fetch the interface this socket is bound to. */
char net_s[ADDR32_STRING_SIZE], node_s[ADDR48_STRING_SIZE];
ipx_interface_t *iface = ipx_interface_by_addr(ra_net, ra_node);
addr32_string(net_s, ra_net);
addr48_string(node_s, ra_node);
if(!iface)
log_printf(LOG_WARNING, "No iface for %s/%s! Stale bind?", net_s, node_s);
continue;
}
/* Iterate over the subnets and compare to the
* packet source IP address.
*/
ipx_interface_ip_t *ip;
int source_ok = 0;
DL_FOREACH(iface->ipaddr, ip)
{
if((ip->ipaddr & ip->netmask) == (addr.sin_addr.s_addr & ip->netmask))
{
char net_s[ADDR32_STRING_SIZE], node_s[ADDR48_STRING_SIZE];
addr32_string(net_s, ra_net);
addr48_string(node_s, ra_node);
log_printf(LOG_WARNING, "No iface for %s/%s! Stale bind?", net_s, node_s);
continue;
source_ok = 1;
break;
}
/* Iterate over the subnets and compare
* to the packet source address.
}
free_ipx_interface(iface);
if(!source_ok)
{
/* Packet did not originate from an
* associated network.
*/
ipx_interface_ip_t *ip;
int source_ok = 0;
DL_FOREACH(iface->ipaddr, ip)
{
if((ip->ipaddr & ip->netmask) == (addr.sin_addr.s_addr & ip->netmask))
{
source_ok = 1;
break;
}
}
free_ipx_interface(iface);
if(!source_ok)
{
/* Source matching failed. */
continue;
}
continue;
}
log_printf(LOG_DEBUG, "Relaying packet to local port %hu", ntohs(ra->local_port));

View File

@ -724,7 +724,7 @@ static int send_packet(const ipx_packet *packet, int len, struct sockaddr *addr,
packet->dest_socket
);
log_printf(LOG_DEBUG, "Sending packet to %s (%s)", addr_s, inet_ntoa(v4->sin_addr));
log_printf(LOG_DEBUG, "Sending packet to %s (%s:%hu)", addr_s, inet_ntoa(v4->sin_addr), ntohs(v4->sin_port));
}
return (r_sendto(send_fd, (char*)packet, len, 0, addr, addrlen) == len);
@ -818,63 +818,45 @@ int WSAAPI sendto(SOCKET fd, const char *buf, int len, int flags, const struct s
else{
/* No cached address. Send using broadcast. */
struct sockaddr_in bcast;
ipx_interface_t *iface = ipx_interface_by_addr(
addr32_in(packet->src_net),
addr48_in(packet->src_node)
);
bcast.sin_family = AF_INET;
bcast.sin_port = htons(main_config.udp_port);
if(main_config.bcast_all)
if(iface && iface->ipaddr)
{
/* Broadcast on all interfaces. */
/* Iterate over all the IPs associated
* with this interface and return
* success if the packet makes it out
* through any of them.
*/
bcast.sin_addr.s_addr = htonl(INADDR_BROADCAST);
ipx_interface_ip_t* ip;
success = send_packet(
packet,
psize,
(struct sockaddr*)(&bcast),
sizeof(bcast)
);
DL_FOREACH(iface->ipaddr, ip)
{
struct sockaddr_in bcast;
bcast.sin_family = AF_INET;
bcast.sin_port = htons(main_config.udp_port);
bcast.sin_addr.s_addr = ip->bcast;
success |= send_packet(
packet,
psize,
(struct sockaddr*)(&bcast),
sizeof(bcast)
);
}
}
else{
/* Broadcast on associated interfaces. */
/* No IP addresses. */
ipx_interface_t *iface = ipx_interface_by_addr(
addr32_in(packet->src_net),
addr48_in(packet->src_node)
);
if(iface && iface->ipaddr)
{
/* Iterate over all the IPs associated
* with this interface and return
* success if the packet makes it out
* through any of them.
*/
ipx_interface_ip_t* ip;
DL_FOREACH(iface->ipaddr, ip)
{
bcast.sin_addr.s_addr = ip->bcast;
success |= send_packet(
packet,
psize,
(struct sockaddr*)(&bcast),
sizeof(bcast)
);
}
}
else{
/* No IP addresses. */
WSASetLastError(WSAENETDOWN);
success = 0;
}
free_ipx_interface(iface);
WSASetLastError(WSAENETDOWN);
success = 0;
}
free_ipx_interface(iface);
}
free(packet);