Weißbuch

Aufbau des Packet Parsers von BittWare, HLS vs. P4-Implementierungen

Übersicht

One of the features of both BittWare’s SmartNIC Shell and BittWare’s Loopback Example is a packet parser/classifier that extracts protocol fields from packets. With this white paper, we not only wanted to describe our Parser, but explain how using HLS to build and configure it has resulted in a better implementation than using the P4 language. The Parser code is available on the BittWare developer website for free to AMD UltraScale+ owners as part of our Loopback Example (January 2020 availability)

Mehr als P4 für die Programmierung von Smart NICs

Today the Parser component of BittWare’s SmartNIC Shell is built using the AMD HLS C++ development environment. But an earlier revision of BittWare’s SmartNIC Shell used the P4 language though the AMD SDNet tool.

One reason to use P4 is that it’s an emerging standard popular among people embracing software-defined networking (SDN) on commodity Intel servers. However, AMD later restricted the availability of SDNet. Our use of P4 was specifically for end-users of SmartNIC Shell, so this restriction caused us to search for a more open solution. Following the success of our RSS implementation using HLS, we were motivated to re-implement the SmartNIC Shell parser using this same HLS approach (specifically the Xilinx HLS C++ environment).

PDF-Version dieses Whitepapers

Was ist ein Packet Parser?

Die über Ethernet verwendeten Protokolle sind für die Hardware schwierig zu nutzen. Diese Herausforderung besteht darin, dass die Protokolle viele optionale Felder haben. Diese Optionen machen es kompliziert, z. B. den Anfang eines IP-Headers zu finden. Warum ist das so? Im Falle des IP-Headers können null, ein oder zwei VLAN-Tags davor stehen. Es können auch MPLS-Tags vorhanden sein. Daher muss die Hardware das Protokoll gerade so weit verstehen, dass sie den IP-Header findet. Die Hardware benötigt den IP-Header, um IP-Adressen zu finden, die häufig in Hardware-Filtern und -Tabellen verwendet werden. Ähnliche Probleme gibt es auch auf der nächsten Ebene, da der IP-Header selbst optionale Felder enthält.

Der HLS C++-Paketparser von BittWare kann damit umgehen:

  • 0 bis 2 VLAN-Tags (der alte SDNet-Code erlaubte 0 oder 1)
  • 0 bis 5 MPLS-Tags (der alte SDNet-Code von BittWare erkannte MPLS nicht)
  • IP-Fragmente
  • IPv4-Header (nicht IPv6)

Es wird davon ausgegangen, dass die Port-IDs in diesen IP-Protokollen zu finden sind: TCP, UDP, DCCP und STCP

Nachdem wir im Wesentlichen zwei Versionen eines Paketparsers erstellt hatten, stellten wir einige Unterschiede zwischen der Verwendung von P4 und HLS C++ fest. Insgesamt ist der HLS-Flow weniger abstrakt als P4, aber das Tool ist viel ausgereifter.

Einzelheiten zum Ressourcenverbrauch finden Sie in der Tabelle:

CharakteristischP4/SDNetHLS C++
CLBs3,1853,391
BRAM220
Register10,3615,975
Code-Zeilen2061,154

Sie können sehen, dass HLS bei allen FPGA-Ressourcen entweder ähnlich oder besser ist. Der Quellcode benötigt zwar mehr Zeilen, aber ein Teil davon wird durch Kommentare und Formatierung beeinflusst. Es stimmt jedoch, dass eine HLS-C++-Implementierung immer mehr Codezeilen benötigt als P4. Das gilt allerdings für einen Paketparser/Klassifikator, der in den Bereich dessen fällt, was P4 beschreiben kann - HLS C++ kann mehr. HLS ist sehr universell einsetzbar und kann so ziemlich alles machen. P4 ist sehr spezialisiert.

Noch besser ist, dass jetzt, da die HLS-Implementierung existiert, jeder weitere Aufwand, sie zu modifizieren, um eine Ethernet-Protokollvariante zu verdauen, ungefähr der gleiche ist, wie die Modifikation in der P4-Sprache durchzuführen. Das liegt daran, dass unsere HLS-C++-Implementierung als eine Folge von Aufrufen von Parser-Funktionen auf niedriger Ebene strukturiert ist, die wir erstellt haben. Dieser Ansatz ist vergleichbar mit der direkten Manipulation der Laufzeitumgebung, die unter P4 läuft.

Wie bereits erwähnt, ist der Quellcode für das Loopback-Beispiel, einschließlich des Parser-Blocks, für Ultrascale++-Besitzer kostenlos über die BittWare Developer Site erhältlich. Es ist ein hervorragendes Beispiel für die Verwendung von AXI-Schnittstellen in HLS-C++-Code. Möchten Sie es sehen, haben aber keine BittWare FPGA-Karte? Setzen Sie sich mit uns in Verbindung, um zu erfahren, wo Sie sie kaufen können.

Was ist ein Tupel?

Die über Ethernet verwendeten Protokolle sind für die Hardware schwierig zu nutzen. Diese Herausforderung besteht darin, dass die Protokolle viele optionale Felder haben. Diese Optionen machen es kompliziert, z. B. den Anfang eines IP-Headers zu finden. Warum ist das so? Im Falle des IP-Headers können null, ein oder zwei VLAN-Tags davor stehen. Es können auch MPLS-Tags vorhanden sein. Daher muss die Hardware das Protokoll gerade so weit verstehen, dass sie den IP-Header findet. Die Hardware benötigt den IP-Header, um IP-Adressen zu finden, die häufig in Hardware-Filtern und -Tabellen verwendet werden. Ähnliche Probleme gibt es auch auf der nächsten Ebene, da der IP-Header selbst optionale Felder enthält.

