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?
Hayır. DDoS engine ve DNS filter için XDP yeterlidir.
| XDP | TC | |
|---|---|---|
| Hook noktası | Driver seviyesi | L2 sonrası |
| Hız | En hızlı | Daha yavaş |
| Yön | Sadece ingress | Ingress + Egress |
| sk_buff | Hayır | Evet |
Kullanım senaryonuz: Ingress’te drop/pass - XDP idealdir.