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_ARRAY tanımı
  • bpf_tail_call helper
  • #pragma unroll ile 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.