Можно также попробовать TSPrint от terminalworks. Их приложение не является столь же дорогим. http://www.terminalworks.com/tsprint.php
Я бы рекомендовал использовать wirehark, чтобы фиксировать, что происходит интерфейс, видимый в пользовательском пространстве, и использующий его для написания фильтра. Мне интересно, возможно, интерфейс по какой-то причине удаляет теги VLAN (несмотря на то, что он настроен для прозрачного моста). Может быть, добавляются дополнительные теги или что-то в этом роде?
Попробуйте отключить параметр reorder_hdr
на интерфейсе vlan. Если включена опция изменения порядка заголовков, то теги из фреймов удаляются. Проверьте это командой ip -d список ссылок dev vlan_iface
.
Вы можете пометить пакеты vlan с помощью ebtables .
# mark packets according to the vlan id
ebtables -i br0 -A PREROUTING -p 802_1Q --vlan-id 1 -j mark --mark-set 1
ebtables -i br0 -A PREROUTING -p 802_1Q --vlan-id 5 -j mark --mark-set 2
Затем нанесите формовку по разметке. ebtables и iptables имеют одинаковую маркировку.
Сам еще не делал этого. Так что это скорее догадка.
Тег VLAN удаляется из skb в последних ядрах. Попробуйте сделать что-то вроде этого, чтобы выполнить мета-соответствие в skb:
tc filter add dev internal protocol all parent 1:0 prio 100 basic match 'meta(vlan mask 0xfff eq 0x0ed8)' flowid 1:300
Я должен был сделать именно это. Я обнаружил, что ответ, предложенный @Thusitha, был правильным способом сделать это для новых ядер.
Протестировано с ядром Debian wheezy 3.2.0-4 и iproute (откуда берется команда tc) версии 20120521-3 + b3
Вот полный скрипт, строки tc filter
почти точно соответствуют заданным @Thusitha
function qos() {
if="$1"
vlan1="$2"
vlan2="$3"
# delete previous
tc qdisc del dev $if root >/dev/null 2>&1
tc qdisc del dev $if ingress >/dev/null 2>&1
# Root HTB for $if
tc qdisc add dev $if root handle 1: htb r2q 1 default 1
# Root class to borrow from
tc class add dev $if parent 1: classid 1:1 htb quantum 1000000 rate 500mbit ceil 500mbit burst 64k prio 2
tc qdisc add dev $if parent 1:1 handle 101 sfq perturb 10
# class for vlan1
tc class add dev $if parent 1:1 classid 1:106 htb quantum 1000000 rate 1.00mbit ceil 1.00mbit burst 6k
tc qdisc add dev $if parent 1:106 handle 107 sfq perturb 10
tc filter add dev $if protocol all parent 1: prio 100 basic match "meta(vlan mask 0xfff eq ${vlan1})" flowid 1:106
# class for vlan2
tc class add dev $if parent 1:1 classid 1:108 htb quantum 1000000 rate 1.00mbit ceil 10.00mbit burst 6k
tc qdisc add dev $if parent 1:108 handle 108 sfq perturb 10
tc filter add dev $if protocol all parent 1: prio 100 basic match "meta(vlan mask 0xfff eq ${vlan2})" flowid 1:108
}
qos eth1 1234 1235
qos eth2 2345 2346