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?

Kısa cevap: Hayır. Bu yol haritasındaki DDoS engine, DNS filter ve L4 load balancer projeleri için XDP yeterlidir. TC (Traffic Control) BPF hook’larını öğrenmek zorunda değilsiniz.

ÖzellikXDPTC (cls_bpf)
Hook noktasıNIC driver, SKB allocation öncesindeSKB oluşturulduktan sonra, qdisc katmanında
YönYalnızca ingressHem ingress hem egress
PerformansMümkün olan en hızlı; kernel network stack’inden önce çalışırDaha yavaş; SKB overhead zaten ödenmiş
Kullanım senaryosu uyumuDDoS drop, DNS filtering, L4 LB forwardingEgress shaping, container networking, routing sonrası policy
SKB erişimiSKB yok; ham xdp_md ile çalışırMetadata, mark, priority ile tam SKB
Ne zaman gerekirLine rate’te filtreleme veya yönlendirme istediğinizdeEgress hook’ları veya SKB-level feature’lara ihtiyacınız olduğunda (örneğin skb->mark)

Bu yol haritası için XDP neden yeterli:

  • DDoS mitigation hızlı ingress drop gerektirir. XDP’nin XDP_DROP’u en hızlı path’tir.
  • DNS filtering gelen UDP query’leri inceler, tamamen ingress, egress hook gerekmez.
  • L4 load balancing, kernel SKB allocate etmeden önce paketleri bpf_redirect ile iletir, bu da tüm performans avantajının kendisidir.
  • TC, egress policy’lere ihtiyaç duyduğunuzda (örneğin Cilium’un container networking’i) veya SKB metadata’sını okumak gerektiğinde devreye girer. Bu, bu yol haritasının kapsamı dışındadır.

İleride container networking üzerinde çalışırsanız veya egress filtering’e ihtiyaç duyarsanız, o noktada TC’ye dönün. Şimdilik tamamen XDP’ye odaklanın.