C Temelleri
Program Yapisi, Type'lar ve Operator'ler
C programlarının yapı taşları: preprocessor’lar, data type’lar ve operator’ler. BPF programları C ile yazıldığı için bu temeller kritik öneme sahiptir.
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)