#!/bin/sh
[ -e /etc/functions.sh ] && . /etc/functions.sh || . ./functions.sh
-[ -x /sbin/modprobe ] && insmod="modprobe" || insmod="insmod"
+[ -x /sbin/modprobe ] && {
+ insmod="modprobe"
+ rmmod="$insmod -r"
+} || {
+ insmod="insmod"
+ rmmod="rmmod"
+}
add_insmod() {
eval "export isset=\${insmod_$1}"
case "$isset" in
1) ;;
- *) append INSMOD "$insmod $* >&- 2>&-" "$N"; export insmod_$1=1;;
+ *) {
+ [ "$2" ] && append INSMOD "$rmmod $1 >&- 2>&-" "$N"
+ append INSMOD "$insmod $* >&- 2>&-" "$N"; export insmod_$1=1
+ };;
esac
}
reset_cb
include /lib/network
scan_interfaces
- config_load /var/state/network
config_get "$1" ifname
)}
} || {
*:dsthost)
append "$var" "-d $value"
;;
- *:ipp2p)
- add_insmod ipt_ipp2p
- append "$var" "-m ipp2p"
- case "$value" in
- all) append "$var" "--edk --dc --kazaa --gnu --bit";;
- *) append "$var" "--$value";;
- esac
- ;;
*:layer7)
add_insmod ipt_layer7
+ add_insmod xt_layer7
append "$var" "-m layer7 --l7proto $value${pkt:+ --l7pkt}"
;;
*:ports|*:srcports|*:dstports)
config_get_bool enabled "$CONFIG_SECTION" enabled 1
[ 1 -eq "$enabled" ] || return 0
config_get classgroup "$CONFIG_SECTION" classgroup
- config_set "$CONFIG_SECTION" imqdev "$C"
+ config_set "$CONFIG_SECTION" ifbdev "$C"
C=$(($C+1))
append INTERFACES "$CONFIG_SECTION"
config_set "$classgroup" enabled 1
start_interface() {
local iface="$1"
- local num_imq="$2"
+ local num_ifb="$2"
config_get device "$iface" device
config_get_bool enabled "$iface" enabled 1
[ -z "$device" -o 1 -ne "$enabled" ] && {
return 1
}
config_get upload "$iface" upload
- config_get halfduplex "$iface" halfduplex
+ config_get_bool halfduplex "$iface" halfduplex
config_get download "$iface" download
config_get classgroup "$iface" classgroup
config_get_bool overhead "$iface" overhead 0
download="${download:-${halfduplex:+$upload}}"
enum_classes "$classgroup"
- for dir in up${halfduplex} ${download:+down}; do
+ for dir in ${halfduplex:-up} ${download:+down}; do
case "$dir" in
up)
[ "$overhead" = 1 ] && upload=$(($upload * 98 / 100 - (15 * 128 / $upload)))
prefix="cls"
;;
down)
- add_insmod imq numdevs="$num_imq"
- config_get imqdev "$iface" imqdev
+ [ "$(ls -d /proc/sys/net/ipv4/conf/ifb* 2>&- | wc -l)" -ne "$num_ifb" ] && add_insmod ifb numifbs="$num_ifb"
+ config_get ifbdev "$iface" ifbdev
[ "$overhead" = 1 ] && download=$(($download * 98 / 100 - (80 * 1024 / $download)))
- dev="imq$imqdev"
+ dev="ifb$ifbdev"
rate="$download"
dl_mode=1
prefix="d_cls"
cls_var maxrate "$class" limitrate $dir 100
cls_var prio "$class" priority $dir 1
cls_var avgrate "$class" avgrate $dir 0
+ cls_var qdisc_esfq "$class" qdisc_esfq $dir ""
+ [ "$qdisc_esfq" != "" ] && add_insmod sch_esfq
config_get classnr "$class" classnr
- append cstr "$classnr:$prio:$avgrate:$pktsize:$pktdelay:$maxrate" "$N"
+ append cstr "$classnr:$prio:$avgrate:$pktsize:$pktdelay:$maxrate:$qdisc_esfq" "$N"
done
append ${prefix}q "$(tcrules)" "$N"
export dev_${dir}="ifconfig $dev up txqueuelen 5 >&- 2>&-
tc qdisc add dev $dev root handle 1: hfsc default ${class_default}0
tc class add dev $dev parent 1: classid 1:1 hfsc sc rate ${rate}kbit ul rate ${rate}kbit"
done
+ [ -n "$download" ] && {
+ add_insmod cls_u32
+ add_insmod em_u32
+ add_insmod act_connmark
+ add_insmod act_mirred
+ add_insmod sch_ingress
+ }
+ if [ -n "$halfduplex" ]; then
+ export dev_up="tc qdisc del dev $device root >&- 2>&-
+tc qdisc add dev $device root handle 1: hfsc
+tc filter add dev $device parent 1: protocol ip prio 10 u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb$ifbdev"
+ elif [ -n "$download" ]; then
+ append dev_${dir} "tc qdisc del dev $device ingress >&- 2>&-
+tc qdisc add dev $device ingress
+tc filter add dev $device parent ffff: protocol ip prio 1 u32 match u32 0 0 flowid 1:1 action connmark action mirred egress redirect dev ifb$ifbdev" "$N"
+ fi
add_insmod cls_fw
add_insmod sch_hfsc
add_insmod sch_sfq
cat <<EOF
${INSMOD:+$INSMOD$N}${dev_up:+$dev_up
$clsq
-}${imqdev:+$dev_down
+}${ifbdev:+$dev_down
$d_clsq
$d_clsl
$d_clsf
local iptrules
local pktrules
local sizerules
- local download
enum_classes "$cg"
add_rules iptrules "$ctrules" "iptables -t mangle -A ${cg}_ct"
config_get classes "$cg" classes
for iface in $INTERFACES; do
config_get classgroup "$iface" classgroup
config_get device "$iface" device
- config_get imqdev "$iface" imqdev
- config_get dl "$iface" download
+ config_get ifbdev "$iface" ifbdev
+ config_get upload "$iface" upload
+ config_get download "$iface" download
config_get halfduplex "$iface" halfduplex
- add_insmod ipt_IMQ
+ download="${download:-${halfduplex:+$upload}}"
append up "iptables -t mangle -A OUTPUT -o $device -j ${cg}" "$N"
append up "iptables -t mangle -A FORWARD -o $device -j ${cg}" "$N"
- [ -z "$dl" ] || {
- [ -z "$halfduplex" ] || {
- append down "iptables -t mangle -A POSTROUTING -o $device -j IMQ --todev $imqdev" "$N"
- }
- append down "iptables -t mangle -A PREROUTING -i $device -j ${cg}" "$N"
- append down "iptables -t mangle -A POSTROUTING -o $device -j ${cg}" "$N"
- append down "iptables -t mangle -A PREROUTING -i $device -j IMQ --todev $imqdev" "$N"
- }
done
cat <<EOF
$INSMOD