Что означает вывод xargs show limits

Я обнаружил, что работает следующий метод.

  • Используйте TC для сопоставления пакетов без 802.1q на входящем входе и отправьте заголовок vlan с идентификатором 0
  • Используйте TC для сопоставления пакетов в vlan 0 на выходе и вставьте заголовок vlan
  • Создайте нетегированный логический интерфейс с типом = vlan and id = 0

Вот пример:

$ tc qdisc del dev eth0 root
$ tc qdisc add dev eth0 handle 1: root prio
$ tc filter add dev eth0 parent 1: protocol 802.1q basic match 'meta(vlan eq 0)' action vlan pop

$ tc qdisc del dev eth0 ingress
$ tc qdisc add dev eth0 handle ffff: ingress
$ tc filter add dev eth0 parent ffff: protocol all basic match 'not meta(protocol eq 0x8100)' action vlan push id 0

$ ip link add eth0-vlan0 type vlan id 0
$ ip link set eth0-vlan0 up
$ ip addr add 192.168.10.253/24 dev eth0-vlan0

peer$ ping 192.168.10.253
PING 192.168.10.253 (192.168.10.253) 56(84) bytes of data.
64 bytes from 192.168.10.253: icmp_seq=1 ttl=64 time=0.209 ms
64 bytes from 192.168.10.253: icmp_seq=2 ttl=64 time=0.188 ms
^C

Обратите внимание, что добавление prio qdisc на выходе (известное как «root» выше) отключает стандартную дисциплину mq, которая разделяет пакеты в соответствии с количеством очередей передачи на сетевом адаптере. чтобы позволить нескольким потокам ЦП проталкивать пакеты в разные очереди TX. Чтобы восстановить поведение по умолчанию, используйте mqprio следующим образом:

$ tx_q_count=$(ls -d /sys/class/net/eth0/queues/tx-* | wc -l)

$ tc qdisc del dev eth0 root
$ tc qdisc add dev eth0 handle 1: root prio bands $tx_q_count multiqueue
$ tc filter add dev eth0 parent 1: protocol 802.1q basic match 'meta(vlan eq 0)' action vlan pop
$ for i in $(seq 1 $tx_q_count); do tc qdisc add dev eth0 parent 1:$i pfifo_fast; done

$ tc qdisc del dev eth0 ingress
$ tc qdisc add dev eth0 handle ffff: ingress
$ tc filter add dev eth0 parent ffff: protocol all basic match 'not meta(protocol eq 0x8100)' action vlan push id 0

$ ip link add eth0-vlan0 type vlan id 0
$ ip link set eth0-vlan0 up
$ ip addr add 192.168.10.253/24 dev eth0-vlan0

peer$ ping 192.168.10.253
PING 192.168.10.253 (192.168.10.253) 56(84) bytes of data.
64 bytes from 192.168.10.253: icmp_seq=1 ttl=64 time=0.230 ms
64 bytes from 192.168.10.253: icmp_seq=2 ttl=64 time=0.198 ms
^C

Другое решение, которое также работает, - это добавить программный мост рядом с логическими интерфейсами vlan на физическом интерфейсе. Программный мост имеет функцию фильтрации vlan, которая позволяет использовать ограниченное переназначение vlan (pvid-> vid на входящем и vid-> pvid на выходе, но не полное переназначение). Вот пример:

$ ip link add eth0-vlan0 type bridge
$ echo 0 > /sys/class/net/eth0-vlan0/bridge/default_pvid
$ echo 1 > /sys/class/net/eth0-vlan0/bridge/vlan_filtering
$ ip link set dev eth0 master eth0-vlan0
$ bridge vlan add vid 4094 dev eth0 pvid untagged
$ bridge vlan add vid 4094 dev eth0-vlan0 untagged pvid self

$ ip link add eth0-vlan4094 link eth0 type vlan id 4094
# ... BEGIN: only if you intend to use vlan 4094 ...
$ ip link set eth0-vlan4094 up
$ ip addr add 10.10.40.253/24 dev eth0-vlan4094
# ... END ...

$ ip link set eth0-vlan0 up
$ ip addr add 192.168.10.253/24 dev eth0-vlan0

peer$ ping 192.168.10.253
PING 192.168.10.253 (192.168.10.253) 56(84) bytes of data.
64 bytes from 192.168.10.253: icmp_seq=1 ttl=64 time=0.238 ms
64 bytes from 192.168.10.253: icmp_seq=2 ttl=64 time=0.215 ms
^C

Вам нужен интерфейс VLAN, соответствующий номеру VID, используемому внутри моста, потому что функция фильтрации VLAN немного так себе. Он принимает оба немаркированных кадра с использованием сопоставления pvid-> vid, но также принимает кадры с тегом VLAN на проводе, совпадающим с переназначенным vid. Вместо этого интерфейс VLAN съедает эти кадры. Оставьте его в выключенном состоянии, если вам не нужна эта конкретная VLAN.

Программный мост недавно получил функцию "default_pvid", которая заставляет его работать как дешевые аппаратные коммутаторы: он поддерживает vlan, но по умолчанию выполняет сопоставление pvid-> vid с vid 1 и разрешает vid 1 на всех портах. , чтобы вы могли подключить коммутатор и начать использовать порты для немаркированного трафика без единой директивы конфигурации.

Наконец, более современным решением было бы использовать tc_clsact и написать небольшую программу BPF для вставки / вставки тегов для PVID. Работает так же, как приведенный выше пример TC, за исключением того, что некоторые сетевые адаптеры позволяют аппаратно разгрузить программы BPF, поэтому он может быть более производительным.

1
29.04.2016, 11:53
0 ответов

Теги

Похожие вопросы