我试图了解 Multiqueue tuntap 接口是如何工作的。按照https://www.kernel.org/doc/Documentation/networking/tuntap.txt提供的说明, 我能够创建多个队列。但是,我不知道如何检查队列状态以及它们的创建位置。我试过了:
$ tc -s class show dev tap0
(其中 tap0 是我的点击界面),我看到大约 255 个队列,即使对于带有 IFF_MULTI_QUEUE 标志的单个 ioctl 调用也是如此。所以可能我看错地方了。以下是上述命令的输出片段:
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 但还没有任何令人信服的答案。谢谢!
好的,对于第二个问题,经过多次试验和错误,我能够将数据包引导到特定的类。这更像是一种探索性的努力,所以不确定它是否是“最好的”方式。这是我想要实现的简要背景:假设,如果我们有一个多队列分流接口,其中有两个队列和相应的 fd,fd1 和 fd2,那么我想在 fd1 上接收特殊流,其余的流到 fd2。我能够在应用层创建两个队列,再次使用这个链接。但是数据包被随机分配到这些队列中,可能是基于它们的哈希值。
为了将数据包引导至特定流并最终引导至其相应的 fd,我使用了 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
让我们在 tap0 上创建 multiq:
$ 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 过滤器根据需要引导数据包。
希望这对其他人有帮助!