Назад | Перейти на главную страницу

Многоканальный интерфейс tun / tap

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

$ tc -s class show dev tap0

(где tap0 - мой интерфейс касания), я вижу около 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 но пока не получил убедительного ответа. Спасибо!

Хорошо, что касается второго вопроса, с несколькими попытками и ошибками я могу направлять пакеты в определенные классы. Это было скорее исследовательское усилие, поэтому не уверен, что это «лучший» способ. Вот краткая предыстория того, чего я хотел достичь: Предположим, если у нас есть интерфейс с несколькими очередями с двумя очередями и соответствующими 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 фильтры направлять пакеты как хотите.

Надеюсь, это поможет другим!