@@ -50,12 +50,6 @@ if ! [ $COUNT -ge 0 ]; then
exit 1
fi
-TUNCTL=$STAGING_BINDIR_NATIVE/tunctl
-if [[ ! -x "$TUNCTL" || -d "$TUNCTL" ]]; then
- echo "Error: $TUNCTL is not an executable"
- usage
-fi
-
if [ $EUID -ne 0 ]; then
echo "Error: This script must be run with root privileges"
exit
@@ -68,15 +62,29 @@ if [ ! -x "$RUNQEMU_IFUP" ]; then
exit 1
fi
-if ! interfaces=`ip link` 2>/dev/null; then
+TUNCTL=$STAGING_BINDIR_NATIVE/tunctl
+ip_supports_tuntap=false
+if interfaces=`ip tuntap list` 2>/dev/null; then
+ ip_supports_tuntap=true
+ interfaces=`echo "$interfaces |cut -f1 -d:`
+elif [[ ! -x "$TUNCTL" || -d "$TUNCTL" ]]; then
+ echo "Error: $TUNCTL is not an executable"
+ usage
+elif interfaces=`ip link` 2>/dev/null; then
+ interfaces=`echo "$interfaces" | sed '/^[0-9]\+: \(docker[0-9]\+\):.*/!d; s//\1/'`
+else
echo "Failed to call 'ip link'" >&2
exit 1
fi
# Ensure we start with a clean slate
-for tap in `echo "$interfaces" | sed '/^[0-9]\+: \(docker[0-9]\+\):.*/!d; s//\1/'`; do
+for tap in $interfaces; do
echo "Note: Destroying pre-existing tap interface $tap..."
- $TUNCTL -d $tap
+ if $ip_supports_tuntap; then
+ ip tuntap del $tap mode tap
+ else
+ $TUNCTL -d $tap
+ fi
done
rm -f /etc/runqemu-nosudo
@@ -33,13 +33,15 @@ fi
TAP=$1
STAGING_BINDIR_NATIVE=$2
-TUNCTL=$STAGING_BINDIR_NATIVE/tunctl
-if [ ! -e "$TUNCTL" ]; then
- echo "Error: Unable to find tunctl binary in '$STAGING_BINDIR_NATIVE', please bitbake qemu-helper-native"
- exit 1
-fi
+if !ip tuntap del $TAP mode tap 2>/dev/null; then
+ TUNCTL=$STAGING_BINDIR_NATIVE/tunctl
+ if [ ! -e "$TUNCTL" ]; then
+ echo "Error: Unable to find tunctl binary in '$STAGING_BINDIR_NATIVE', please bitbake qemu-helper-native"
+ exit 1
+ fi
-$TUNCTL -d $TAP
+ $TUNCTL -d $TAP
+fi
IFCONFIG=`which ip 2> /dev/null`
if [ "x$IFCONFIG" = "x" ]; then
@@ -41,22 +41,29 @@ USERID="-u $1"
GROUP="-g $2"
STAGING_BINDIR_NATIVE=$3
-TUNCTL=$STAGING_BINDIR_NATIVE/tunctl
-if [ ! -x "$TUNCTL" ]; then
- echo "Error: Unable to find tunctl binary in '$STAGING_BINDIR_NATIVE', please bitbake qemu-helper-native"
- exit 1
+if taps=$(ip tuntap list 2>/dev/null); then
+ tap_no=$(( $(echo "$taps" |sort -r |sed 's/^tap//; s/:.*//; q') + 1 ))
+ ip tuntap add tap$tap_no mode tap group $2 && TAP=tap$tap_no
fi
-TAP=`$TUNCTL -b $GROUP 2>&1`
-STATUS=$?
-if [ $STATUS -ne 0 ]; then
-# If tunctl -g fails, try using tunctl -u, for older host kernels
-# which do not support the TUNSETGROUP ioctl
- TAP=`$TUNCTL -b $USERID 2>&1`
+if [ -z $TAP ]; then
+ TUNCTL=$STAGING_BINDIR_NATIVE/tunctl
+ if [ ! -x "$TUNCTL" ]; then
+ echo "Error: Unable to find tunctl binary in '$STAGING_BINDIR_NATIVE', please bitbake qemu-helper-native"
+ exit 1
+ fi
+
+ TAP=`$TUNCTL -b $GROUP 2>&1`
STATUS=$?
if [ $STATUS -ne 0 ]; then
- echo "tunctl failed:"
- exit 1
+ # If tunctl -g fails, try using tunctl -u, for older host kernels
+ # which do not support the TUNSETGROUP ioctl
+ TAP=`$TUNCTL -b $USERID 2>&1`
+ STATUS=$?
+ if [ $STATUS -ne 0 ]; then
+ echo "tunctl failed:"
+ exit 1
+ fi
fi
fi
The *ip* command supports the creation and destruction of TAP devices since 2009 and might be more likely installed on systems then *tunctl*. Therefore it should be tried to setup or teardown the TAP interface with *ip* before falling back to *tunctl*. https://git.kernel.org/pub/scm/network/iproute2/iproute2.git/commit/?id=580fbd88f75cc9eea0d28a48c025b090eb9419a7 Signed-off-by: Jörg Sommer <joerg.sommer@navimatix.de> --- scripts/runqemu-gen-tapdevs | 26 +++++++++++++++++--------- scripts/runqemu-ifdown | 14 ++++++++------ scripts/runqemu-ifup | 31 +++++++++++++++++++------------ 3 files changed, 44 insertions(+), 27 deletions(-)