On Thu, Sep 11, 2003 at 11:52:15AM +0300, Nick Kostirya wrote:
>
> Автор mod_gio использует "склеивание" супернетов
> (http://www.lexa.ru/apache-talk/msg06757.html) ,
> а поиск осушествляет по дереву.
Склеивание супернетов используется в том коде, который базу делает.
Можно не склеивать, тогда база будет больше, работать будет медленнее,
но в-принципе это не важно.
> В коде автора я до конца разобраться не смог :-(, поэтому простите, если
> заблуждаюсь.
Это не мой код, это libpatricia (немножко покоцаная, насколько я помню).
> При такой базе (со "склеиными сетями") при поиске, когда по дереву найдется
> сеть с наилучшим совпадением IP, идет сопоставление с маской,
> если IP не входит в найденную сеть, то необходимо вернутся наверх к более
> широкой сетке и проверить маску ее.
Не надо этого делать. Мы в списке поддеревьев ищем совпадающий с адресом префикс
нужной длины. Если его нет, то мы либо в начале дерева (т.е. ничего не
нашли), либо на какой-то ветке, которая описывает (matches) текущий адрес.
> Вот мне интересно, как автор выкрутился в этой ситуации.
> Из исходников я не понял и буду благодарен за краткое объяснение.
libpatricia - это тот же код (или практически тот же), который
за роутинг в BSD-ядре отвечает. Принципы ровно те же - нашли prefix
match - значит пользуемся, если нет more specific
Алексей Тутубалин
mailto: lexa@lexa.ru
Web: http://www.lexa.ru/lexa