DPDK Sample Applications User Guides(11)IP Fragmentation樣例應用程序

官方文檔查看地址:
http://doc.dpdk.org/guides/sample_app_ug/ip_frag.html
PDF下載地址:
https://www.intel.com/content/www/us/en/embedded/technology/packet-processing/dpdk/dpdk-sample-applications-user-guide.html

本篇難度係數:
翻譯:☆☆☆☆☆
理解:★★☆☆☆

11. IP分片樣例應用程序
IPv4分片應用程序是使用數據平面開發工具包(DPDK)處理數據包的一個簡單示例。應用程序使用IPv4和IPv6包分片進行L3轉發。

11.1概述
該應用程序演示了使用零拷貝緩衝區來處理包碎片。初始化和運行時路徑非常類似於L2轉發樣例應用程序的路徑(在實際和虛擬環境中)。本指南強調了這兩個應用程序之間的差異。

與L2轉發示例應用程序有三個關鍵區別:

  • 第一個區別是IP碎片樣例應用程序使用了間接緩衝區。
  • 第二個區別是轉發決策是基於從輸入包的IP頭讀取的信息做出的。
  • 第三個區別是應用程序通過卸載標誌區分IP和非IP流量。

最長前綴匹配表(LPM用於IPv4, LPM6用於IPv6)用於存儲/查找與該IP地址相關聯的輸出端口號。任何不匹配的包都被轉發到原始端口。

默認情況下,支持高達9.5 KB的輸入幀大小。在轉發之前,輸入的IP包被分割,以適應“標準”以太網* v2 MTU(1500字節)。

11.2編譯應用程序
要編譯示例應用程序,請參見編譯示例應用程序 http://doc.dpdk.org/guides/sample_app_ug/compiling.html。

應用程序位於ip_fragment子目錄中。

11.3運行應用程序
創建LPM對象,並加載從全局l3fwd_ipv4_route_arrayl3fwd_ipv6_route_array表中讀取的預配置條目。對於每個輸入包,都將包轉發決策(即包的輸出接口標識)作爲LPM查找的結果。如果IP包的大小大於默認輸出MTU,則輸入包將被分割,並通過輸出接口發送多個片段。

執行:

./build/ip_fragmentation [EAL options] -- -p PORTMASK [-q NQ]

地點:

  • -p PORTMASK端口掩碼是要配置的端口的十六進制位掩碼
  • -q NQ是每個lcore的隊列數量(=端口)(默認爲1)

要在linux環境中運行這個例子,每個lcore有2個lcore(2,4)和2個端口(0,2),每個lcore有一個RX隊列:

./build/ip_fragmentation -l 2,4 -n 3 -- -p 5
EAL: coremask set to 14
EAL: Detected lcore 0 on socket 0
EAL: Detected lcore 1 on socket 1
EAL: Detected lcore 2 on socket 0
EAL: Detected lcore 3 on socket 1
EAL: Detected lcore 4 on socket 0
...

Initializing port 0 on lcore 2... Address:00:1B:21:76:FA:2C, rxq=0 txq=2,0 txq=4,1
done: Link Up - speed 10000 Mbps - full-duplex
Skipping disabled port 1
Initializing port 2 on lcore 4... Address:00:1B:21:5C:FF:54, rxq=0 txq=2,0 txq=4,1
done: Link Up - speed 10000 Mbps - full-duplex
Skipping disabled port 3IP_FRAG: Socket 0: adding route 100.10.0.0/16 (port 0)
IP_FRAG: Socket 0: adding route 100.20.0.0/16 (port 1)
...
IP_FRAG: Socket 0: adding route 0101:0101:0101:0101:0101:0101:0101:0101/48 (port 0)
IP_FRAG: Socket 0: adding route 0201:0101:0101:0101:0101:0101:0101:0101/48 (port 1)
...
IP_FRAG: entering main loop on lcore 4
IP_FRAG: -- lcoreid=4 portid=2
IP_FRAG: entering main loop on lcore 2
IP_FRAG: -- lcoreid=2 portid=0

要在linux環境中運行這個例子,每個lcore有1個lcore(4)和2個端口(0,2),每個lcore有2個RX隊列:

./build/ip_fragmentation -l 4 -n 3 -- -p 5 -q 2

要測試應用程序,應該在流生成器中設置與l3fwd_ipv4_route_array和/或l3fwd_ipv6_route_array表中的值匹配的流。

  • 默認的l3fwd_ipv4_route_array表爲:
struct l3fwd_ipv4_route l3fwd_ipv4_route_array[] = {
    {IPv4(100, 10, 0, 0), 16, 0},
    {IPv4(100, 20, 0, 0), 16, 1},
    {IPv4(100, 30, 0, 0), 16, 2},
    {IPv4(100, 40, 0, 0), 16, 3},
    {IPv4(100, 50, 0, 0), 16, 4},
    {IPv4(100, 60, 0, 0), 16, 5},
    {IPv4(100, 70, 0, 0), 16, 6},
    {IPv4(100, 80, 0, 0), 16, 7},
};
  • 默認的l3fwd_ipv6_route_array表爲:
struct l3fwd_ipv6_route l3fwd_ipv6_route_array[] = {
    {{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 0},
    {{2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 1},
    {{3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 2},
    {{4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 3},
    {{5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 4},
    {{6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 5},
    {{7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 6},
    {{8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, 48, 7},
};

例如,對於目標地址爲100.10.1.1、包長度爲9198字節的輸入IPv4包,將有7個IPv4包從端口#0發送到目標地址100.10.1.1:其中6個包的長度爲1500字節,一個包的長度爲318字節。IP碎片樣例應用程序提供了基本的NUMA支持,因爲所有內存結構都分配在所有具有活動lcore的套接字上。

有關運行應用程序和環境抽象層(EAL)選項的一般信息,請參閱DPDK入門指南。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章