Der HLS C++-Paketparser von BittWare kann damit umgehen:

  • 0 bis 2 VLAN-Tags (der alte SDNet-Code erlaubte 0 oder 1)
  • 0 bis 5 MPLS-Tags (der alte SDNet-Code von BittWare erkannte MPLS nicht)
  • IP-Fragmente
  • IPv4-Header (nicht IPv6)

Es wird davon ausgegangen, dass die Port-IDs in diesen IP-Protokollen zu finden sind: TCP, UDP, DCCP und STCP

Wird P4 für FPGA-Hardware üblich werden?

Die P4-Sprache wurde entwickelt, um eine "Packet Forwarding Data Plane" (oder Netzwerk-Switch) per Software zu definieren. Die Sprache ist insbesondere mit dem Hardware-Anbieter Barefoot Networks verbunden. Die P4-Sprache unterscheidet sich von der so genannten "P4 Runtime", die von Google gefördert wird. P4 Runtime stellt eine Standard-Laufzeit-API zur Verfügung, die es ermöglicht, die Steuerungsebene von mit P4 kompilierten Lösungen zu manipulieren.

P4 macht es einfach, einen Paketklassifizierer/Parser für ein neues Protokoll zu definieren. P4 spezifiziert auch einen vollständigen Satz von Funktionen zum Nachschlagen in Tabellen und kann Pakete, die durchlaufen, umschreiben, z. B. durch Eliminierung von VLAN-Tags.

Bedeutet dies, dass die Flexibilität von P4 zur Einführung von FPGAs führen wird? Aus unserer Sicht gibt es mehrere Gründe, die gegen eine solche Entwicklung sprechen.

Es gibt kommerzielle Optionen, um eine Teilmenge von P4 auf FPGA-Hardware bereitzustellen, allerdings sind sie derzeit in ihrem Umfang begrenzt. Wie bereits erwähnt, machen es die kommerziellen Bedingungen für BittWare schwierig, diese zu nutzen, um ein Beispielprogramm zu erstellen, das wir kostenlos mit unseren Produkten anbieten können.

Es ist wichtig zu beachten, dass keine reale FPGA-Anwendung ausschließlich in P4 geschrieben werden kann. Zum Beispiel kann der Receiver Side Scaling (RSS) Block, der in einigen Beispielen auf unseren Parser folgt, nicht in P4 geschrieben werden. Mit HLS C++ können jedoch beide Blöcke oder sogar ein einziger Block, der die beiden Funktionen kombiniert, erstellt werden.

Außerdem sind die P4-Tabellennachschlagefunktionen im Grunde ein Wrapper für hardwarespezifische Laufzeitbibliotheken, die in RTL oder HLS C++ geschrieben wurden. Programmierer können solche Laufzeitbibliotheken direkt von HLS C++ aus aufrufen, ohne dass sie dafür bestraft werden.

Nachdem wir sowohl P4 als auch HLS C++ zur Implementierung eines Parsers verwendet haben, ziehen wir den HLS C++ Ansatz vor. Es ist nicht klar, dass die Nachfrage nach P4 auf FPGAs groß genug sein wird, um ein ausgereiftes Tool zu unterstützen. HLS C++ kann mehr und ist ausgereifter.

Übertragbarkeit von HLS und Schlussfolgerung

Leere Überschrift

Wir hoffen, dass die Erläuterung von zwei Implementierungen eines Paketparsers auf einem FPGA, eine in der Sprache P4 und eine mit HLS C++, bei der Bewertung des richtigen Ansatzes für Sie hilfreich sind.

One final note is regarding portability between our FPGA cards. Between our AMD FPGA-based cards, HLS provides an easy method with few, if any, changes needed. For moving to an Intel-based card, such as our 520N-MX, source code changes will be required, particularly with respect to compliler pragmas. However, the basic concepts are identical. In both cases we are structuring C++ based upon our knowledge of FPGA translation challenges. Arbitrary C++ code will run very poorly inside an FPGA. However, C++ code restructured and anointed with pragmas works very well. The changes required for AMD or Intel are very similar but just expressed a little differently.

Als Teil der SmartNIC Shell von BittWare hilft unser Parser den Teams, schnell mit der Entwicklung von Anwendungen zur Verarbeitung von Netzwerkpaketen auf unseren FPGA-Karten zu beginnen. Erfahren Sie mehr über SmartNIC für unsere Karten oder setzen Sie sich mit uns in Verbindung, um über Ihre Anwendungsanforderungen zu sprechen.

Das Loopback-Beispiel von BittWare setzt eine Teilmenge der SmartNIC-Shell neu ein, die wir kostenlos anbieten können. Dieser Teilsatz enthält unsere Parser-Bibliothek.

Es gibt noch mehr zu lesen: Holen Sie sich die App Note

PDF anfordern Download

Was Sie auf dieser Seite sehen, ist ein grundlegender Überblick über den Parser, der Teil der SmartNIC Shell ist. In der vollständigen App Note für SmartNIC Shell finden Sie viele weitere Details, und das Beste ist, dass Sie sie KOSTENLOS herunterladen können! Füllen Sie das Formular aus, um Zugang zu einer PDF-Version der vollständigen App Note anzufordern.

"*" kennzeichnet Pflichtfelder

Name*
Bitte überprüfen Sie, ob diese E-Mail-Adresse aktiv ist, da die PDF-Datei über diese Adresse verschickt wird.
Adresse und Ort*