백서

비트웨어의 패킷 파서, HLS와 P4 구현 구축하기

개요

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)

스마트 NIC 프로그래밍을 위한 P4를 뛰어넘다

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 버전

패킷 파서란 무엇인가요?

이더넷을 통해 사용되는 프로토콜은 하드웨어가 활용하기 까다롭습니다. 이러한 문제는 프로토콜에 많은 선택적 필드가 있기 때문에 존재합니다. 이러한 옵션은 예를 들어 IP 헤더의 시작 부분을 찾는 것을 복잡하게 만듭니다. 왜 그럴까요? IP 헤더의 경우 앞에 0, 1 또는 2개의 VLAN 태그가 있을 수 있습니다. MPLS 태그도 있을 수 있습니다. 따라서 하드웨어는 IP 헤더를 찾을 수 있을 정도로 프로토콜을 이해해야 합니다. 하드웨어 필터와 테이블에서 자주 사용되는 IP 주소를 찾으려면 하드웨어에 IP 헤더가 필요합니다. IP 헤더 자체에 선택적 필드가 있기 때문에 다음 단계에서도 비슷한 문제가 존재합니다.

비트웨어의 HLS C++ 패킷 파서는 이를 처리할 수 있습니다:

  • 0~2개의 VLAN 태그(이전 SDNet 코드에서는 0 또는 1 허용)
  • 0~5개의 MPLS 태그(BittWare의 이전 SDNet 코드는 MPLS를 인식하지 못함)
  • IP 조각
  • IPv4 헤더(IPv6 아님)

포트 ID는 다음 IP 프로토콜에서 찾을 수 있다고 가정합니다: TCP, UDP, DCCP 및 STCP

기본적으로 두 가지 버전의 패킷 구문 분석기를 만들었기 때문에 P4와 HLS C++를 사용할 때 몇 가지 차이점을 발견했습니다. 전반적으로 HLS 흐름은 P4보다 덜 추상적이지만 도구는 훨씬 더 성숙합니다.

리소스 사용량에 대한 자세한 내용은 표에 나와 있습니다:

특성P4/SDNetHLS C++
CLB3,1853,391
BRAM220
레지스터10,3615,975
코드 라인2061,154

모든 FPGA 리소스에서 HLS가 비슷하거나 더 우수하다는 것을 알 수 있습니다. 소스 코드에 더 많은 줄이 필요하기는 하지만, 그 중 일부는 주석과 서식의 영향을 받습니다. 그러나 HLS C++ 구현이 항상 P4보다 더 많은 코드 줄을 필요로 하는 것은 사실입니다. 하지만 이는 패킷 구문 분석기/분류기의 경우로, P4가 설명할 수 있는 범위에 속하며 HLS C++는 더 많은 작업을 수행할 수 있습니다. HLS는 매우 범용적이며 거의 모든 것을 할 수 있습니다. P4는 매우 전문적입니다.

더 좋은 점은 HLS 구현이 존재하므로 이더넷 프로토콜 변형을 소화하기 위해 이를 수정하는 후속 작업은 P4 언어로 수정하는 것과 거의 동일하다는 점입니다. HLS C++ 구현은 우리가 만든 저수준 구문 분석기 함수에 대한 호출 시퀀스로 구조화되어 있기 때문입니다. 이 접근 방식은 P4 아래에 있는 런타임을 직접 조작하는 것과 유사합니다.

앞서 언급한 바와 같이, 해당 파서 블록을 포함한 루프백 예제의 소스 코드는 BittWare 개발자 사이트를 통해 울트라스케일++ 소유자에게 무료로 제공됩니다. 이 예제는 HLS C++ 코드 내에서 AXI 인터페이스를 사용하는 방법을 보여주는 훌륭한 예시입니다. 보고 싶지만 BittWare FPGA 카드가 없으신가요? 구입처를 문의해 주세요.

튜플이란 무엇인가요?

이더넷을 통해 사용되는 프로토콜은 하드웨어가 활용하기 까다롭습니다. 이러한 문제는 프로토콜에 많은 선택적 필드가 있기 때문에 존재합니다. 이러한 옵션은 예를 들어 IP 헤더의 시작 부분을 찾는 것을 복잡하게 만듭니다. 왜 그럴까요? IP 헤더의 경우 앞에 0, 1 또는 2개의 VLAN 태그가 있을 수 있습니다. MPLS 태그도 있을 수 있습니다. 따라서 하드웨어는 IP 헤더를 찾을 수 있을 정도로 프로토콜을 이해해야 합니다. 하드웨어 필터와 테이블에서 자주 사용되는 IP 주소를 찾으려면 하드웨어에 IP 헤더가 필요합니다. IP 헤더 자체에 선택적 필드가 있기 때문에 다음 단계에서도 비슷한 문제가 존재합니다.

