Linux Advanced Routing & Traffic Control HOWTO
Шрифт:
Как установить метку? Просто измените mask и value класса. См. следующий код:
Это изменение пары (mask,value) в хеш-таблице, пометит пакеты, принадлежащие классу 1:1.
Теперь перейдем к описанию фильтра TC_INDEX. Кроме всего прочего, фильтр TC_INDEX может использоваться и в других конфигурациях, а не только в тех, которые включают DS услуги.
14.3.6. Фильтр TC_INDEX.
Базовый синтаксис команды, объявляющей фильтр TC_INDEX:
Ниже приводится пример, который описывает работу TC_INDEX (обратите внимание на места, выделенные жирным шрифтом:
(Это неполный код, я просто привел часть примера EFCBQ, включенного в состав дистрибутива iproute2).
Будем исходить из предположения, что мы получаем пакет, помеченный как EF. Если вы прочитаете RFC2598, то увидите, что рекомендуемое значение DSCP для EF трафика — 101110. Это означает, что в поле DS будет записано 10111000 (не забывайте, что младшие биты в поле TOS не используются в DS), или 0xb8, в шестнадцатиричном представлении.
Полученный
пакет имеет значение 0xb8 в поле DS. Дисциплина с идентификатором 1:0 считывает это значение и помещает его в skb->tc_index. На следующем шаге (вторая строка в примере), описанный фильтр выполняет следующие действия:В нашем примере MASK=0xFC и SHIFT=2.
Возвращаемое значение будет соответствовать фильтру внутренней qdisc (в примере, идентификатор 2:0). Если фильтр с заданным идентификатором найден, то условия фильтра будут проверены (в случае, если фильтр включает в себя эти условия) и будет возвращен classid (в нашем примере classid 2:1), который далее будет записан в skb->tc_index. Если фильтр не будет найден, то результат будет зависеть от объявления флага fall_through. Если объявление fall_through присутствует, то его значение будет воспринято как classid. В противном случае продолжится просмотр остальных фильтров. Будьте предельно внимательны, при использовании флага fall_through — его использование рекомендуется только в том случае, когда значение skb->tc_index и идентификаторы классов ссвязаны простыми (в смысле несложными) отношениями.
И последние два параметра, которые мы опишем, это hash и pass_on. Первый из них определяет размер хеш-таблицы. Pass_on — означает, что если не будет найден classid, равный результату этого фильтра, то необходимо попробовать применить следующий фильтр. Действие по-умолчанию — fall_through (см. следующую таблицу).
В заключение посмотрим — какие значения параметров TCINDEX допустимы:
TC Name | Value | Default |
---|---|---|
Hash | 1...0x10000 | Зависит от реализации |
Mask | 0...0xffff | 0xffff |
Shift | 0...15 | 0 |
Fall through / Pass_on | Flag | Fall_through |
Classid | Major:minor | None |
Police | ..... | None |