Change SLiRP port forwarding config syntax to make more sense

This commit is contained in:
RichardG867
2020-10-17 00:42:41 -03:00
parent 02ca6493e5
commit 239730a793

View File

@@ -36,8 +36,8 @@
#include <86box/config.h> #include <86box/config.h>
/* SLiRP can use poll() or select() for socket polling. While poll() is /* SLiRP can use poll() or select() for socket polling.
better, it's slow and limited on Windows, so use select() there. */ poll() is best on *nix but slow and limited on Windows. */
#ifndef _WIN32 #ifndef _WIN32
# define SLIRP_USE_POLL 1 # define SLIRP_USE_POLL 1
#endif #endif
@@ -93,7 +93,7 @@ slirp_log(const char *fmt, ...)
static void static void
net_slirp_guest_error(const char *msg, void *opaque) net_slirp_guest_error(const char *msg, void *opaque)
{ {
slirp_log("SLiRP: guest_error: %s\n", msg); slirp_log("SLiRP: guest_error(): %s\n", msg);
} }
@@ -156,7 +156,7 @@ net_slirp_send_packet(const void *qp, size_t pkt_len, void *opaque)
slirp_t *slirp = (slirp_t *) opaque; slirp_t *slirp = (slirp_t *) opaque;
uint8_t *mac = slirp->mac; uint8_t *mac = slirp->mac;
uint32_t mac_cmp32[2]; uint32_t mac_cmp32[2];
uint16_t mac_cmp16[2]; uint16_t mac_cmp16[2];
if (!(slirp->card->set_link_state && slirp->card->set_link_state(slirp->card->priv)) && !(slirp->card->wait && slirp->card->wait(slirp->card->priv))) { if (!(slirp->card->set_link_state && slirp->card->set_link_state(slirp->card->priv)) && !(slirp->card->wait && slirp->card->wait(slirp->card->priv))) {
slirp_log("SLiRP: received %d-byte packet\n", pkt_len); slirp_log("SLiRP: received %d-byte packet\n", pkt_len);
@@ -252,7 +252,7 @@ net_slirp_get_revents(int idx, void *opaque)
static void static void
slirp_tic(slirp_t *slirp) slirp_tic(slirp_t *slirp)
{ {
int ret2; int ret;
uint32_t tmo; uint32_t tmo;
/* Let SLiRP create a list of all open sockets. */ /* Let SLiRP create a list of all open sockets. */
@@ -269,7 +269,7 @@ slirp_tic(slirp_t *slirp)
/* Now wait for something to happen, or at most 'tmo' usec. */ /* Now wait for something to happen, or at most 'tmo' usec. */
#ifdef SLIRP_USE_POLL #ifdef SLIRP_USE_POLL
ret2 = poll(slirp->pfd, slirp->pfd_len, tmo); ret = poll(slirp->pfd, slirp->pfd_len, tmo);
#else #else
if (tmo < 0) if (tmo < 0)
tmo = 500; tmo = 500;
@@ -278,11 +278,11 @@ slirp_tic(slirp_t *slirp)
tv.tv_sec = 0; tv.tv_sec = 0;
tv.tv_usec = tmo; tv.tv_usec = tmo;
ret2 = select(slirp->nfds + 1, &slirp->rfds, &slirp->wfds, &slirp->xfds, &tv); ret = select(slirp->nfds + 1, &slirp->rfds, &slirp->wfds, &slirp->xfds, &tv);
#endif #endif
/* If something happened, let SLiRP handle it. */ /* If something happened, let SLiRP handle it. */
slirp_pollfds_poll(slirp->slirp, (ret2 <= 0), net_slirp_get_revents, slirp); slirp_pollfds_poll(slirp->slirp, (ret <= 0), net_slirp_get_revents, slirp);
} }
@@ -316,7 +316,7 @@ poll_thread(void *arg)
struct in_addr dhcp = { .s_addr = htonl(0x0a00020f) }; /* 10.0.2.15 */ struct in_addr dhcp = { .s_addr = htonl(0x0a00020f) }; /* 10.0.2.15 */
struct in_addr dns = { .s_addr = htonl(0x0a000203) }; /* 10.0.2.3 */ struct in_addr dns = { .s_addr = htonl(0x0a000203) }; /* 10.0.2.3 */
struct in_addr bind = { .s_addr = htonl(0x00000000) }; /* 0.0.0.0 */ struct in_addr bind = { .s_addr = htonl(0x00000000) }; /* 0.0.0.0 */
struct in6_addr ipv6dummy; /* contents don't matter; we're not doing IPv6 */ struct in6_addr ipv6dummy; /* contents don't matter; we're not using IPv6 */
/* Initialize SLiRP. */ /* Initialize SLiRP. */
slirp->slirp = slirp_init(0, 1, net, mask, host, 0, ipv6dummy, 0, ipv6dummy, NULL, NULL, NULL, NULL, dhcp, dns, ipv6dummy, NULL, NULL, &slirp_cb, arg); slirp->slirp = slirp_init(0, 1, net, mask, host, 0, ipv6dummy, 0, ipv6dummy, NULL, NULL, NULL, NULL, dhcp, dns, ipv6dummy, NULL, NULL, &slirp_cb, arg);
@@ -326,23 +326,27 @@ poll_thread(void *arg)
} }
/* Set up port forwarding. */ /* Set up port forwarding. */
int udp, from, to, i = 0; int udp, external, internal, i = 0;
char *category = "SLiRP Port Forwarding"; char *category = "SLiRP Port Forwarding";
char key[16]; char key[20];
while (1) { while (1) {
sprintf(key, "%d_udp", i); sprintf(key, "%d_protocol", i);
udp = config_get_int(category, key, 0); udp = strncmp(config_get_string(category, key, "tcp"), "udp", -1) == 0;
sprintf(key, "%d_from", i); sprintf(key, "%d_external", i);
from = config_get_int(category, key, 0); external = config_get_int(category, key, 0);
if (from < 1) sprintf(key, "%d_internal", i);
internal = config_get_int(category, key, 0);
if ((external <= 0) && (internal <= 0))
break; break;
sprintf(key, "%d_to", i); else if (internal <= 0)
to = config_get_int(category, key, from); internal = external;
else if (external <= 0)
external = internal;
if (slirp_add_hostfwd(slirp->slirp, udp, bind, from, dhcp, to) == 0) if (slirp_add_hostfwd(slirp->slirp, udp, bind, external, dhcp, internal) == 0)
pclog("SLiRP: Forwarded %s port host:%d to guest:%d\n", udp ? "UDP" : "TCP", from, to); pclog("SLiRP: Forwarded %s port external:%d to internal:%d\n", udp ? "UDP" : "TCP", external, internal);
else else
pclog("SLiRP: Failed to forward %s port host:%d to guest:%d\n", udp ? "UDP" : "TCP", from, to); pclog("SLiRP: Failed to forward %s port external:%d to internal:%d\n", udp ? "UDP" : "TCP", external, internal);
i++; i++;
} }