Интерфейс множественной очереди tun / tap

Я пытаюсь понять, как работает интерфейс tuntap с несколькими очередями. Следуя инструкциям по адресу: 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 но убедительного ответа пока нет. Спасибо!

0
задан 29 January 2019 в 23:50
1 ответ

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

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

Шаги к следующему:

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

$ ./createTap.sh tap0

Check the number of queues. Я все еще не уверен, почему мы видим здесь 255 классов (вопрос 1 моего оригинального сообщения).

$ tc -s класс показывает dev tap0. класс mq :1 корень Отправлено 4741 байт 37 пкт (сброшено 0, превышено 0 заявок 0) отставание 0b 0p запросы 0 класс mq :2 корень Отправлено 0 байт 0 пкт (сброшено 0, превышено 0 заявок 0) отставание 0b 0p запросы 0 . . . класс mq :ff корень Отправлено 0 байт 0 пкт (сброшено 0, превышено 0 заявок 0) отставание 0b 0p запросы 0 класс mq :100 корень Отправлено 0 байт 0 пкт (сброшено 0, превышено 0 заявок 0) backlog 0b 0p requeues 0

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

$ tc qdisc добавим dev tap0 root handle 1: multiq

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

$ tc -s класса show dev класс multiq 1:1 родительский 1: Отправлено 0 байт 0 пкт (выпадает 0, превышение 0 запросов 0) отставание 0b 0p запросы 0 класс multiq 1:2 родительский 1: Отправлено 0 байт 0 пкт (выпадает 0, превышение 0 запросов 0) отставание 0b 0p запросы 0 `

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

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

0
ответ дан 5 December 2019 в 04:18

Теги

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