C Temelleri
Program Yapisi, Type'lar ve Operator'ler
Bu bolum C’yi BPF programlama perspektifinden ogretir. Kavramlar standart C’dir, ancak her konu BPF’e ozgu kisitlamalar ve pattern’lerle birlikte sunulur. XDP/networking ile ilgili olmayan konular acikca isaretlenmistir.
C programlarinin yapi taslari: preprocessor’lar, data type’lar ve operator’ler. BPF programlari C ile yazildigi icin bu temeller kritik oneme sahiptir.
Neleri Atlayabilirsiniz
Bu roadmap XDP/networking eBPF programlarına odaklanmaktadır. Asagidaki C konulari bu scope’ta gerekli degildir. Facebook Katran, Cilium ve Cloudflare production BPF kodlarina karsi dogrulanmistir.
| Konu | Neden Gerekli Değil |
|---|---|
time.h / date-time fonksiyonları | BPF programları libc time fonksiyonları yerine bpf_ktime_get_ns() kullanır |
File I/O (fopen, fread, fwrite) | BPF programları dosya sistemine erişemez; tüm state map’ler üzerinden geçer |
Dynamic memory (malloc, free) | XDP/networking BPF programları yalnızca stack ve map tabanlı allocation kullanır* |
| Recursion | Verifier geriye doğru atlayışları reddeder; #pragma unroll ile bounded loop kullanın |
| Floating point arithmetic | BPF ISA’da floating-point instruction yoktur; integer math kullanın |
Signal handling (signal.h) | Yalnızca user-space loader kodunda geçerlidir, BPF programlarında değil |
Multi-threading (pthread) | BPF programları çağrı başına single-threaded’dir; concurrency per-CPU map’ler ile yönetilir |
Standard I/O (printf, scanf) | Debug output için bpf_printk() kullanın; kernel context’te standard I/O yoktur |
struct tm, strftime | BPF’te mevcut değil; timestamp’ler ham nanosaniye değerleridir |
| Rastgele sayı üretimi | BPF’te bpf_get_prandom_u32() vardır; libc random fonksiyonlarına gerek yoktur |
| Binary search tree | Prefix matching için BPF_MAP_TYPE_LPM_TRIE kullanın; BPF map’ler manuel aramayı gereksiz kılar |
| Linear/binary search algoritmaları | BPF map’ler O(1) hash lookup sağlar; arama algoritmalarını manuel uygulamaya gerek yoktur |
| Karmaşık veri yapıları (linked list, tree) | BPF map’ler (hash, array, LRU, LPM trie) klasik veri yapılarının yerini alır* |
* Kernel 6.1+ notu: Modern kernel’lar heap allocation için bpf_obj_new(), linked list için bpf_list_head (6.1+) ve red-black tree için bpf_rbtree (6.3+) sunar. Bunlar sched_ext (custom CPU scheduling) gibi ileri BPF alt sistemlerinde kullanılır, tipik XDP/networking programlarında değil. Bu roadmap’in ötesine geçtiğinizde bu konulara geri dönün.
Opsiyonel ama pointer pratiği için faydalı: Linked list ve stack/queue implementasyonları. Bunları XDP’de kullanmayacaksınız, ancak iyi struct + pointer pratiği sağlarlar.
1.1 Program Yapısı ve Preprocessor’lar
#include- header dosyalarını dahil etme#define- macro tanımlama#ifndef/#endif- header guard’lar (çifte dahil etmeyi önler)#pragmadirective’leri - compiler için özel talimatlar- Macro fonksiyonlar - compile-time kod üretimi
BPF’te kullanımı:
SEC()macro ->__attribute__((section(NAME), used))#include "ep_platform.h"- eBPFHub platform header’ı#pragma unroll- bounded loop optimizasyonu
#define SEC(NAME) __attribute__((section(NAME), used))
SEC("xdp")
int xdp_prog(struct xdp_md *ctx) { ... }
// -> .xdp section'a yerleştirir, linker'ın discard etmesini önler
eBPFHub: Chapter 0 -> “Platform overview” alıştırmasında SEC() macro, #include kullanımı ve ilk BPF program yapısını göreceksiniz.
xdp-tutorial’da bakın: basic01-xdp-pass/xdp_pass_kern.c - SEC() macro’sunun nasıl tanımlandığını görün.
Alıştırma: Kendi header dosyanızı yazın, header guard ekleyin ve bir macro tanımlayın.
1.2 Data Type’lar ve Format Specifier’lar
int,char,short,long,unsignedtype’larsizeofoperator- Type casting
- Format specifier’lar:
%d,%u,%x,%s,%p,%llu
BPF’te kullanılan type’lar: __u8, __u16, __u32, __u64, __s32, __be16
Format specifier’lar bpf_printk için kritiktir:
%d-> int%u-> unsigned int%x-> hex%llu->__u64%s-> string (sınırlı)
eBPFHub: “Process context” alıştırmasında bpf_get_current_comm(&buf, sizeof(buf)) ile char[16] buffer kullanımını göreceksiniz.
xdp-tutorial’da bakın: common/xdp_stats_kern_user.h - struct datarec tanımı.
Alıştırma: sizeof kullanarak farklı type’ların boyutlarını yazdırın ve printf ile formatlayın.
1.3 Operator’ler ve Bitwise İşlemler
- Aritmetik:
+,-,*,/,% - Bitwise:
&,|,^,~,<<,>> - Karşılaştırma:
==,!=,<,>,<=,>= - Mantıksal:
&&,||,!
BPF’te kritik: Bit masking (VLAN ID’lerini çıkarma, flag kontrolleri)
eBPFHub: “Reading event data” alıştırmasında __data_loc field decode işlemi ile bitwise operasyonları pratik yapacaksınız: alt 16 bit = offset, üst 16 bit = length.
offset = loc & 0xFFFF;
len = loc >> 16;
Alıştırma:
- Bir sayının belirli bir bit’ini set/clear edin
- Bir IP adresini 4 oktet’e bölüştürün (
>>ve&kullanarak)