From 5760f9042df34e1507e5b43dc4202d0828947abf Mon Sep 17 00:00:00 2001
From: Martine Lenders <mail@martine-lenders.eu>
Date: Tue, 9 Jun 2015 23:32:54 +0200
Subject: [PATCH] native: unify and simplify usage of tapsetup script

---
 cpu/native/tapsetup-freebsd.sh |  54 --------
 cpu/native/tapsetup-osx.sh     |  47 -------
 cpu/native/tapsetup.sh         |  58 ---------
 dist/tools/tapsetup/tapsetup   | 220 +++++++++++++++++++++++++++++++++
 4 files changed, 220 insertions(+), 159 deletions(-)
 delete mode 100755 cpu/native/tapsetup-freebsd.sh
 delete mode 100755 cpu/native/tapsetup-osx.sh
 delete mode 100755 cpu/native/tapsetup.sh
 create mode 100755 dist/tools/tapsetup/tapsetup

diff --git a/cpu/native/tapsetup-freebsd.sh b/cpu/native/tapsetup-freebsd.sh
deleted file mode 100755
index 9b4ab39f97..0000000000
--- a/cpu/native/tapsetup-freebsd.sh
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/bin/sh
-
-COMMAND=${1}
-COUNT=${2}
-
-DEFCOUNT="2"
-
-if [ -z "${USER}" ]; then
-    echo 'need to export $USER'
-    exit 1
-fi
-if [ -z "${COMMAND}" ]; then
-    echo "usage: $(basename $0) <create [count]|delete>"
-    exit 1
-fi
-
-if [ "${COMMAND}" = 'create' ]; then
-    if [ -z "${COUNT}" ]; then
-        COUNT="${DEFCOUNT}"
-    fi
-
-    # load kernel modules
-    sudo kldload if_tap
-    sudo kldload if_bridge
-
-    # set permissions
-    sudo sysctl net.link.tap.user_open=1
-
-    # create network
-    echo "creating ${BRNAME} ..."
-    sudo ifconfig bridge0 create
-    sudo ifconfig bridge0 up
-
-    for N in $(seq 0 "$((COUNT - 1))"); do
-        sudo ifconfig tap${N} create
-        sudo chown ${USER} /dev/tap${N}
-        sudo ifconfig tap${N} up
-        sudo ifconfig bridge0 addm tap${N}
-    done
-
-elif [ "${COMMAND}" = 'delete' ]; then
-    # reset permissions (devices already destroyed)
-    sudo sysctl net.link.tap.user_open=0
-
-    # unload kernel modules
-    sudo kldunload if_tap
-    sudo kldunload if_bridge
-
-else
-    echo 'unknown command'
-    exit 1
-fi
-
-exit 0
diff --git a/cpu/native/tapsetup-osx.sh b/cpu/native/tapsetup-osx.sh
deleted file mode 100755
index 36317f2ef9..0000000000
--- a/cpu/native/tapsetup-osx.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/sh
-
-COMMAND=${1}
-COUNT=${2}
-
-DEFCOUNT="2"
-DEFBRNAME="bridge1234"
-
-if [ -z "${USER}" ]; then
-    echo 'need to export $USER'
-    exit 1
-fi
-if [ -z "${COMMAND}" ]; then
-    echo "usage: $(basename $0) <create [count]|delete>"
-    exit 1
-fi
-
-if [ -z "${BRNAME}" ]; then
-    BRNAME="${DEFBRNAME}"
-fi
-
-if [ "${COMMAND}" = 'create' ]; then
-    if [ -z "${COUNT}" ]; then
-        COUNT="${DEFCOUNT}"
-    fi
-
-    sudo ifconfig ${BRNAME} create || exit 1
-    echo "upping ${BRNAME}"
-    sudo ifconfig ${BRNAME} up || exit 1
-
-    for N in $(seq 0 "$((COUNT - 1))"); do
-        sudo chown ${USER} /dev/tap${N} || exit 1
-        echo "start RIOT instance for tap${N} now and hit enter"
-        read
-        sudo ifconfig ${BRNAME} addm tap${N} || exit 1
-        sudo ifconfig tap${N} up
-    done
-
-elif [ "${COMMAND}" = 'delete' ]; then
-    sudo ifconfig ${BRNAME} destroy
-
-else
-    echo 'unknown command'
-    exit 1
-fi
-
-exit 0
diff --git a/cpu/native/tapsetup.sh b/cpu/native/tapsetup.sh
deleted file mode 100755
index 7a0e283f98..0000000000
--- a/cpu/native/tapsetup.sh
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/bin/sh
-
-COMMAND=${1}
-COUNT=${2}
-
-DEFCOUNT="2"
-DEFBRNAME="tapbr0"
-DEFTAPNAME="tap"
-
-if [ -z "${USER}" ]; then
-    echo 'need to export $USER'
-    exit 1
-fi
-if [ -z "${COMMAND}" ]; then
-    echo "usage: $(basename $0) <create [count]|delete>"
-    exit 1
-fi
-
-if [ -z "${BRNAME}" ]; then
-    BRNAME="${DEFBRNAME}"
-fi
-if [ -z "${TAPNAME}" ]; then
-    TAPNAME="${DEFTAPNAME}"
-fi
-
-if [ "${COMMAND}" = 'create' ]; then
-    if [ -z "${COUNT}" ]; then
-        COUNT="${DEFCOUNT}"
-    fi
-
-    echo "creating ${BRNAME} ..."
-    sudo brctl addbr ${BRNAME} || exit 1
-    sudo -s sh -c "echo 1  > /proc/sys/net/ipv6/conf/${BRNAME}/disable_ipv6" || exit 1
-    sudo ip link set ${BRNAME} up || exit 1
-
-    for N in $(seq 0 "$((COUNT - 1))"); do
-        echo "creating ${TAPNAME}${N} ..."
-        sudo ip tuntap add dev ${TAPNAME}${N} mode tap user ${USER} || exit 1
-        sudo -s sh -c "echo 1 > /proc/sys/net/ipv6/conf/${TAPNAME}${N}/disable_ipv6" || exit 1
-        sudo brctl addif ${BRNAME} ${TAPNAME}${N} || exit 1
-        sudo ip link set ${TAPNAME}${N} up || exit 1
-    done
-
-elif [ "${COMMAND}" = 'delete' ]; then
-    for IF in $(ls /sys/class/net/${BRNAME}/brif); do
-        echo "deleting ${IF} ..."
-        sudo ip link delete "${IF}"
-    done
-    echo "deleting ${BRNAME} ..."
-    sudo ip link set ${BRNAME} down
-    sudo brctl delbr ${BRNAME}
-
-else
-    echo 'unknown command'
-    exit 1
-fi
-
-exit 0
diff --git a/dist/tools/tapsetup/tapsetup b/dist/tools/tapsetup/tapsetup
new file mode 100755
index 0000000000..f9db01445c
--- /dev/null
+++ b/dist/tools/tapsetup/tapsetup
@@ -0,0 +1,220 @@
+#!/bin/sh
+
+PROGRAM=$(basename $0)
+COUNT="2"
+COMMAND=""
+BRNAME="tapbr0"
+TAPNAME="tap"
+DEACTIVATE_IPV6=""
+
+usage() {
+    echo "usage: ${PROGRAM} [arguments]" >&2
+    echo "" >&2
+    echo "Defaults:"
+    echo "   If no option is given, -c is assumed" >&2
+    echo "" >&2
+    echo "Options:" >&2
+    echo "   -c [<num>], --create [<num>]: Create <num> tap interfaces (default: 2)" >&2
+    echo "   -d, --delete:                 Delete all interface" >&2
+    echo "   -b <name>, --bridge <name>:   Give name for the bridge (default: tapbr)" >&2
+    echo "   -t <name>, --tap <name>:      Name base for the tap interfaces; the" >&2
+    echo "                                 generated names will be <name>x" >&2
+    echo "                                 (default: tap; ignored on OSX and FreeBSD)" >&2
+    echo "   -6, --deactivate-ipv6:        Deactivate IPv6 for the interfaces and bridge" >&2
+    echo "                                 (ignored on OSX and FreeBSD)" >&2
+    echo "   -h, --help:                   Prints this text" >&2
+}
+
+unsupported_plattform() {
+    echo "unsupported platform" >&2
+    echo "(currently supported \`uname -s\` 'Darvin', 'FreeBSD', and 'Linux')" >&2
+}
+
+create_bridge() {
+    echo "creating ${BRNAME}"
+
+    case "${PLATFORM}" in
+        FreeBSD)
+            sudo kldload if_bridge
+            sudo ifconfig ${BRNAME} create || exit 1 ;;
+        Linux)
+            sudo ip link add name ${BRNAME} type bridge || exit 1
+            if [ -n "${DEACTIVATE_IPV6}" ]; then
+                sudo -s sh -c "echo 1  > /proc/sys/net/ipv6/conf/${BRNAME}/disable_ipv6" || exit 1
+            fi ;;
+        OSX)
+            sudo ifconfig ${BRNAME} create || exit 1 ;;
+        *)
+            ;;
+    esac
+}
+
+up_bridge() {
+    case "${PLATFORM}" in
+        FreeBSD|OSX)
+            sudo ifconfig ${BRNAME} up || exit 1 ;;
+        Linux)
+            sudo ip link set ${BRNAME} up || exit 1 ;;
+        *)
+            ;;
+    esac
+}
+
+delete_bridge() {
+    echo "deleting ${BRNAME}"
+
+    case "${PLATFORM}" in
+        FreeBSD)
+            sudo sysctl net.link.tap.user_open=0
+            sudo kldunload if_tap || exit 1
+            sudo kldunload if_bridge || exit 1 ;;
+        Linux)
+            for IF in $(ls /sys/class/net/${BRNAME}/brif); do
+                sudo ip link delete "${IF}"
+            done
+
+            sudo ip link delete ${BRNAME} || exit 1 ;;
+        OSX)
+            sudo ifconfig ${BRNAME} destroy || exit 1 ;;
+        *)
+            ;;
+    esac
+}
+
+begin_tap() {
+    case "${PLATFORM}" in
+        FreeBSD)
+            sudo kldload if_tap || exit 1
+            sudo sysctl net.link.tap.user_open=1 ;;
+        *)
+            ;;
+    esac
+}
+
+create_tap() {
+    case "${PLATFORM}" in
+        FreeBSD)
+            echo "creating ${TAPNAME}${N}" || exit 1
+            sudo ifconfig tap${N} create || exit 1
+            sudo chown ${USER} /dev/tap${N} || exit 1
+            sudo ifconfig ${BRNAME} addm tap${N} || exit 1
+            sudo ifconfig tap${N} up || exit 1 ;;
+        Linux)
+            echo "creating ${TAPNAME}${N}"
+            sudo ip tuntap add dev ${TAPNAME}${N} mode tap user ${USER} || exit 1
+            if [ -n "${DEACTIVATE_IPV6}" ]; then
+                sudo -s sh -c "echo 1  > /proc/sys/net/ipv6/conf/${TAPNAME}${N}/disable_ipv6" || exit 1
+            fi
+            sudo ip link set dev ${TAPNAME}${N} master ${BRNAME} || exit 1
+            sudo ip link set ${TAPNAME}${N} up || exit 1 ;;
+        OSX)
+            sudo chown ${USER} /dev/tap${N} || exit 1
+            echo "start RIOT instance for tap${N} now and hit enter"
+            read
+            sudo ifconfig ${BRNAME} addm tap${N} || exit 1
+            sudo ifconfig tap${N} up || exit 1 ;;
+        *)
+            ;;
+    esac
+}
+
+while true ; do
+    case "$1" in
+        -6)
+            DEACTIVATE_IPV6=1
+            shift ;;
+        -b|--bridge)
+            case "$2" in
+                "")
+                    usage
+                    exit 2 ;;
+                *)
+                    BRNAME="$2"
+                    shift 2 ;;
+            esac ;;
+        -c|--create)
+            if [ -n "${COMMAND}" ]; then
+                usage
+                exit 2
+            fi
+            COMMAND="create"
+            case "$2" in
+                "")
+                    shift ;;
+                *[!0-9]*)
+                    usage
+                    exit 2;;
+                *)
+                    COUNT="$2"
+                    shift 2 ;;
+            esac ;;
+        -d|--delete)
+            if [ -n "${COMMAND}" ]; then
+                usage
+                exit 2
+            fi
+            COMMAND="delete"
+            shift ;;
+        -h|--help)
+            usage
+            exit ;;
+        -t|--tap)
+            case "$2" in
+                "")
+                    usage
+                    exit 2 ;;
+                *)
+                    TAPNAME="$2"
+                    shift 2 ;;
+            esac ;;
+        "")
+            break ;;
+        *)  usage
+            exit 2 ;;
+    esac
+done
+
+if [ -z "${USER}" ]; then
+    echo 'need to export $USER'
+    exit 1
+fi
+if [ -z "${COMMAND}" ]; then
+    COMMAND="create"
+fi
+case "$(uname -s)" in
+    Darwin)
+        PLATFORM="OSX"
+        if echo "$BRNAME" | grep -v -q "^bridge"; then
+            BRNAME=bridge0
+        fi ;;
+    FreeBSD)
+        PLATFORM="FreeBSD"
+        if echo "$BRNAME" | grep -v -q "^bridge"; then
+            BRNAME=bridge0
+        fi ;;
+    Linux)
+        PLATFORM="Linux" ;;
+    *)
+        unsupported_plattform
+        exit 1 ;;
+esac
+
+if [ "${COMMAND}" = 'create' ]; then
+    create_bridge || exit 1
+
+    begin_tap || exit 1
+
+    for N in $(seq 0 "$((COUNT - 1))"); do
+        create_tap || exit 1
+    done
+
+    up_bridge || exit 1
+
+elif [ "${COMMAND}" = 'delete' ]; then
+    delete_bridge
+else
+    echo 'unknown command'
+    exit 1
+fi
+
+exit 0
-- 
GitLab