Rockchip · AI & Linux Hub

Speicher und Netzwerk

Rockchip GMAC DPDK: RK3568-Build, testpmd, l2fwd, l3fwd und Pktgen

Vollständige Referenz für RK3568, Linux 4.19+ und DPDK 21.11: Kompilierung, UIO-Umschaltung, Hugepages, Weiterleitungstests und Pktgen-Konfiguration.

· ArmSoM-Redaktion · Rockchip-Quelldokumentation · 13 Min. Lesezeit

Anwendbarkeit auf ArmSoM

Dies ist eine Rockchip-Plattformreferenz, kein ArmSoM-Hardwaretestbericht. Für eine Anpassung müssen die Ethernet-Schnittstelle, der PHY, Stromversorgung, Reset, IOMUX, Referenztakte und das Ziel-SDK/BSP des jeweiligen Boards geprüft werden. Daraus folgt keine Unterstützung auf jedem ArmSoM-Board. Es wurde keine Hardwareprüfung durchgeführt. Sämtliche Protokolle, Durchsatzwerte und Zeitmessungen sind Beispiele aus der Quelle und keine ArmSoM-Messungen.

Die Quelle nennt RK3568, Linux 4.19+ und als Testumgebung Debian 11 mit DPDK 21.11. Beide Ausgaben tragen V1.0.0; die chinesische umfasst 11, die englische 10 Seiten. Die technischen Kapitel entsprechen einander. Die chinesische Fassung folgt ihrer Quelle; die englische, russische und diese deutsche Fassung folgen der englischen Quelle. Keines der Originale enthält technische Abbildungen.

Unterschied zwischen den Quellen: Das chinesische Build-Ziel lautet rrk3568-evb1-ddr4-v10-linux.img, das englische hingegen rk3568-evb1-ddr4-v10-linux.img. Beide bleiben in ihrer jeweiligen Fassung erhalten; das doppelte r ist vermutlich ein Tippfehler der Quelle. Die Codeblöcke mischen Konfigurations-/Flash-Anweisungen, durch Kommas getrennte adb-push-Beispiele und Platzhalterverzeichnisse und sind daher keine direkt ausführbaren Skripte. Auch policy4/policy6 sowie die Pktgen-Kerne 6/7 müssen angesichts des Vierkern-RK3568 geprüft werden. UIO, insmod/rmmod, Flashen und Verkehrstests können das System verändern oder die Netzwerkverbindung unterbrechen; nichts davon wurde ausgeführt.

Redaktionelle Hinweise · ArmSoM-Dokumentation

Produktgeltungsbereich der Quelle

Chipsatz Kernel-Version
RK3568 4.19+

1. Kompilieren des Codes

1.1 Kernel

Aktivieren Sie zunächst den UIO-Knoten in DTS anhand des Beispiels RK3568-evb1:

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi

index 0cb57e9d8529..c7729258e51d 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10.dtsi
@@ -262,6 +262,14 @@
      status = "okay";
 };

