Tc

多尾tun/tap介面

  • March 6, 2019

我試圖了解 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 過濾器根據需要引導數據包。

希望這對其他人有幫助!

引用自:https://serverfault.com/questions/951385