Shaper tables: Использование хеш-таблиц для уменьшания числа правил шейпера: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
(Новая: =Шейпера и таблицы=)
 
Строка 1: Строка 1:
 
=Шейпера и таблицы=
 
=Шейпера и таблицы=
  +
  +
Давно собирадся написать заметку про использование хеш-таблиц в шейперах.
  +
  +
Итак, для того чот бы избежать кучи последовательных проверок, применяется следующая конструкция:
  +
  +
Заголовки, и прочяя ерунда
  +
<PRE>
  +
#!/bin/bash
  +
  +
. func.tc
  +
tc=/sbin/tc
  +
debug=1
  +
DEV=eth3.1800
  +
MTU=1500
  +
QUANTUM=1600
  +
RATE=1000000 #1GBit
  +
</PRE>
  +
  +
Традиционно - очистить то что было, и строить заново
  +
<PRE>
  +
$tc q d dev $DEV root &>/dev/null
  +
  +
#корневая дисциплина
  +
cmd="$tc qdisc add dev $DEV root handle 1:0 htb default 3"
  +
<PRE>
  +
  +
  +
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

Версия 22:59, 25 октября 2011

Шейпера и таблицы

Давно собирадся написать заметку про использование хеш-таблиц в шейперах.

Итак, для того чот бы избежать кучи последовательных проверок, применяется следующая конструкция:

Заголовки, и прочяя ерунда

#!/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