т.е., насколько я понял канал нужно разбить на два потока, одному
отдать 5к, второму 2к, а если первый поток пустой, то отдать всю
полосу второму ?
Тогда это будет выглядеть примерно так - куда-нибудь в /etc/ppp/ip-up
вставляешь:
1. расписываем класс
tc qdisc add ${IFNAME} root handle 1: default 30
tc class add dev ${IFNAME} parent 1: classid 1:1 rate 7000bps ceil 7000bps
tc class add dev ${IFACE} parent 1:1 classid 1:10 rate 5000bps ceil 7000bps
tc class add dev ${IFACE} parent 1:1 classid 1:20 rate 2000bps ceil 7000bps
tc class add dev ${IFACE} parent 1:1 classid 1:30 rate 1000bps ceil
7000bps
здесь rate, ceil - соответственно скорость и верхний порог скорости
при отсуствии трафика с соседних классах.
2. вешаем очереди на каждый из классов
tc qdisc add dev ${IFNAME} parent 1:10 handle 10: pfifo limit 20
tc qdisc add dev ${IFNAME} parent 1:20 handle 20: sfq perturb 3
tc qdisc add dev ${IFNAME} parent 1:30 handle 30: pfifo limit 5
здесь на первый поток повешена очередь fifo, на второй fair queue, в принципе ты сам можешь подобрать то, что тебе нравится.
3. теперь классифицируем пакеты
tc filter add dev ${IFNAME} parent 1:0 protocol ip prio 1 handle 50 fw flowid 1:10
tc filter add dev ${IFNAME} parent 1:0 protocol ip prio 2 handle 51 fw flowid 1:20
это сделано через маркировку пакетов при помощи iptables, соответственно
нужно будет добавить 2 правила, маркирующие пакеты для первого и второго
потоков:
iptables -t mangle --append PREROUTING ..blah...blah.. --jump MARK --set-mark 50
iptables -t mangle --append PREROUTING ..blah...blah.. --jump MARK --set-mark 51
в принципе можно обойтись и без iptables, используя какой-либо другой
классификатор, например u32
tc filter add dev ${IFNAME} parent 1:0 protocol ip prio 1 \
u32 match ip protocol 6 0xff match ip dport 1352 0xffff flowid 1:10
tc filter add dev ${IFNAME} parent 1:0 protocol ip prio 2 \
u32 match ip src 1.2.3.4 0xffffff00 flowid 1:20
ну примерно так