我正在尝试了解多队列 tuntap 接口的工作原理。请按照以下说明进行操作:https://www.kernel.org/doc/Documentation/networking/tuntap.txt 我能够创建多个队列。但是,我不知道如何检查队列状态以及它们创建的位置。我尝试过:
$ tc -s class show dev tap0
(其中 tap0 是我的 tap 接口),我看到大约 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 或任何其他工具根据某些过滤器或分类器将数据包引导到这些队列。如果有人能对此有所启发,我将不胜感激。
附言:我不确定哪个论坛最适合提出此类问题,如果有人能告诉我哪个论坛最适合我,我将不胜感激。我尝试过: https://unix.stackexchange.com/questions/496043/multiqueue-tun-tap-interface 但还没有得到任何令人信服的答案。谢谢!
答案1
好的,对于第二个问题,经过多次尝试和错误,我能够将数据包引导到特定类别。这更像是一种探索性的努力,所以不确定这是否是“最佳”方法。以下是我想要实现的简要背景:假设我们有一个多队列分接接口,其中有两个队列和相应的 fd,fd1 和 fd2,那么我想在 fd1 上接收特殊流,其余的流到 fd2。我能够在应用层创建两个队列,再次使用此关联。但数据包被随机分配到这些队列,可能是基于它们的哈希值。
为了将数据包引导到特定流并最终引导到其对应的 fds,我使用了 tc-multiq。如果您使用以下方式创建类tc多q在多队列 tap 接口上,您将获得 tap 接口支持的尽可能多的类;对于上述示例,我获得了两个。然后您可以利用 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 过滤器按照您想要的方式操控数据包。
希望这对其他人有帮助!