개요

Express Data Path (XDP)는 개발자가 network program을 eBPF로 작성하여서 NIC, Driver, Socket단에 삽입할 수 있도록 하고, 커널에서 유저로의 전환 없이, Linux network stack을 타기 전에 매우 이른 시점에 Network program을 정의할 수있도록 한다. 이를 통해서 Overhead를 줄여서 high-end, flxible network programming을 가능하게 하였다. XDP는 리눅스 커널 4.18부터 도입되었으며, 많은 Production level에서 사용되고 있다. 사용예시로는, load balancing, packet filtering, user-defined packet forwarding, security, network tracing등이 있다.

Return value

  • XDP_ABORTED: 패킷을 버리고 xdp_exception을 발생시킴
  • XDP_DROP: 패킷을 버림
  • XDP_PASS: 패킷을 커널로 보냄
  • XDP_TX: 패킷을 수신된 인터페이스로 재전송 (Forward packet to the same NIC)
  • XDP_REDIRECT: 패킷을 다른 인터페이스(NIC)로 전달

예시

#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>

SEC("xdp_prog1")
int xdp_prog_drop(struct xdp_md *ctx) {
        return XDP_DROP;
}

char _license[] SEC("license") = "GPL";

// Build XDP to bpf object file
clang -O2 -target bpf -c xdp_kern.c -o xdp_kern.o
// Load XDP program to socket buffer
sudo ip link set eno2 xdpgeneric obj xdp_kern.o sec xdp_prog1

References

  1. https://github.com/ahn9807/eBPF-Tutorial.git