백서

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

고급 패시브 히트싱크가 장착된 XUP-P3R

개요

비트웨어의 SmartNIC 셸과 비트웨어의 루프백 예제의 기능 중 하나는 패킷에서 프로토콜 필드를 추출하는 패킷 파서/분류기입니다. 이 백서에서는 파서에 대해 설명할 뿐만 아니라 HLS를 사용하여 파서를 빌드하고 구성하는 것이 P4 언어를 사용하는 것보다 어떻게 더 나은 구현 결과를 가져오는지 설명하고자 했습니다. 파서 코드는 루프백 예제(2020년 1월 제공)의 일부로 AMD UltraScale+ 소유자에게 BittWare 개발자 웹사이트에서 무료로 제공됩니다.

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

현재 BittWare의 SmartNIC Shell의 파서 구성 요소는 AMD HLS C++ 개발 환경을 사용하여 빌드됩니다. 하지만 이전 버전의 BittWare SmartNIC Shell은 AMD SDNet 툴을 통해 P4 언어를 사용했습니다.

P4를 사용하는 이유 중 하나는 상용 인텔 서버에서 소프트웨어 정의 네트워킹(SDN)을 도입하는 사람들 사이에서 인기 있는 새로운 표준이기 때문입니다. 하지만 AMD는 나중에 SDNet의 가용성을 제한했습니다. P4는 특히 SmartNIC Shell의 최종 사용자를 위한 것이었기 때문에 이러한 제한으로 인해 보다 개방적인 솔루션을 찾게 되었습니다. HLS를 사용한 RSS 구현의 성공 이후, 우리는 동일한 HLS 접근 방식(특히 자일링스 HLS C++ 환경)을 사용하여 SmartNIC Shell 파서를 다시 구현해야겠다는 동기를 부여받았습니다.

이 백서의 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++를 사용하는 방법에 대한 설명이 여러분에게 적합한 접근 방식을 평가하는 데 도움이 되기를 바랍니다.

마지막으로 한 가지 참고할 사항은 FPGA 카드 간의 이식성에 관한 것입니다. HLS는 AMD FPGA 기반 카드 간에는 변경이 거의 필요 없는 간편한 방법을 제공합니다. 520N-MX와 같은 인텔 기반 카드로 이동하려면 특히 컴파일러 프래그마와 관련하여 소스 코드 변경이 필요합니다. 그러나 기본 개념은 동일합니다. 두 경우 모두 유니티는 FPGA 번역 문제에 대한 지식을 바탕으로 C++를 구조화하고 있습니다. 임의의 C++ 코드는 FPGA 내부에서 매우 제대로 실행되지 않습니다. 그러나 프래그마로 재구조화되고 기름을 부은 C++ 코드는 매우 잘 작동합니다. AMD나 Intel에 필요한 변경 사항은 매우 유사하지만 표현 방식만 약간 다를 뿐입니다.

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

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

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

PDF 다운로드 요청

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

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

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