Через
tc -s class show dev $DEV
где $DEV - имя устройста, убедился, что tc filter обрабатывает только исходящие пакеты с устройства, а входящие по нулям, если дополнительно не использовать iptable.
"Новая прошивка Олега 1.9.2.7-d от энтузиастов"
http://wl500g.info/showthread.php?t=17136
http://code.google.com/p/wl500g
в которой по sfq реально доступна esfq, при использовании которой можно более правильно делить канал пополам. Написал для новой прошивки деление входящего и исходящего каналов соединения ppp0 пополам между 192.168.1.2 и 192.168.1.3:
Скрипт запуска start:
Code:
#/bin/sh
WAN_CEIL_DOWNLOAD=256
WAN_RATE_DOWNLOAD=128
WAN_CEIL_UPLOAD=256
WAN_RATE_UPLOAD=128
DEV_WAN=ppp0
DEV_IN=imq0
DEV_OUT=imq1
# включение IMQ
insmod ipt_IMQ > /dev/null 2>&1
insmod imq behaviour=ab numdevs=2 > /dev/null 2>&1
tmp=`ip link show $DEV_WAN`
tmp=${tmp#*mtu }
MTU=${tmp%% *}
ip link set dev imq0 up
ip link set dev imq1 up
ip link set dev imq0 mtu $MTU
ip link set dev imq1 mtu $MTU
# очистка
iptables -t mangle -D PREROUTING -i $DEV_WAN -j IMQ --todev 0
iptables -t mangle -D POSTROUTING -o $DEV_WAN -j IMQ --todev 1
tc qdisc del dev $DEV_IN root 2> /dev/null > /dev/null
tc qdisc del dev $DEV_IN ingress 2> /dev/null > /dev/null
tc qdisc del dev $DEV_OUT root 2> /dev/null > /dev/null
tc qdisc del dev $DEV_OUT ingress 2> /dev/null > /dev/null
# входящий
# корень дерева 1:0, пакеты не удовлетворяющие всем условиям фильтров идут в очередь класса 1:9
tc qdisc add dev $DEV_IN root handle 1:0 htb default 9
tc class add dev $DEV_IN parent 1:0 classid 1:1 htb rate ${WAN_CEIL_DOWNLOAD}kbit
# класс для 192.168.1.2
tc class add dev $DEV_IN parent 1:1 classid 1:11 htb rate ${WAN_RATE_DOWNLOAD}kbit ceil ${WAN_CEIL_DOWNLOAD}kbit
# класс для 192.168.1.3
tc class add dev $DEV_IN parent 1:1 classid 1:12 htb rate ${WAN_RATE_DOWNLOAD}kbit ceil ${WAN_CEIL_DOWNLOAD}kbit
# очередь для 192.168.1.2
tc qdisc add dev $DEV_IN parent 1:11 handle 11:0 sfq hash dst
# очередь для 192.168.1.3
tc qdisc add dev $DEV_IN parent 1:12 handle 12:0 sfq hash dst
# направление пакетов из корня 1:0 в очередь класса 1:11
tc filter add dev $DEV_IN parent 1:0 protocol ip prio 20 u32 match ip dst 192.168.1.2 flowid 1:11
# направление пакетов из корня 1:0 в очередь класса 1:12
tc filter add dev $DEV_IN parent 1:0 protocol ip prio 20 u32 match ip dst 192.168.1.3 flowid 1:12
# неограниченный или неклассифицированный
tc class add dev $DEV_IN parent 1:0 classid 1:9 htb rate 100mbit
tc qdisc add dev $DEV_IN parent 1:9 handle 19:0 sfq perturb 10
# исходящий
# корень дерева 1:0, пакеты не удовлетворяющие всем условиям фильтров идут в очередь класса 1:9
tc qdisc add dev $DEV_OUT root handle 1:0 htb default 9
tc class add dev $DEV_OUT parent 1:0 classid 1:1 htb rate ${WAN_CEIL_UPLOAD}kbit
# класс для 192.168.1.2
tc class add dev $DEV_OUT parent 1:1 classid 1:11 htb rate ${WAN_RATE_UPLOAD}kbit ceil ${WAN_CEIL_UPLOAD}kbit
# класс для 192.168.1.3
tc class add dev $DEV_OUT parent 1:1 classid 1:12 htb rate ${WAN_RATE_UPLOAD}kbit ceil ${WAN_CEIL_UPLOAD}kbit
# очередь для 192.168.1.2
tc qdisc add dev $DEV_OUT parent 1:11 handle 11:0 sfq hash dst
# очередь для 192.168.1.3
tc qdisc add dev $DEV_OUT parent 1:12 handle 12:0 sfq hash dst
# направление пакетов из корня 1:0 в очередь класса 1:11
tc filter add dev $DEV_OUT parent 1:0 protocol ip prio 20 u32 match ip src 192.168.1.2 flowid 1:11
# направление пакетов из корня 1:0 в очередь класса 1:12
tc filter add dev $DEV_OUT parent 1:0 protocol ip prio 20 u32 match ip src 192.168.1.3 flowid 1:12
# неограниченный или неклассифицированный
tc class add dev $DEV_OUT parent 1:0 classid 1:9 htb rate 100mbit
tc qdisc add dev $DEV_OUT parent 1:9 handle 19:0 sfq perturb 10
# перенаправление пакетов на imq0, imq1
iptables -t mangle -I PREROUTING -i $DEV_WAN -j IMQ --todev 0
iptables -t mangle -A POSTROUTING -o $DEV_WAN -j IMQ --todev 1
Скрипт останова stop:
Code:
#/bin/sh
DEV_WAN=ppp0
DEV_IN=imq0
DEV_OUT=imq1
iptables -t mangle -D PREROUTING -i $DEV_WAN -j IMQ --todev 0
iptables -t mangle -D POSTROUTING -o $DEV_WAN -j IMQ --todev 1
tc qdisc del dev $DEV_IN root 2> /dev/null > /dev/null
tc qdisc del dev $DEV_IN ingress 2> /dev/null > /dev/null
tc qdisc del dev $DEV_OUT root 2> /dev/null > /dev/null
tc qdisc del dev $DEV_OUT ingress 2> /dev/null > /dev/null
Скрипт вывода статистики status:
Code:
#/bin/sh
tc -s class show dev imq0
tc -s class show dev imq1
Профи, всё ли правильно, на Ваш взгляд? Большое спасибо.