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)
  • #pragma directive’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, unsigned type’lar
  • sizeof operator
  • 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:

  1. Bir sayının belirli bir bit’ini set/clear edin
  2. Bir IP adresini 4 oktet’e bölüştürün (>> ve & kullanarak)