From 1a77713cb195d95b80e3670008ee9580fa8ef49f Mon Sep 17 00:00:00 2001 From: Henri Manson Date: Tue, 10 Mar 2015 12:16:02 +0100 Subject: [PATCH 1/3] temporarily disable forking causing basiliskii to hang --- BasiliskII/src/Unix/main_unix.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BasiliskII/src/Unix/main_unix.cpp b/BasiliskII/src/Unix/main_unix.cpp index 3505335e8..ba36a4681 100644 --- a/BasiliskII/src/Unix/main_unix.cpp +++ b/BasiliskII/src/Unix/main_unix.cpp @@ -489,7 +489,7 @@ int main(int argc, char **argv) #if defined(ENABLE_XF86_DGA) && !defined(ENABLE_MON) // Fork out, so we can return from fullscreen mode when things get ugly - XF86DGAForkApp(DefaultScreen(x_display)); +// XF86DGAForkApp(DefaultScreen(x_display)); #endif #endif From 8f7b5de524b8291f6494bcbcc660d4b756fbec69 Mon Sep 17 00:00:00 2001 From: Henri Manson Date: Thu, 12 Mar 2015 00:11:04 +0100 Subject: [PATCH 2/3] SheepShaver ditto --- SheepShaver/src/Unix/main_unix.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SheepShaver/src/Unix/main_unix.cpp b/SheepShaver/src/Unix/main_unix.cpp index 3d0ee43ec..c91055979 100644 --- a/SheepShaver/src/Unix/main_unix.cpp +++ b/SheepShaver/src/Unix/main_unix.cpp @@ -815,7 +815,7 @@ int main(int argc, char **argv) #if defined(ENABLE_XF86_DGA) && !defined(ENABLE_MON) // Fork out, so we can return from fullscreen mode when things get ugly - XF86DGAForkApp(DefaultScreen(x_display)); + //XF86DGAForkApp(DefaultScreen(x_display)); #endif #endif From f7eaa77be204bf1a6976a6f34f2c320f3698e143 Mon Sep 17 00:00:00 2001 From: Henri Manson Date: Thu, 12 Mar 2015 13:01:32 +0100 Subject: [PATCH 3/3] tap interface update for modern linux using 'ip tuntap' --- BasiliskII/src/Unix/configure.ac | 1 + BasiliskII/src/Unix/ether_unix.cpp | 50 ++++++++++++++++-------------- BasiliskII/src/Unix/tunconfig | 34 +++++++++++--------- 3 files changed, 47 insertions(+), 38 deletions(-) diff --git a/BasiliskII/src/Unix/configure.ac b/BasiliskII/src/Unix/configure.ac index 32be2e271..e70e111c3 100644 --- a/BasiliskII/src/Unix/configure.ac +++ b/BasiliskII/src/Unix/configure.ac @@ -825,6 +825,7 @@ dnl Check that the host supports TUN/TAP devices AC_CACHE_CHECK([whether TUN/TAP is supported], ac_cv_tun_tap_support, [ AC_TRY_COMPILE([ + #include #if defined(HAVE_LINUX_IF_H) && defined(HAVE_LINUX_IF_TUN_H) #include #include diff --git a/BasiliskII/src/Unix/ether_unix.cpp b/BasiliskII/src/Unix/ether_unix.cpp index 526ee29ca..e34170375 100644 --- a/BasiliskII/src/Unix/ether_unix.cpp +++ b/BasiliskII/src/Unix/ether_unix.cpp @@ -240,11 +240,12 @@ bool ether_init(void) // Determine Ethernet device type net_if_type = -1; - if (strncmp(name, "tap", 3) == 0) - net_if_type = NET_IF_ETHERTAP; #if ENABLE_TUNTAP - else if (strcmp(name, "tun") == 0) + if (strncmp(name, "tap", 3) == 0) net_if_type = NET_IF_TUNTAP; +#else + if (strncmp(name, "tap", 3) == 0) + net_if_type = NET_IF_ETHERTAP; #endif #ifdef HAVE_SLIRP else if (strcmp(name, "slirp") == 0) @@ -291,12 +292,15 @@ bool ether_init(void) // Open sheep_net or ethertap or TUN/TAP device char dev_name[16]; switch (net_if_type) { - case NET_IF_ETHERTAP: - sprintf(dev_name, "/dev/%s", name); - break; +#if ENABLE_TUNTAP case NET_IF_TUNTAP: strcpy(dev_name, "/dev/net/tun"); break; +#else + case NET_IF_ETHERTAP: + sprintf(dev_name, "/dev/%s", name); + break; +#endif case NET_IF_SHEEPNET: strcpy(dev_name, "/dev/sheep_net"); break; @@ -314,14 +318,6 @@ bool ether_init(void) // Open TUN/TAP interface if (net_if_type == NET_IF_TUNTAP) { struct ifreq ifr; - memset(&ifr, 0, sizeof(ifr)); - ifr.ifr_flags = IFF_TAP | IFF_NO_PI; - strcpy(ifr.ifr_name, "tun%d"); - if (ioctl(fd, TUNSETIFF, (void *) &ifr) != 0) { - sprintf(str, GetString(STR_SHEEP_NET_ATTACH_WARN), strerror(errno)); - WarningAlert(str); - goto open_error; - } // Get network config script file path net_if_script = PrefsFindString("etherconfig"); @@ -334,12 +330,20 @@ bool ether_init(void) WarningAlert(str); goto open_error; } - net_if_name = strdup(ifr.ifr_name); + net_if_name = strdup(name); if (!execute_network_script("up")) { sprintf(str, GetString(STR_TUN_TAP_CONFIG_WARN), "script execute error"); WarningAlert(str); goto open_error; } + memset(&ifr, 0, sizeof(ifr)); + ifr.ifr_flags = IFF_TAP | IFF_NO_PI; + strcpy(ifr.ifr_name, name); + if (ioctl(fd, TUNSETIFF, (void *) &ifr) != 0) { + sprintf(str, GetString(STR_SHEEP_NET_ATTACH_WARN), strerror(errno)); + WarningAlert(str); + goto open_error; + } D(bug("Connected to host network interface: %s\n", net_if_name)); } #endif @@ -431,14 +435,6 @@ void ether_exit(void) // Stop reception threads stop_thread(); - // Shut down TUN/TAP interface - if (net_if_type == NET_IF_TUNTAP) - execute_network_script("down"); - - // Free TUN/TAP device name - if (net_if_name) - free(net_if_name); - // Close sheep_net device if (fd > 0) close(fd); @@ -453,6 +449,14 @@ void ether_exit(void) if (slirp_output_fd > 0) close(slirp_output_fd); + // Shut down TUN/TAP interface + if (net_if_type == NET_IF_TUNTAP) + execute_network_script("down"); + + // Free TUN/TAP device name + if (net_if_name) + free(net_if_name); + #if STATISTICS // Show statistics printf("%ld messages put on write queue\n", num_wput); diff --git a/BasiliskII/src/Unix/tunconfig b/BasiliskII/src/Unix/tunconfig index c2ec8fb32..7aa0ab4a9 100755 --- a/BasiliskII/src/Unix/tunconfig +++ b/BasiliskII/src/Unix/tunconfig @@ -1,4 +1,5 @@ #!/bin/bash + ########################################################################### # Configuration of the tunN devices for usage with Basilisk II. # (derived MOL tunconfig script) @@ -18,7 +19,7 @@ ########################################################################### SUDO=/usr/bin/sudo -IFCONFIG=/sbin/ifconfig +IP=/sbin/ip IPTABLES=/sbin/iptables ######################################################### @@ -28,13 +29,14 @@ IPTABLES=/sbin/iptables shift 1 } -TUN_DEV=$1 +TAP_DEV=$1 ACTION=$2 -TUN_NUM=`echo $TUN_DEV | sed s/[^0-9]//g` -NET_NUM=`expr 40 + $TUN_NUM` -TUN_NET=172.20.$NET_NUM.0/24 -TUN_HOST=172.20.$NET_NUM.1 +TAP_NUM=`echo $TAP_DEV | sed s/[^0-9]//g` +NET_NUM=`expr 40 + $TAP_NUM` +TAP_NET=172.20.$NET_NUM.0/24 +TAP_HOST=172.20.$NET_NUM.1/24 +USER_ID=`id -u` ######################################################### # Misc Checks @@ -45,7 +47,7 @@ TUN_HOST=172.20.$NET_NUM.1 exit 2 } -[[ "`id -u`" = "0" ]] && { +[[ "$USER_ID" = "0" ]] && { echo "---> $SUDO not necessary." 1>&2 SUDO="" } @@ -56,15 +58,15 @@ TUN_HOST=172.20.$NET_NUM.1 } if [ -n "$SUDO" ]; then - $SUDO -l | grep -q "NOPASSWD: $IFCONFIG" || { - echo "---> Missing sudo NOPASSWD: $IFCONFIG." 1>&2 + $SUDO -l | grep -q "NOPASSWD: $IP" || { + echo "---> Missing sudo NOPASSWD: $IP." 1>&2 exit 1 } $SUDO -l | grep -q "NOPASSWD: $IPTABLES" || { echo "---> Missing sudo NOPASSWD: $IPTABLES." 1>&2 exit 1 } - IFCONFIG="$SUDO $IFCONFIG" + IP="$SUDO $IP" IPTABLES="$SUDO $IPTABLES" fi @@ -77,7 +79,7 @@ $IPTABLES -L -n -t nat > /dev/null || exit 1 ######################################################### { - $IPTABLES -t nat -D POSTROUTING -s $TUN_NET -d ! $TUN_NET -j MASQUERADE + $IPTABLES -t nat -D POSTROUTING -s $TAP_NET ! -d $TAP_NET -j MASQUERADE } >& /dev/null ######################################################### @@ -85,7 +87,7 @@ $IPTABLES -L -n -t nat > /dev/null || exit 1 ######################################################### [[ "$ACTION" = down ]] && { - $IFCONFIG $TUN_DEV down + $IP tuntap del $TAP_DEV mode tap } ######################################################### @@ -93,10 +95,12 @@ $IPTABLES -L -n -t nat > /dev/null || exit 1 ######################################################### [[ "$ACTION" = up ]] && { - $IFCONFIG $TUN_DEV $TUN_HOST - + $IP tuntap add $TAP_DEV mode tap user $USER_ID + $IP addr add $TAP_HOST dev $TAP_DEV + $IP link set $TAP_DEV up # masquerade the tun network - $IPTABLES -t nat -A POSTROUTING -s $TUN_NET -d ! $TUN_NET -j MASQUERADE + $IPTABLES -t nat -A POSTROUTING -s $TAP_NET ! -d $TAP_NET -j MASQUERADE } exit 0 +