비트웨어의 HLS C++ 패킷 파서는 이를 처리할 수 있습니다:

  • 0~2개의 VLAN 태그(이전 SDNet 코드에서는 0 또는 1 허용)
  • 0~5개의 MPLS 태그(BittWare의 이전 SDNet 코드는 MPLS를 인식하지 못함)
  • IP 조각
  • IPv4 헤더(IPv6 아님)

포트 ID는 다음 IP 프로토콜에서 찾을 수 있다고 가정합니다: TCP, UDP, DCCP 및 STCP

P4가 FPGA 하드웨어에 보편화될까요?

P4 언어는 소프트웨어를 사용하여 "패킷 전달 데이터 플레인"(또는 네트워크 스위치)을 정의하기 위해 만들어졌습니다. 이 언어는 특히 하드웨어 공급업체인 베어풋 네트웍스와 관련이 있습니다. P4 언어는 Google이 홍보하는 "P4 런타임"이라는 것과는 구별됩니다. P4 런타임은 P4로 컴파일된 솔루션의 컨트롤 플레인을 조작할 수 있는 표준 런타임 API를 제공합니다.

P4를 사용하면 새로운 프로토콜에 대한 패킷 분류기/파서를 쉽게 정의할 수 있습니다. 또한 P4는 완전한 테이블 조회 기능 세트를 지정하며, 예를 들어 흐르는 패킷을 재작성하여 VLAN 태그를 제거할 수 있습니다.

P4의 유연성이 FPGA의 채택으로 이어진다는 의미일까요? 그렇게 되지 않을 것으로 예상되는 몇 가지 이유가 있습니다.

FPGA 하드웨어에서 P4의 하위 집합을 제공하는 상용 옵션이 존재하지만, 현재 그 범위가 제한되어 있습니다. 또한 앞서 언급했듯이 상업적 조건으로 인해 BittWare가 이를 활용하여 제품과 함께 무료로 제공할 수 있는 예제 프로그램을 만드는 것이 어렵습니다.

실제 FPGA 애플리케이션을 P4로만 작성할 수 있는 것은 없다는 점에 유의하는 것이 중요합니다. 예를 들어, 일부 예제에서 파서 다음에 나오는 RSS(수신기 측 스케일링) 블록은 P4로 작성할 수 없습니다. 그러나 HLS C++를 사용하여 두 블록을 작성하거나 두 기능을 결합한 단일 블록을 작성할 수 있습니다.

또한 P4 테이블 조회 함수는 기본적으로 RTL 또는 HLS C++로 작성된 하드웨어 전용 런타임 라이브러리에 대한 래퍼입니다. 프로그래머는 HLS C++에서 이러한 런타임을 아무런 불이익 없이 직접 호출할 수 있습니다.

결론은 구문 분석기를 구현하는 데 P4와 HLS C++를 모두 사용해 본 결과, 실제로는 HLS C++ 접근 방식을 선호한다는 것입니다. FPGA에서 P4에 대한 수요가 성숙한 툴을 지원할 만큼 충분히 커질지는 확실하지 않습니다. HLS C++는 더 많은 작업을 수행할 수 있고 더 성숙합니다.

HLS의 이식성 및 결론

빈 제목

FPGA에서 패킷 구문 분석기를 구현하는 두 가지 방법, 즉 P4 언어와 HLS C++를 사용하는 방법에 대한 설명이 여러분에게 적합한 접근 방식을 평가하는 데 도움이 되기를 바랍니다.

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.

BittWare의 SmartNIC Shell의 일부인 Parser는 팀이 FPGA 카드에서 네트워크 패킷 처리 애플리케이션을 빠르게 구축할 수 있도록 도와줍니다. 카드용 SmartNIC에 대해 자세히 알아보거나 당사에 연락하여 애플리케이션 요구 사항에 대해 상담하세요.

비트웨어의 루프백 예제는 무료로 제공할 수 있는 SmartNIC 셸의 하위 집합을 다시 배포합니다. 이 하위 집합에는 파서 라이브러리가 포함됩니다.

읽을거리가 더 있습니다: 앱 노트 받기

PDF 다운로드 요청

이 페이지에 표시된 것은 SmartNIC Shell의 일부인 파서에 대한 기본 개요입니다. SmartNIC Shell에 대한 전체 앱 노트에는 훨씬 더 자세한 내용이 있으며, 무엇보다도 무료로 다운로드할 수 있습니다! 양식을 작성하여 전체 앱 노트의 PDF 버전에 대한 액세스를 요청하세요.

"*"는 필수 필드를 나타냅니다.

이름*
이 주소를 사용하여 PDF가 전송되므로 이 이메일이 활성 이메일인지 확인하세요.
주소 및 도시*