Jump to content
Калькуляторы

u32 hashtables

Господа, пытаюсь разобраться с hashtables. Полистал форум, думал написать в какой-то существующей теме, но не нашел подходщей.

 

Прочитал LARTC. Все красиво. Пытаюсь сделать - не работает.

Скажем у меня есть сеть 192.168.2.0/24 и мне надо отфильтровать адрес 192.168.2.161. Все это дело происходит на интерфейсе ppp0.

 

Я говорю:

tc q add dev ppp0 root handle 1 htb

tc cl add dev ppp0 parent 1:0 classid 1:2 htb rate 100Mbit

tc cl add dev ppp0 parent 1:2 classid 1:5000 htb rate 5Mbit

 

Тут все понятно. Дальше идут фильтры:

# рутовый фильтр

tc filter add dev ppp0 parent 1:0 prio 5 protocol ip u32

 

# таблица на 256 адресов

tc filter add dev ppp0 parent 1:0 prio 5 handle 2: protocol ip u32 divisor 256

 

# добавляю в таблицу 1 запись. a1 - это 161 в hex. Фильтруем по плану все в 5000 класс, созданый выше

tc filter add dev ppp0 protocol ip parent 1:0 prio 5 u32 ht 2:a1: match ip dst 192.168.2.161 flowid 1:5000

 

# делаю рутовую таблицу для отфильтровки собственно последнего байта в /24 и говорю идти читать созданную таблицу выше

tc filter add dev ppp0 protocol ip parent 1:0 prio 5 u32 ht 800:: match ip dst 192.168.2.0/24 hashkey mask 0x000000ff at 12 link 2:

 

После выполнения получаю в фильтрах:

 

filter parent 1: protocol ip pref 5 u32

filter parent 1: protocol ip pref 5 u32 fh 2: ht divisor 256

filter parent 1: protocol ip pref 5 u32 fh 2:a1:800 order 2048 key ht 2 bkt a1 flowid 1:5000

match c0a802a1/ffffffff at 16

filter parent 1: protocol ip pref 5 u32 fh 800: ht divisor 1

filter parent 1: protocol ip pref 5 u32 fh 800::800 order 2048 key ht 800 bkt 0 link 2:

match c0a80200/ffffff00 at 12

hash mask 000000ff at 12

 

Трафик в класс 5000 не попадает.

 

Если сказать банальное

tc filter add dev ppp0 protocol ip parent 1:0 prio 5 u32 match ip dst 192.168.2.161 flowid 1:5000

 

Трафик в классе появляется.

 

Скажите, пожалуйста, где ошибка в моей конфигурации? Все по LARTC. Читал http://brownian.org.ua/?page_id=6 но там для более сложной структуры и почему-то "hashkey mask 0x000000ff at 16", а в LARTC - 12. Пробовал и так и так - результата нет.

 

Заранее спасибо.

Share this post


Link to post
Share on other sites

Скажите, пожалуйста, где ошибка в моей конфигурации? Все по LARTC. Читал http://brownian.org.ua/?page_id=6 но там для более сложной структуры и почему-то "hashkey mask 0x000000ff at 16", а в LARTC - 12. Пробовал и так и так - результата нет.

Так у вас же IP инкапсулирован в PPP, значит надо ко всем смещениям прибавить размер заголовка PPP-кадра. Если у вас все IP в пределах одной сети /16, то вместо u32 можно использовать фильтр flow. 16 и 12 -- это смещения для destination IP и source IP.

Edited by photon

Share this post


Link to post
Share on other sites

Насчет 16 и 12 - Вы действительно оказались правы - это смещения для dst и src. Мне, для dst нужно было поставить 16. Хотя я раньше ставил, и оно не срабатывало, возможно, дело было в том, что там уже были фильтры на 12 смещении.

 

Насчет инкапсуляци я с Вами не соглашусь - инкапсуляция есть, на eth0, скажем, на ppp0 пакет уже деинкапсулирован, поэтому там можно работать с нормальными смещениями.

 

Все заработало, спасибо за пояснения.

Share this post


Link to post
Share on other sites

зачем делатся рутовый фильтр?

# рутовый фильтр

tc filter add dev ppp0 parent 1:0 prio 5 protocol ip u32

Share this post


Link to post
Share on other sites

Чтобы последующие filter add с указанием handle нормально отрабатывали.

Share this post


Link to post
Share on other sites

Почему-то думал, что стандартная таблица 800 и так всегда существует... нет?

Поэкспериментирую...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this