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

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 58: Строка 58:
   
 
#lhex=${hex[l]}
 
#lhex=${hex[l]}
  +
#хеш-таблица для подсети $i
#хеш-таблица для подсети $i
 
  +
cmd="$tc filter add dev $DEV parent 1:0 handle $lhex: protocol ip u32 divisor 256"
 
  +
cmd="$tc filter add dev $DEV parent 1:0 handle $lhex: protocol ip u32 divisor 256"
echo $cmd;$cmd;
 
  +
echo $cmd;$cmd;
 
  +
 
#разбиваем внутри подсети $i
+
#разбиваем внутри подсети $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:"
+
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;
echo $cmd;$cmd;
 
  +
 
  +
for i in `seq 32 39`;do
 
  +
#for i in `seq 244 255`;do
 
  +
printf -v ihex %X $i
for i in `seq 32 39`;do
 
  +
let l=i+1
#for i in `seq 244 255`;do
 
  +
#lhex=`printf %X $l`
printf -v ihex %X $i
 
let l=i+1
+
printf -v lhex %X $l #lhex=${hex[l]}
  +
#хеш-таблица для подсети $i
#lhex=`printf %X $l`
 
  +
cmd="$tc filter add dev $DEV parent 1:0 handle $lhex: protocol ip u32 divisor 256"
printf -v lhex %X $l
 
  +
echo $cmd;$cmd;
 
  +
#разбиваем внутри подсети $i
#lhex=${hex[l]}
 
  +
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:"
#хеш-таблица для подсети $i
 
  +
echo $cmd;$cmd; #exit
cmd="$tc filter add dev $DEV parent 1:0 handle $lhex: protocol ip u32 divisor 256"
 
  +
for j in `seq 0 255`;do
echo $cmd;$cmd;
 
  +
printf -v jhex %X $j
 
  +
let k=i*256+j+1;
 
  +
#khex=`printf %X $k`
#разбиваем внутри подсети $i
 
  +
printf -v khex %X $k
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;
+
#khex=${hex[k]}
  +
let kk=k+1
 
  +
if [ $kk -ge 65536 ];then
 
  +
break fi
 
  +
#kkhex=`printf %X $kk`
# exit
 
  +
printf -v kkhex %X $kk
for j in `seq 0 255`;do
 
  +
#kkhex=${hex[kk]}
printf -v jhex %X $j
 
  +
#{
let k=i*256+j+1;
 
  +
#класс клиента
#khex=`printf %X $k`
 
  +
# class_add $DEV 1:1 1:$khex "htb rate ${RATE2}kbit ceil ${RATE}kbit burst 6k" 1 $QUANTUM $MTU
printf -v khex %X $k
 
  +
# let perturb=120+RANDOM%20
#khex=${hex[k]}
 
  +
# qdisc_add $DEV 1:$khex $kkhex: "sfq limit 1024 perturb $perturb quantum $QUANTUM"
let kk=k+1
 
  +
#фильтры внутри подсети для заворота в нужный класс
if [ $kk -ge 65536 ];then
 
  +
# filter_add $DEV 1: 1 "protocol ip u32 ht $lhex:$jhex match ip src 10.0.$i.$j" 1:$khex
break
 
  +
let IFB=(i-32)*256+j
fi
 
  +
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}"
#kkhex=`printf %X $kk`
 
  +
echo $cmd;$cmd;
printf -v kkhex %X $kk
 
  +
# /sbin/tc filter add dev $DEV parent ffff: protocol ip u32 match ip src 94.154.36.222 action mirred egress redirect dev ifb1650
#kkhex=${hex[kk]}
 
  +
#
# {
 
  +
# } &
#класс клиента
 
  +
#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";
# class_add $DEV 1:1 1:$khex "htb rate ${RATE2}kbit ceil ${RATE}kbit burst 6k" 1 $QUANTUM $MTU
 
  +
#echo $cmd;$cmd;
# let perturb=120+RANDOM%20
 
  +
done;
# 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
 
done

Версия 23:12, 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;                   
  1. корневой класс

class_add $DEV 1: 1:0 "htb rate ${RATE}kbit ceil ${RATE}kbit burst 10k" 1 $QUANTUM $MTU

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        
    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