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
| XDP | TC | |
|---|---|---|
| Context | xdp_buff | sk_buff |
| Hook noktası | Driver seviyesi | L2 sonrası |
| Hız | En hızlı | Daha yavaş |
| Yön | Sadece ingress | Ingress + Egress |
| Action’lar | XDP_DROP, XDP_PASS, XDP_TX, XDP_REDIRECT, XDP_ABORTED | TC_ACT_OK, TC_ACT_SHOT, TC_ACT_STOLEN, TC_ACT_REDIRECT |
| Mode’lar | Native, Offloaded, Generic | cls_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/bpffilesystem,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_inlinevs 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.
| Özellik | XDP | TC (cls_bpf) |
|---|---|---|
| Hook noktası | NIC driver, SKB allocation öncesinde | SKB oluşturulduktan sonra, qdisc katmanında |
| Yön | Yalnızca ingress | Hem ingress hem egress |
| Performans | Mümkün olan en hızlı; kernel network stack’inden önce çalışır | Daha yavaş; SKB overhead zaten ödenmiş |
| Kullanım senaryosu uyumu | DDoS drop, DNS filtering, L4 LB forwarding | Egress shaping, container networking, routing sonrası policy |
| SKB erişimi | SKB yok; ham xdp_md ile çalışır | Metadata, mark, priority ile tam SKB |
| Ne zaman gerekir | Line rate’te filtreleme veya yönlendirme istediğinizde | Egress 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_redirectile 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.