Shaper tables: Использование хеш-таблиц для уменьшания числа правил шейпера
Материал из noname.com.ua
Шейпера и таблицы
Давно собирадся написать заметку про использование хеш-таблиц в шейперах.
Итак, для того чот бы избежать кучи последовательных проверок, применяется следующая конструкция:
Заголовки, и прочяя ерунда
#!/bin/bash . func.tc tc=/sbin/tc debug=1 DEV=eth3.1800 MTU=1500 QUANTUM=1600 RATE=1000000 #1GBit
Традиционно - очистить то что было, и строить заново
$tc q d dev $DEV root &>/dev/null #корневая дисциплина cmd="$tc qdisc add dev $DEV root handle 1:0 htb default 3"echo $cmd;$cmd; cmd="$tc filter add dev $DEV parent 1:0 protocol ip u32" echo $cmd;$cmd; #корневой класс class_add $DEV 1: 1:0 "htb rate ${RATE}kbit ceil ${RATE}kbit burst 10k" 1 $QUANTUM $MTU #class_add device parent classid "CLASS_SPECEFIC" prio quantum mtu #qdisc_add dev parent handle "QDISC_SPECEFIC" #filter_add dev parent prio "FILTER_SPECEFIC" flowid #exit HTHDL=257 #HTHDLhex=`printf %X $HTHDL` printf -v HTHDLhex %X $HTHDL #HTHDLhex=${hex[HTHDL]} #хеш-таблица для подсетей, 256 элементов cmd="$tc filter add dev $DEV parent 1:0 handle $HTHDLhex: protocol ip u32 divisor 256" echo $cmd;$cmd; #разбиваем по подсетям cmd="$tc filter add dev $DEV protocol ip parent 1:0 u32 ht 800:: match ip src 94.154.32.0/21 hashkey mask 0x0000ff00 at 12 link $HTHDLhex:" echo $cmd;$cmd; for i in `seq 32 39`;do #for i in `seq 244 255`;do printf -v ihex %X $i let l=i+1 #lhex=`printf %X $l` printf -v lhex %X $l #lhex=${hex[l]} #хеш-таблица для подсети $i cmd="$tc filter add dev $DEV parent 1:0 handle $lhex: protocol ip u32 divisor 256" echo $cmd;$cmd; #разбиваем внутри подсети $i cmd="$tc filter add dev $DEV protocol ip parent 1:0 u32 ht $HTHDLhex:$ihex match ip src 94.154.$i.0/24 hashkey mask 0x000000ff at 12 link $lhex:" echo $cmd;$cmd; for i in `seq 32 39`;do #for i in `seq 244 255`;do printf -v ihex %X $i let l=i+1 #lhex=`printf %X $l` printf -v lhex %X $l #lhex=${hex[l]} #хеш-таблица для подсети $i cmd="$tc filter add dev $DEV parent 1:0 handle $lhex: protocol ip u32 divisor 256" echo $cmd;$cmd; #разбиваем внутри подсети $i cmd="$tc filter add dev $DEV protocol ip parent 1:0 u32 ht $HTHDLhex:$ihex match ip src 94.154.$i.0/24 hashkey mask 0x000000ff at 12 link $lhex:" echo $cmd;$cmd; # exit for j in `seq 0 255`;do printf -v jhex %X $j let k=i*256+j+1; #khex=`printf %X $k` printf -v khex %X $k #khex=${hex[k]} let kk=k+1 if [ $kk -ge 65536 ];then break fi #kkhex=`printf %X $kk` printf -v kkhex %X $kk #kkhex=${hex[kk]} # { #класс клиента # class_add $DEV 1:1 1:$khex "htb rate ${RATE2}kbit ceil ${RATE}kbit burst 6k" 1 $QUANTUM $MTU # let perturb=120+RANDOM%20 # qdisc_add $DEV 1:$khex $kkhex: "sfq limit 1024 perturb $perturb quantum $QUANTUM" #фильтры внутри подсети для заворота в нужный класс # filter_add $DEV 1: 1 "protocol ip u32 ht $lhex:$jhex match ip src 10.0.$i.$j" 1:$khex let IFB=(i-32)*256+j cmd="/sbin/tc filter add dev $DEV parent 1: prio 1 protocol ip u32 ht $lhex:$jhex match ip src 94.154.$i.$j action mirred egress redirect dev ifb${IFB}" echo $cmd;$cmd; # /sbin/tc filter add dev $DEV parent ffff: protocol ip u32 match ip src 94.154.36.222 action mirred egress redirect dev ifb1650 # # } & #cmd="$tc filter add dev $DEV protocol ip parent 1:0 u32 ht $lhex:`printf %X $j` match ip src 10.0.$i.$j flowid 1:$khex"; #echo $cmd;$cmd; done; done