Многоуровневый интерфейс настройки / нажатия

Я пытаюсь понять, как работает интерфейс Multiqueue tuntap. Следуя инструкциям по адресу: https://www.kernel.org/doc/Documentation/networking/tuntap.txt Мне удалось создать несколько очередей. Тем не менее, я не знаю, как проверить состояние очереди и где они создаются. Я старался:

$ tc -s class show dev tap0

(где tap0 - это мой интерфейс tap), я вижу около 255 очередей, даже для одного вызова ioctl с флагом IFF_MULTI_QUEUE. Так что, вероятно, я смотрю не на то место. Вот фрагмент вывода вышеприведенной команды:

class mq :1 root
 Sent 4741 bytes 37 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
class mq :2 root
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
.
.
.
class mq :ff root
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0
class mq :100 root
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0

Во-вторых, я не уверен, как направлять пакеты в эти очереди на основе какого-либо фильтра или классификатора, используя TC или любой другой инструмент. Я буду очень признателен, если кто-то может пролить свет на это.

PS: я не уверен, что это лучший форум, чтобы задавать такие вопросы, и буду признателен, если кто-то может указать мне правильный. Я пробовал: https://unix.stackexchange.com/questions/496043/multiqueue-tun-tap-interface но еще не получил убедительного ответа. Спасибо!

1 ответ

Решение

Хорошо, для второго вопроса, с несколькими пробами и ошибками, я могу направлять пакеты к определенным классам. Это было скорее исследовательское усилие, поэтому не уверен, что это "лучший" способ. Вот краткая справка о том, чего я хотел достичь: предположим, что если у нас есть многоканальный интерфейс с двумя очередями и соответствующими fds, fd1 и fd2, то я хотел получить специальные потоки на fd1, а остальные - на fd2. Мне удалось создать две очереди на уровне приложений, снова используя эту ссылку. Но пакеты были назначены случайным образом в эти очереди, вероятно, на основе их хэшей.

Чтобы направить пакеты к определенному потоку и в конечном итоге к соответствующим им fds, я использовал tc-multiq. Если вы создаете классы с использованием tc multiq на интерфейсе крана с несколькими очередями, вы получите столько классов, сколько поддерживается интерфейсом крана; для приведенного выше примера я получил два. Затем вы можете использовать фильтры tc и действие ( skbedit) для отображения очереди.

Шаги, чтобы следовать:

Сначала создайте тап-интерфейсы (используя мою собственную программу и скрипт).

$ ./createTap.sh tap0

Проверьте количество очередей. Я все еще не уверен, почему мы видим 255 классов здесь (вопрос 1 моего оригинального сообщения).

$ tc -s class show dev tap0 class mq :1 root Sent 4741 bytes 37 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 class mq :2 root Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 . . . class mq :ff root Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 class mq :100 root Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0

Давайте создадим multiq на tap0:

$ tc qdisc add dev tap0 root handle 1: multiq

Проверьте, сколько классов у нас сейчас. Обратите внимание, что у нас есть только 2 класса вместо 255:

$ tc -s class show dev class multiq 1:1 parent 1: Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0 class multiq 1:2 parent 1: Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) backlog 0b 0p requeues 0`

Наконец, используйте фильтры tc для управления пакетами, как вы хотите.

Надеюсь, что это полезно для других!

Другие вопросы по тегам