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

#разбиваем по подсетям           
# Это правило следует читать так:
# Для любого адреса источника из сети  94.154.32.0/21
# по смещению 12 байт  наложить маску. Т.е. наложить маску на сам адрес источника.
# В результате (см маску) - будет выделен 3-й октет (в пример он может принимать значения 32-39)
# и этот октет будет использован как указатель, т.е. пакет перенаправлен в правило $HTHDLhex:Номер_Подсети
#
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

  1. 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
  1. 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]}
  1. {
       #класс клиента 
  1. class_add $DEV 1:1 1:$khex "htb rate ${RATE2}kbit ceil ${RATE}kbit burst 6k" 1 $QUANTUM $MTU
  2. let perturb=120+RANDOM%20
  3. qdisc_add $DEV 1:$khex $kkhex: "sfq limit 1024 perturb $perturb quantum $QUANTUM"
       #фильтры внутри подсети для заворота в нужный класс 
  1. 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; 
  1. /sbin/tc filter add dev $DEV parent ffff: protocol ip u32 match ip src 94.154.36.222 action mirred egress redirect dev ifb1650
  2. } &
       #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