C Temelleri
Pointer'lar ve String'ler
Pointer’lar ve string’ler - BPF programları için EN KRİTİK C konusu. Kernel memory erişimi, packet parsing ve buffer okuma tamamen pointer’lar üzerinden yapılır.
1.8 Pointer’lar
Ön koşul: Önce array’leri tamamlayın.
- Pointer tanımlama ve dereference etme (
*ptr) - Pointer arithmetic (
ptr + 1’in ne anlama geldiği) void*kullanımı- Double pointer’lar (
**ptr)
BPF’te kritik pattern - bounds checking:
// XDP'de, packet data'ya erişmeden önce:
if (data + sizeof(struct ethhdr) > data_end)
return XDP_DROP;
Two-Stage Pointer Dereference
BPF’te sık karşılaşılan bir pattern - bir pointer array’deki her elemana erişim:
// 1. Array'den pointer'ı okuyun
bpf_probe_read_user(&arg_ptr, sizeof(arg_ptr), &argv[i]);
// 2. Pointer'dan string'i okuyun
bpf_probe_read_user_str(arg_buf, sizeof(arg_buf), arg_ptr);
BPF Memory Read Helper’ları
BPF’te doğrudan pointer dereference yasaklanmıştır. Helper fonksiyonlar kullanmalısınız:
bpf_probe_read_kernel(dst, size, src)- kernel memory’den okumabpf_probe_read_kernel_str(dst, size, src)- kernel memory’den string okumabpf_probe_read_user(dst, size, src)- user space memory’den okumabpf_probe_read_user_str(dst, size, src)- user space memory’den string okuma
İlgili eBPFHub alıştırmaları:
- “Reading event data” -
bpf_probe_read_kernel_strile kernel memory’den güvenli okuma - “Tracing a system call” -
bpf_probe_read_user_strile user space memory’den okuma - “Reading syscall arrays” - two-stage pointer dereference pratiği
- “Reading syscall buffers” - buffer pointer’ını map’te saklayıp exit’te
(void *)*buf_ptrile dereference etme
xdp-tutorial’da bakın: packet01-parsing/xdp_prog_kern.c:64-86 - data, data_end, bounds check.
Alıştırma:
- Bir int array oluşturun ve pointer ile gezinin
ptr + 1ileptr + sizeof(*ptr)arasındaki farkı anlayın (AYNI ŞEY DEĞİLDİR!)
1.9 String’ler
Ön koşul: Önce pointer’ları tamamlayın (string = char pointer).
char arrayvschar pointer- NULL terminator (
\0) - String fonksiyonları:
strlen,strcpy,strcmp
BPF’te sınırlı:
bpf_probe_read_strveyabpf_probe_read_user_strile okuma- Sabit boyut gerekli (verifier)
- Standart string fonksiyonları yok
BPF string helper’ları:
bpf_strncmp(s1, s1_sz, s2)- değişken bir string’i sabit bir değerle karşılaştırmabpf_strstr(haystack, needle)- substring arama (kernel 6.x+)bpf_strchr(str, c)- karakter arama (kernel 6.x+)
İlgili eBPFHub alıştırmaları:
- “Process context” -
bpf_strncmp()ile process name’e göre filtreleme - “Reading TCP packets” - HTTP header’larında
bpf_strstr()ile “Authorization: Bearer ” arama, token çıkarma
Alıştırma: Kendi strlen fonksiyonunuzu yazın (pointer ile gezin, \0’a kadar sayın).