XDP 소개--eBPF의 세계

이전 XDP, 트래픽 제어/tc/qdisc 및 Linux 네트워크 아키텍처(Netfilter 및 일반 네트워크의 패킷 흐름)의 netfilter를 통해 우리는 이미 XDP(eXpress Data Path)가 DPDK에 해당하는 빠른 데이터 처리 프레임워크의 집합이라는 것을 알고 있습니다. Linux Kernel에서 제공되는 프로그래밍 가능한 고성능 네트워크 패킷 처리 프레임워크입니다. 이를 통해 커널은 데이터 패킷이 L2(네트워크 카드 드라이버 계층)에 도달할 때 "규칙을 따르고" 처리를 위해 Linux 커널의 TCP/IP 프로토콜 스택에 들어갈 필요 없이 대상 고속 처리를 수행할 수 있습니다.

1. 다음 두 그림은 Linux 커널의 네트워크 데이터 처리 아키텍처에서 XDP의 위치를 ​​잘 보여줍니다.

여기에 이미지 설명 삽입
여기에 이미지 설명 삽입

2. XDP는 프로그래밍 가능하고 유연한 처리 방법을 제공합니다.XDP 프로그램은 XDP 작업 코드를 통해 메시지에 대한 드라이버 프로그램의 후속 처리 방법을 지정할 수 있습니다.

  1. XDP_ABORTED:
    패킷 폐기 XDP_DROP과의 차이점은 XDP_ABORTED가 trace_xdp_exception을 사용하여 오류 동작을 기록한다는 것입니다.
  2. XDP_DROP:
    패킷은 네트워크 카드 드라이버 계층에서 직접 폐기되며 데이터 패킷은 더 이상 처리를 위해 커널 TCP/IP 프로토콜 스택으로 전송되지 않습니다.
  3. XDP_PASS
    메시지는 처리를 위해 커널 TCP/IP 프로토콜 스택으로 계속 전송되며 이때 처리 방법은 기존 방법과 일치합니다.
  4. XDP_TX:
    메시지를 수신한 동일한 네트워크 카드에서 메시지를 보냅니다.
  5. XDP_REDIRECT:
    패킷을 다른 네트워크 카드 또는 CPU로 리디렉션합니다.AF_XDP와 결합하여 패킷을 사용자 공간으로 직접 보낼 수 있으며 DPDK와 유사하게 애플리케이션 수준에서 패킷을 직접 인수할 수 있습니다.

3. XDP에서 받은 패킷을 직접 폐기하는 예

이 예제는 Raspberry Pi 시스템에서 검증되었습니다.

3.1, clang 설치

sudo apt install clang

3.2, XDP 프로그램 작성

두 번째 메시지는 모두 폐기되고 나머지 메시지는 처리를 위해 커널 프로토콜 스택으로 전송됩니다.

// file: xdp-helloworld.c

#include <linux/bpf.h>

#ifndef __section
# define __section(NAME)                  \
   __attribute__((section(NAME), used))
#endif



__section("prog")
int xdp_drop(struct xdp_md *ctx)
{
    
    
    static int example_count = 1;

    example_count++;

    if (example_count%2)
    {
    
    
        return XDP_DROP;
    }
    else
    {
    
    
        return XDP_PASS;
    }
}

char __license[] __section("license") = "GPL";


3.3 컴파일 환경 설정 및 XDP 레벨 컴파일

환경이 arm 아키텍처인지 X86 아키텍처인지에 따라 /usr/include/xxxx/asm 다른 xxxx 아래의 asm 디렉토리를 /usr/include/asm 디렉토리에 소프트 링크해야 합니다.

cd /usr/include/

sudo ln -s ./arm-linux-gnueabihf/asm asm
sudo ln -s ./arm-linux-gnueabihf/bits/ bits

clang -O2 -Wall -target bpf -c xdp-helloworld.c -o xdp-helloworld.o

3.4 XDP 프로그램 로드 및 확인

테스트 환경은 다음과 같습니다.

                                                     +- RPi -------+          +- old pc1----+
                                                     |         Eth0+----------+ Eth0        |    
                 +- Router ----+                     |  DHCP server|          | 10.0.0.10   |
                 | Firewall    |                     |   10.0.0.1  |          |             |
(Internet)---WAN-+ DHCP server +-WLAN AP-+-)))   (((-+ WLAN        |          +-------------+
                 | 192.168.3.1 |                     |             |          
                 +-------------+                     |             |          +- old pc2----+
                                                     |         Eth1+----------+ Eth0        |   
                                                     |             |          | 10.0.0.4    |                                                       
                                                     +-------------+          |             |
                                                                              +-------------+

RPi의 Eth1에 XDP 프로그램을 로드하고 old pc2(10.0.0.2)에서 old pc1(10.0.0.4)을 ping합니다.위에서 언급한 XDP 프로그램이 성공적으로 로드된 후 RPi의 eth1은 다음과 같은 간격으로 패킷을 수신합니다. 하나 그냥 드롭. 우리는 이전 pc2에서 ping icmp 메시지를 관찰하고 wireshark를 사용하여 패킷을 캡처했으며 매 간격마다 응답이 수신되지 않았음을 발견했습니다. RPi의 Eth1이 일정 간격으로 수신된 패킷을 폐기했음을 나타냅니다.

sudo ip link set dev eth1 xdp obj xdp-helloworld.o

여기에 이미지 설명 삽입

3.5 XDP 프로그램 제거

위의 XDP 프로그램을 제거한 후 핑이 정상으로 돌아오는 것을 확인할 수 있습니다. 이는 RPi의 eth1이 정상 기능을 재개함을 의미합니다.

sudo ip link set dev eth1 xdp off

Supongo que te gusta

Origin blog.csdn.net/meihualing/article/details/130781598
Recomendado
Clasificación