Ileri Konular ve Go Entegrasyonu
Tracing Mekanizmalari ve XDP Root Pattern
Tracing mekanizmaları ve XDP root pattern - production eBPF için ileri konular.
Tracing Mekanizmaları
Lab: eBPF Tracing
XDP için zorunlu değil ama faydalı:
- Tracepoint vs Kprobe vs Fprobe farkları
- BTF destekli tracepoint’ler
- Performans karşılaştırması
Not: eBPFHub egzersizlerinde Network Tracing bölümünde kprobe pratiği yaptınız. Bu lab daha derin bir inceleme.
XDP Root Pattern (Program Chaining)
Kaynak: katran/lib/bpf/xdp_root.c (40 satır)
Aynı interface üzerinde birden fazla XDP programını zincirleme:
struct {
__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
__uint(max_entries, MAX_PROGS);
__uint(key_size, sizeof(__u32));
__uint(value_size, sizeof(__u32));
} jmp_table SEC(".maps");
SEC("xdp")
int xdp_root(struct xdp_md *ctx) {
#pragma unroll
for (__u32 i = 0; i < MAX_PROGS; i++) {
bpf_tail_call(ctx, &jmp_table, i);
}
return XDP_PASS;
}
Öğrenecekleriniz:
BPF_MAP_TYPE_PROG_ARRAYtanımıbpf_tail_callhelper#pragma unrollile bounded loop- Birden fazla XDP programını zincirleme
Nasıl çalışır: bpf_tail_call başarılı olduğunda, yürütme hedef programa atlar ve asla geri dönmez. Slot boşsa (o index’te program yüklenmemişse), sessizce sonraki iterasyona devam eder. Sondaki XDP_PASS fallback’tir — yalnızca hiçbir program yüklenmemişse ulaşılır.
Programları jump table’a yükleme (Go tarafı)
// Root programı yükledikten sonra jump table'ı doldur:
err := objs.JmpTable.Put(uint32(0), objs.XdpDdosFilter) // slot 0: DDoS
err = objs.JmpTable.Put(uint32(1), objs.XdpDnsFilter) // slot 1: DNS
// Root program artık şu sırayla zincirler: DDoS → DNS → XDP_PASS
Ne zaman kullanılır: DDoS engine + DNS filter’ı aynı interface üzerinde çalıştırmak istediğinizde.
xdp-tutorial’da keşfedin: experiment01-tailgrow - tail call / program chaining deneyleri.