+#!/bin/sh
+################################################################################
+# test_LAN_triple-isolate__piece_of_cake.qos (Cero3 Shaper)
+#
+# Abstract:
+# This is a one band cake and ipv6 enabled shaping script for Ethernet
+# gateways. This exists for the purpose of testing cake's different isolation
+# options, specifically the non-directional triple-isolate feature that promises
+# to finally tackle the bit-torrent hole in simple.qos.
+# This specific version is supposed to be used on LAN interfaces:
+# the script's ingress direction equals the internet/WAN upload direction
+# the script's egress direction equals the internet/WAN download direction
+#
+# NOTE: Shaping on a LAN interface only affects machines connected via that
+# LAN interface, so typically WIFI/WLAN traffic will not be shaped!
+#
+################################################################################
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# Copyright (C) 2012-2016
+# Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
+#
+################################################################################
+
+. ${SQM_LIB_DIR}/defaults.sh
+
+################################################################################
+
+
+# this will only work with cake as qdisc...
+QDISC=cake
+
+
+# to keep this as simple as possible we ignore the *_CAKE_OPTS from defaults.sh
+INGRESS_CAKE_OPTS="besteffort triple-isolate"
+EGRESS_CAKE_OPTS="besteffort triple-isolate"
+
+
+egress() {
+ sqm_debug "egress"
+ $TC qdisc del dev $IFACE root 2>/dev/null
+ $TC qdisc add dev $IFACE root $( get_stab_string ) cake bandwidth ${UPLINK}kbit $( get_cake_lla_string ) ${EGRESS_CAKE_OPTS} ${EQDISC_OPTS}
+}
+
+
+ingress() {
+ sqm_debug "ingress"
+ $TC qdisc del dev $IFACE handle ffff: ingress 2>/dev/null
+ $TC qdisc add dev $IFACE handle ffff: ingress
+ $TC qdisc del dev $DEV root 2>/dev/null
+ $TC qdisc add dev $DEV root $( get_stab_string ) cake bandwidth ${DOWNLINK}kbit $( get_cake_lla_string ) ${INGRESS_CAKE_OPTS} ${IQDISC_OPTS}
+
+ $IP link set dev $DEV up
+
+ # redirect all IP packets arriving in $IFACE to ifb0
+
+ $TC filter add dev $IFACE parent ffff: protocol all prio 10 u32 \
+ match u32 0 0 flowid 1:1 action mirred egress redirect dev $DEV
+}
+
+sqm_start() {
+
+ #sm: flip upload and download bandwith so that the GUI values reflect directionality in regard to the ISP
+ #sm: NOTE this is ugly and should be performed in defaults.sh or functions.sh if at all
+ #sm: but for quick and dirty testing this should do
+ local ORIG_UPLINK=${UPLINK}
+ local ORIG_DOWNLINK=${DOWNLINK}
+ UPLINK=${ORIG_DOWNLINK}
+ DOWNLINK=${ORIG_UPLINK}
+
+
+ [ -n "$IFACE" ] || return 1
+ do_modules
+ verify_qdisc $QDISC "cake" || return 1
+ sqm_debug "Starting ${SCRIPT}"
+
+ [ -z "$DEV" ] && DEV=$( get_ifb_for_if ${IFACE} )
+
+
+ if [ "${UPLINK}" -ne 0 ];
+ then
+ egress
+ sqm_debug "egress shaping activated"
+ else
+ sqm_debug "egress shaping deactivated"
+ $TC qdisc del dev ${IFACE} root 2> /dev/null
+ fi
+ if [ "${DOWNLINK}" -ne 0 ];
+ then
+ verify_qdisc ingress "ingress" || return 1
+ ingress
+ sqm_debug "ingress shaping activated"
+ else
+ sqm_debug "ingress shaping deactivated"
+ $TC qdisc del dev ${DEV} root 2> /dev/null
+ $TC qdisc del dev ${IFACE} ingress 2> /dev/null
+ fi
+ return 0
+}