Some interfaces like wan-pppoe go away, when the ppp connection is lost and get recreated once the link is established again. SQM now has its own hotplug script to re-enable itself on the interfae just hotplugged. SQM will not touch other instances of itself running on other interfaces if called by hotplug.d. The implementation now allows this functionality by calling run.sh like: /usr/lib/sqm/run.sh interface YOUR_INTERFACE_NAME_HERE e.g.: /usr/lib/sqm/run.sh interface ge00-pppoe If called with a specific interface SQM will only try to disable itself on that interface to clean up all left over state and the re-enable itself on just that interface. Hopefully that allows for better service with instable interfaces like pppoe. The current code passes a simple manual stop start test of the ge00-pppoe interface from the GUI and does seem to do the right thing, at least on cerowrt 3.10.50-1...
115 lines
4.6 KiB
Bash
Executable file
115 lines
4.6 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
# 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-4 Michael D. Taht, Toke Høiland-Jørgensen, Sebastian Moeller
|
|
|
|
|
|
. /lib/functions.sh
|
|
|
|
STOP=
|
|
ACTIVE_STATE_PREFIX="SQM_active_on_"
|
|
ACTIVE_STATE_FILE_DIR="/var/run/SQM"
|
|
mkdir -p ${ACTIVE_STATE_FILE_DIR}
|
|
PROTO_STATE_FILE_LIST=$( ls ${ACTIVE_STATE_FILE_DIR}/${ACTIVE_STATE_PREFIX}* 2> /dev/null )
|
|
|
|
|
|
case ${1} in
|
|
stop)
|
|
logger -t SQM -s "run.sh stop"
|
|
STOP=$1
|
|
;;
|
|
interface)
|
|
START_ON_IF=$2 # only process this interface
|
|
logger -t SQM -s "Re/starting sqm on interface ${START_ON_IF}"
|
|
# TODO if $2 is empty just bail...
|
|
if [ -z ${START_ON_IF} ] ;
|
|
then
|
|
logger -t SQM -s "Interface name missing, nothing to do, bailing out"
|
|
return 0
|
|
fi
|
|
# only try to restart the just hotplugged interface, so reduce the list of interfaces to stop to the specified one
|
|
PROTO_STATE_FILE_LIST=${ACTIVE_STATE_FILE_DIR}/${ACTIVE_STATE_PREFIX}${START_ON_IF}
|
|
;;
|
|
esac
|
|
|
|
|
|
# the current uci config file does not necessarily contain sections for all interfaces with active
|
|
# SQM instances, so use the ACTIVE_STATE_FILES to detect the interfaces on which to stop SQM.
|
|
# Currently the .qos scripts start with stopping any existing traffic shaping so this should not
|
|
# effectively change anything...
|
|
for STATE_FILE in ${PROTO_STATE_FILE_LIST} ; do
|
|
if [ -f ${STATE_FILE} ] ;
|
|
then
|
|
STATE_FILE_BASE_NAME=$( basename ${STATE_FILE} )
|
|
CURRENT_INTERFACE=${STATE_FILE_BASE_NAME:${#ACTIVE_STATE_PREFIX}:$(( ${#STATE_FILE_BASE_NAME} - ${#ACTIVE_STATE_PREFIX} ))}
|
|
logger -t SQM -s "${0} Stopping SQM on interface: ${CURRENT_INTERFACE}"
|
|
/usr/lib/sqm/stop.sh ${CURRENT_INTERFACE}
|
|
rm ${STATE_FILE} # well, we stop it so it is not running anymore and hence no active state file needed...
|
|
fi
|
|
done
|
|
|
|
config_load sqm
|
|
|
|
run_simple_qos() {
|
|
local section="$1"
|
|
export IFACE=$(config_get "$section" interface)
|
|
|
|
# If called explicitly for one interface only , so ignore anything else
|
|
[ -n "${START_ON_IF}" -a "$START_ON_IF" != "$IFACE" ] && return
|
|
#logger -t SQM -s "marching on..."
|
|
|
|
ACTIVE_STATE_FILE_FQN="${ACTIVE_STATE_FILE_DIR}/${ACTIVE_STATE_PREFIX}${IFACE}" # this marks interfaces as active with SQM
|
|
[ -f "${ACTIVE_STATE_FILE_FQN}" ] && logger -t SQM -s "Uh, oh, ${ACTIVE_STATE_FILE_FQN} should already be stopped." # Not supposed to happen
|
|
|
|
if [ $(config_get "$section" enabled) -ne 1 ];
|
|
then
|
|
if [ -f "${ACTIVE_STATE_FILE_FQN}" ];
|
|
then
|
|
# this should not be possible, delete after testing
|
|
local SECTION_STOP="stop" # it seems the user just de-selected enable, so stop the active SQM
|
|
else
|
|
logger -t SQM -s "${0} SQM for interface ${IFACE} is not enabled, skipping over..."
|
|
return 0 # since SQM is not active on the current interface nothing to do here
|
|
fi
|
|
fi
|
|
|
|
export UPLINK=$(config_get "$section" upload)
|
|
export DOWNLINK=$(config_get "$section" download)
|
|
export LLAM=$(config_get "$section" linklayer_adaptation_mechanism)
|
|
export LINKLAYER=$(config_get "$section" linklayer)
|
|
export OVERHEAD=$(config_get "$section" overhead)
|
|
export STAB_MTU=$(config_get "$section" tcMTU)
|
|
export STAB_TSIZE=$(config_get "$section" tcTSIZE)
|
|
export STAB_MPU=$(config_get "$section" tcMPU)
|
|
export ILIMIT=$(config_get "$section" ilimit)
|
|
export ELIMIT=$(config_get "$section" elimit)
|
|
export ITARGET=$(config_get "$section" itarget)
|
|
export ETARGET=$(config_get "$section" etarget)
|
|
export IECN=$(config_get "$section" ingress_ecn)
|
|
export EECN=$(config_get "$section" egress_ecn)
|
|
export IQDISC_OPTS=$(config_get "$section" iqdisc_opts)
|
|
export EQDISC_OPTS=$(config_get "$section" eqdisc_opts)
|
|
export TARGET=$(config_get "$section" target)
|
|
export SQUASH_DSCP=$(config_get "$section" squash_dscp)
|
|
export SQUASH_INGRESS=$(config_get "$section" squash_ingress)
|
|
|
|
export QDISC=$(config_get "$section" qdisc)
|
|
export SCRIPT=/usr/lib/sqm/$(config_get "$section" script)
|
|
|
|
# # there should be nothing left to stop, so just avoid calling the script
|
|
if [ "$STOP" == "stop" -o "$SECTION_STOP" == "stop" ];
|
|
then
|
|
# /usr/lib/sqm/stop.sh
|
|
# [ -f ${ACTIVE_STATE_FILE_FQN} ] && rm ${ACTIVE_STATE_FILE_FQN} # conditional to avoid errors ACTIVE_STATE_FILE_FQN does not exist anymore
|
|
# $(config_set "$section" enabled 0) # this does not save to the config file only to the loaded memory representation
|
|
logger -t SQM -s "${0} SQM qdiscs on ${IFACE} removed"
|
|
return 0
|
|
fi
|
|
logger -t SQM -s "${0} Queue Setup Script: ${SCRIPT}"
|
|
[ -x "$SCRIPT" ] && { $SCRIPT ; touch ${ACTIVE_STATE_FILE_FQN}; }
|
|
}
|
|
|
|
config_foreach run_simple_qos
|