+&gmac_uio0 {
+     status = "okay";
+};
+
+&gmac_uio1 {
+     status = "okay";

+};
+
 /*
 * power-supply should switch to vcc3v3_lcd1_n
 * when mipi panel is connected to dsi1.

Kompilieren des Kernel-Moduls (KO)

make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 rockchip_linux_defconfig
make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 menuconfig, configure CONFIG_UIO=m,
CONFIG_STMMAC_UIO=m, CONFIG_HUGETLBFS=y

make CROSS_COMPILE=aarch64-linux-gnu- ARCH=arm64 rk3568-evb1-ddr4-v10-linux.img -j8
Flash boot.img
adb push drivers/uio/uio.ko, adb push drivers/net/ethernet/stmicro/stmmac/stmmac_uio.ko

1.2 Kompilieren von DPDK

Auf dem für die DPDK-Tests verwendeten Entwicklungsboard läuft Debian 11 mit DPDK 21.11. Hinweise zur Kompilierung finden Sie unter http://doc.dpdk.org/guides-21.11/linux_gsg/cross_build_dpdk_for_arm64.html

Cross-Kompilierung auf dem PC

wget https://developer.arm.com/-/media/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
tar -xvf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz

export PATH=$PATH:<cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin

apt install build-essential
apt install pkg-config-aarch64-linux-gnu
apt-get install python3 python3-pip
apt install meson
apt install ninja-build

meson aarch64-build-gcc --cross-file config/arm/arm64_armv8_linux_gcc
meson --reconfigure aarch64-build-gcc --cross-file config/arm/arm64_armv8_linux_gcc -Dbuildtype=debug -Dplatform=arm64 -Dexamples=l2fwd,l3fwd
ninja -C aarch64-build-gcc

Kompilieren von DPDK auf dem Entwicklungsboard

apt-get install python3 python3-pip
apt install meson

apt install ninja-build
apt-get install libdpkg-perl
apt-get install build-essential
apt-get install python3-pyelftools

meson -Ddisable_drivers='common/cnxk' build
cd build
ninja
ninja install

2. Ausführen von DPDK-Programmen

2.1 Einhängen von HugePages

echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

2.2 Laden des KO-Moduls

insmod uio.ko
insmod stmmac_uio.ko

Nach dem Start verwendet der Netzwerkverkehr standardmäßig weiterhin den nativen Netzwerk-Stack des Kernels. Hier erfolgt die Umschaltung zwischen DPDK und dem Kernel-Netzwerk durch Laden und Entfernen des Moduls stmmac_uio.ko mit insmod und rmmod. Nach dem Entladen des KO-Moduls wird also der ursprüngliche Zustand des Kernel-Netzwerks wiederhergestellt.

Übergabe der Netzwerksteuerung an DPDK:

root@linaro-alip:/home/linaro# insmod stmmac_uio.ko
[  41.232761] Generic PHY stmmac-1:00: attached PHY driver [Generic PHY]

(mii_bus:phy_addr=stmmac-1:00, irq=POLL)
[  41.236447] dwmac4: Master AXI performs any burst length
[  41.236497] rk_gmac-dwmac fe010000.ethernet eth0: No Safety Features support found
[  41.236886] rockchip_eth_uio_drv fe010000.uio: Registered uio_eth0 uio devices, 3
register maps attached
[  41.241453] Generic PHY stmmac-0:00: attached PHY driver [Generic PHY]
(mii_bus:phy_addr=stmmac-0:00, irq=POLL)
[  41.257084] dwmac4: Master AXI performs any burst length
[  41.257138] rk_gmac-dwmac fe2a0000.ethernet eth1: No Safety Features support found
[  41.257523] rockchip_eth_uio_drv fe2a0000.uio: Registered uio_eth1 uio devices, 3
register maps attached

Rückgabe der Netzwerksteuerung an den Kernel:

root@linaro-alip:/home/linaro# rmmod stmmac_uio
[ 2200.304636] Generic PHY stmmac-0:00: attached PHY driver [Generic PHY]

(mii_bus:phy_addr=stmmac-0:00, irq=POLL)
[ 2200.318163] dwmac4: Master AXI performs any burst length
[ 2200.318205] rk_gmac-dwmac fe2a0000.ethernet eth1: No Safety Features support found
[ 2200.318227] rk_gmac-dwmac fe2a0000.ethernet eth1: IEEE 1588-2008 Advanced Timestamp
supported
[ 2200.318443] rk_gmac-dwmac fe2a0000.ethernet eth1: registered PTP clock
[ 2200.319414] IPv6: ADDRCONF(NETDEV_UP): eth1: link is not ready
[ 2200.322971] Generic PHY stmmac-1:00: attached PHY driver [Generic PHY]
(mii_bus:phy_addr=stmmac-1:00, irq=POLL)
[ 2200.324883] dwmac4: Master AXI performs any burst length
[ 2200.324921] rk_gmac-dwmac fe010000.ethernet eth0: No Safety Features support found
[ 2200.324945] rk_gmac-dwmac fe010000.ethernet eth0: IEEE 1588-2008 Advanced Timestamp
supported
[ 2200.325468] rk_gmac-dwmac fe010000.ethernet eth0: registered PTP clock

[ 2200.325814] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready
[ 2205.385406] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready

2.3 Einstellen des Performance-Modus

echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
echo performance > /sys/devices/system/cpu/cpufreq/policy4/scaling_governor

echo performance > /sys/devices/system/cpu/cpufreq/policy6/scaling_governor
echo performance > /sys/class/devfreq/dmc/governor

2.4 Ausführen von testpmd

Testbefehle für den Weiterleitungsmodus

–vdev=net_stmmac0 –vdev=net_stmmac1 gibt die virtuellen Geräte an, deren Namen derzeit fest vorgegeben sind.

–main-lcore=0 bedeutet, dass Kern 0 für die Verwaltung und die Kerne 2 und 3 für die Weiterleitung verwendet werden.

–iova-mode=pa setzt iova-mode auf pa, da das Gerät keine iommu unterstützt.

– trennt die eal-Parameter von den testpmd-Parametern.

-i aktiviert den interaktiven Modus des Befehls dpdk-testpmd.

root@linaro-alip:/home/linaro# ./dpdk-testpmd --iova-mode=pa --vdev=net_stmmac0 --vdev=net_stmmac1 -l 0,2,3 --main-lcore=0 -- -i

EAL: Detected CPU lcores: 4
EAL: Detected NUMA nodes: 1
EAL: Detected static linkage of DPDK
EAL: Multi-process socket /var/run/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'PA'
TELEMETRY: No legacy callbacks, legacy socket not created
Interactive-mode selected
Warning: NUMA should be configured manually by using --port-numa-config and --ring-numa-
config parameters along with --numa.
testpmd: create a new mbuf pool <mb_pool_0>: n=163456, size=2176, socket=0
testpmd: preferred mempool ops selected: ring_mp_mc
Configuring Port 0 (socket 0)
stmmac_net: stmmac_eth_link_update()Port (0) link is Up

Port 0: BA:A0:3F:FD:B2:8C
Configuring Port 1 (socket 0)
stmmac_net: stmmac_eth_link_update()Port (1) link is Up
Port 1: B6:A0:3F:FD:B2:8C
Checking link statuses...
stmmac_net: stmmac_eth_link_update()Port (0) link is Up
stmmac_net: stmmac_eth_link_update()Port (1) link is Up
Done

Starten des Tests im Weiterleitungsmodus

testpmd> start
io packet forwarding - ports=2 - cores=1 - streams=2 - NUMA support enabled, MP allocation
mode: native

Logical Core 2 (socket 0) forwards packets on 2 streams:
 RX P=0/Q=0 (socket 0) -> TX P=1/Q=0 (socket 0) peer=02:00:00:00:00:01
 RX P=1/Q=0 (socket 0) -> TX P=0/Q=0 (socket 0) peer=02:00:00:00:00:00

 io packet forwarding packets/burst=32
 nb forwarding cores=1 - nb forwarding ports=2
 port 0: RX queue number: 1 Tx queue number: 1
   Rx offloads=0x0 Tx offloads=0x0
   RX queue: 0
    RX desc=0 - RX free threshold=0
    RX threshold registers: pthresh=0 hthresh=0 wthresh=0
    RX Offloads=0x0
   TX queue: 0

    TX desc=0 - TX free threshold=0
    TX threshold registers: pthresh=0 hthresh=0 wthresh=0
    TX offloads=0x0 - TX RS bit threshold=0
 port 1: RX queue number: 1 Tx queue number: 1
   Rx offloads=0x0 Tx offloads=0x0
   RX queue: 0
    RX desc=0 - RX free threshold=0
    RX threshold registers: pthresh=0 hthresh=0 wthresh=0
    RX Offloads=0x0
   TX queue: 0
    TX desc=0 - TX free threshold=0
    TX threshold registers: pthresh=0 hthresh=0 wthresh=0

    TX offloads=0x0 - TX RS bit threshold=0

Anzeigen der Weiterleitungsdaten:

testpmd> show port stats all


######################## NIC statistics for port 0 ########################
RX-packets: 5240160 RX-missed: 0 RX-bytes: 314409600
RX-errors: 0
RX-nombuf: 0
TX-packets: 0    TX-errors: 0    TX-bytes: 0

Throughput (since last show)
Rx-pps:       0       Rx-bps:       0
Tx-pps:       0       Tx-bps:       0
############################################################################

######################## NIC statistics for port 1 ########################
RX-packets: 0    RX-missed: 0    RX-bytes: 0

RX-errors: 0
RX-nombuf: 0
TX-packets: 5180224 TX-errors: 0 TX-bytes: 310813440


Throughput (since last show)
Rx-pps:       0       Rx-bps:       0
Tx-pps:       0       Tx-bps:       0
############################################################################
testpmd> show port stats all

######################## NIC statistics for port 0 ########################
RX-packets: 6382336 RX-missed: 0 RX-bytes: 382940160
RX-errors: 0
RX-nombuf: 0
TX-packets: 0    TX-errors: 0    TX-bytes: 0


Throughput (since last show)
Rx-pps:   681809      Rx-bps: 327268480
Tx-pps:       0       Tx-bps:       0
############################################################################

######################## NIC statistics for port 1 ########################
RX-packets: 0    RX-missed: 0    RX-bytes: 0
RX-errors: 0
RX-nombuf: 0
TX-packets: 6322397 TX-errors: 0 TX-bytes: 379343820

Throughput (since last show)
Rx-pps:       0       Rx-bps:       0

Tx-pps:   681810      Tx-bps: 327269160
############################################################################

Weitere häufig verwendete Einstellungen:

–nb-cores gibt die Anzahl der von dpdk-testpmd für die Weiterleitung verwendeten Kerne an.

–rxd betrifft die Deskriptoren der Empfangswarteschlange.

–txd betrifft die Deskriptoren der Sendewarteschlange.

–rxq gibt die Anzahl der Empfangswarteschlangen für dpdk-testpmd an; beim RK3568 beträgt sie 1.

–txq gibt die Anzahl der Sendewarteschlangen für dpdk-testpmd an; beim RK3568 beträgt sie 1.

2.5 Ausführen von l2fwd

l2fwd benötigt standardmäßig mindestens zwei Kerne für den Test der Paketweiterleitung.

./dpdk-l2fwd -l 0,2,3 --main-lcore=0 --iova-mode=pa --vdev=net_stmmac0 --vdev=net_stmmac1 -- -q 1 -p 0x3

Die Konsolenausgabe von l2fwd wird alle 10 Sekunden aktualisiert, was Paketverluste verursachen kann. Es wird empfohlen, die Konsolenausgabe in eine Datei umzuleiten.

2.6 Ausführen von l3fwd

./dpdk-l3fwd -l 3 -n 1 --iova-mode=pa --vdev=net_stmmac0 --vdev=net_stmmac1 -- -p 0x3 -P --config="(0,0,3),(1,0,3)" --parse-ptype

Der Parameter -p PortMask legt die Portmaske der verwendeten Netzwerkschnittstellen fest.

Der Parameter -P versetzt alle Netzwerkschnittstellen in den Promiscuous-Modus, damit sie sämtliche Pakete empfangen.

Der Parameter –config (port,queue,lcore),[(port,queue,lcore)] konfiguriert die Zuordnung zwischen Netzwerkschnittstellen, Warteschlangen und Kernen. Beispielsweise bedeutet –config (0,0,3), dass Kern 3 die Warteschlange 0 der Netzwerkschnittstelle 0 verarbeitet.

Die obige Ausgabe zeigt die Standard-Routingregeln von l3fwd, nämlich:

LPM: Adding route 198.18.0.0 / 24 (0) [net_stmmac0]
LPM: Adding route 198.18.1.0 / 24 (1) [net_stmmac1]

LPM: Adding route 2001:200:: / 64 (0) [net_stmmac0]
LPM: Adding route 2001:200:0:1:: / 64 (1) [net_stmmac1]

Das bedeutet, dass Pakete mit einem Ziel im IP-Bereich 198.18.0.0/24 über Netzwerkschnittstelle 0 und Pakete mit einem Ziel im Bereich 198.18.1.0 / 24 über Netzwerkschnittstelle 1 weitergeleitet werden. Diese Standard-Routingregeln sind im Quellcode konfiguriert. Deshalb müssen beim Test von l3fwd die Ziel- und Quell-IP-Adressen der Testdaten korrekt eingestellt werden.

3. Pktgen

Pktgen auf dem Board basiert auf DPDK; deshalb muss DPDK zuerst kompiliert und installiert werden. Siehe dazu Abschnitt 1.2 über das Kompilieren von DPDK für das Entwicklungsboard.

3.1 Herunterladen des pktgen-dpdk-Quellcodes

git clone http://dpdk.org/git/apps/pktgen-dpdk
apt-get install libpcap-dev

apt-get install libnuma-dev
apt install meson
apt install ninja-build pkg-config

3.2 Kompilieren von DPDK

cd build
ninja
ninja install

ldconfig
export PKG_CONFIG_PATH=/usr/local/lib/aarch64-linux-gnu/pkgconfig/

3.3 Kompilieren von Pktgen

cd pktgen-dpdk
meson build

cd build
ninja

3.4 Ausführen von Pktgen

./build/app/pktgen --iova-mode=pa --vdev=net_stmmac0 -l 6,7 --proc-type auto --log-level debug -- -P -m 7.0

Für den Abschnitt mit EAL-Optionen können Sie die DPDK-EAL-Parameter heranziehen. Der wichtigste Parameter ist -l; er legt die Liste der zu verwendenden Kerne fest. Beispielsweise wählen -l 1,2 oder -l 1-2 die Kerne 1 und 2 aus.

Für pktgen müssen mindestens zwei Kerne angegeben werden, da ein Kern für die Benutzerinteraktion benötigt wird, etwa zum Reagieren auf Eingaben während des Tests. Der wichtigste pktgen-eigene Parameter ist -m; er ordnet Netzwerkports den Kernen zu. Beispielsweise bedeutet -m 2.0, dass Kern 2 Netzwerkport 0 verarbeitet. Für mehrere Zuordnungen mit mehreren Netzwerkkarten und Kernen muss -m mehrfach angegeben werden. Sollen Pakete empfangen werden, empfiehlt sich zusätzlich -P, damit sämtliche Netzwerkports im Promiscuous-Modus alle Datenpakete empfangen.

Paketformat einstellen und Pktgen starten:

set 0 size 64
set 0 src ip 198.18.0.100/24
set 0 dst ip 198.18.1.101

set 0 dst mac ba:a0:3f:fd:b2:8c
start 0

Dieses Thema entdecken → · Lernpfade →