XDP Packet Processing

Program Type'lar, Derin Dalis ve Debugging

BPF program type’ları, deep dive ve debugging teknikleri.

BPF Program Type’ları (XDP vs tc)

Kaynak: Cilium BPF Program Types

XDPTC
Contextxdp_buffsk_buff
Hook noktasıDriver seviyesiL2 sonrası
HızEn hızlıDaha yavaş
YönSadece ingressIngress + Egress
Action’larXDP_DROP, XDP_PASS, XDP_TX, XDP_REDIRECT, XDP_ABORTEDTC_ACT_OK, TC_ACT_SHOT, TC_ACT_STOLEN, TC_ACT_REDIRECT
Mode’larNative, Offloaded, Genericcls_bpf direct-action

DDoS Engine için: XDP native mode (en hızlı drop) DNS Filter için: tc egress hook (container policy enforcement)

xdp-tutorial’da inceleyin: advanced01-xdp-tc-interact - XDP ve TC etkileşimi, metadata passing.

Okuma: Cilium Network Concepts - XDP ve tc entegrasyonu.


BPF Deep Dive

Kaynak: Cilium BPF Architecture

Bu dökümanı XDP bölümünü tamamladıktan sonra okuyun:

  • Instruction Set: 11 register (r0-r10), 512-byte stack, calling convention
  • Helper Function’lar: bpf_map_lookup_elem, bpf_xdp_adjust_head, vb.
  • Map’ler: Tüm map type’ları (HASH, ARRAY, LPM_TRIE, PROG_ARRAY, vb.)
  • Object Pinning: /sys/fs/bpf filesystem, BPF_OBJ_PIN/BPF_OBJ_GET
  • Tail Call’lar: Program chaining, BPF_MAP_TYPE_PROG_ARRAY
  • BPF to BPF Call’lar: Function call’lar, always_inline vs normal
  • JIT: x86_64, arm64 JIT compiler
  • Hardening: JIT constant blinding, bpf_jit_harden
  • Offload’lar: NIC’e offload (Netronome nfp)
  • BPF sysctl’ler: bpf_jit_enable, bpf_jit_harden, unprivileged_bpf_disabled - onemli: BPF ile baslarken kontrol edilecek ilk ayarlar bunlardir

Debugging ve Testing

Kaynak: Cilium BPF Debug & Test

bpftool — yüklü program ve map’leri incele

# Yüklü tüm BPF programlarını listele
$ bpftool prog list
6: xdp  name xdp_filter  tag 3b185187f1855c4c
    loaded_at 2024-01-15T10:30:00+0000  uid 0
    xlated 296B  jited 184B  memlock 4096B

# Bir map'in içeriğini döküm al
$ bpftool map dump id 42
key: 0a 00 01 01  value: 00 00 00 05
key: c0 a8 00 01  value: 00 00 00 12

# Program istatistiklerini göster (kernel.bpf_stats_enabled=1 gerektirir)
$ bpftool prog profile id 6 duration 5
          run_cnt  run_time_ns
           154231       892041

bpf_printk — BPF programlarından debug çıktısı

SEC("xdp")
int xdp_debug(struct xdp_md *ctx) {
    void *data = (void *)(long)ctx->data;
    void *data_end = (void *)(long)ctx->data_end;

    struct ethhdr *eth = data;
    if (data + sizeof(*eth) > data_end)
        return XDP_PASS;

    bpf_printk("pkt proto=%x len=%d",
               bpf_ntohs(eth->h_proto),
               data_end - data);
    return XDP_PASS;
}

Çıktıyı oku:

$ cat /sys/kernel/debug/tracing/trace_pipe
<idle>-0  [001] ..s1  1234.567890: bpf_trace_printk: pkt proto=800 len=74

llvm-objdump — BPF bytecode’u incele

$ llvm-objdump -S xdp_prog.o

Disassembly of section xdp:
0000000000000000 <xdp_filter>:
       0: r6 = r1                   ; ctx'i kaydet
       1: r2 = *(u32 *)(r6 + 0)    ; data
       2: r3 = *(u32 *)(r6 + 4)    ; data_end
       3: r4 = r2 + 14             ; data + sizeof(ethhdr)
       4: if r4 > r3 goto +8       ; sınır kontrolü

Ne zaman kullanılır: Verifier hataları aldığınızda, performans sorunlarıyla karşılaştığınızda veya program davranışını anlamanız gerektiğinde.


TC Hook Gerekli mi?

Hayır. DDoS engine ve DNS filter için XDP yeterlidir.

XDPTC
Hook noktasıDriver seviyesiL2 sonrası
HızEn hızlıDaha yavaş
YönSadece ingressIngress + Egress
sk_buffHayırEvet

Kullanım senaryonuz: Ingress’te drop/pass - XDP idealdir.