eBPF prog en XDP droppe des paquets random sur mon worker K8s

Posté par nicolas-huet le 29/11/2025
RÉSOLU

nicolas-huet

Membre depuis le 29/09/2024

actif

yo la team j'ai un souci bizarre on a un prog eBPF en mode XDP sur nos workers K8s pour des raisons de perf ça devrait juste forwarder mais ça droppe des paquets aléatoirement pour certains pods pas tous c super chiant à débugger. la CNI c cilium en tunnel. des idées ?

int xdp_prog_simple(struct xdp_md *ctx)
{
  void *data_end = (void *)(long)ctx->data_end;
  void *data = (void *)(long)ctx->data;
  struct ethhdr *eth = data;

  if (data + sizeof(struct ethhdr) > data_end)
    return XDP_DROP;

  // Basic check for IPv4 for simplicity
  if (bpf_ntohs(eth->h_proto) == ETH_P_IP)
    return XDP_PASS;

  return XDP_DROP; // Default drop if not IP or something else unexpected
}

Commentaires

franck20

Membre depuis le 16/05/2020

actif secouriste

salut ptete un souci d'ordre d'exécution ou un truc avec la CNI. t'as regardé les stats de ton prog avec bpftool prog show ID. et voir si t'as des erreurs ou des drops explicites dans les counters. et un perf record pour les tracepoints réseau ça dirait quoi

anne39

Membre depuis le 29/09/2019

actif secouriste

c'est cilium en mode xdp native ou generic? des fois ça interagit mal si les chaines sont pas claires. t'as des policy BPF qui pourraient interférer

nicolas-huet

Membre depuis le 29/09/2024

actif

cilium est en generic mode. les compteurs XDP montrent des drops sur la fonction xdp_drop mais j'arrive pas à voir pourquoi. pas de policy spécifiques à part du routing basique. les paquets droppés sont légitimes c'est pas du random garbage.

franck20

Membre depuis le 16/05/2020

actif secouriste

hmm generic mode c'est plus compliqué. ton prog s'attend à quoi en fait ? un paquet ethernet pur ? si cilium encapsule avant ton XDP prog voit ptete pas le header eth ou un offset décalé. genre un paquet tunnellisé gre ou vxlan arrive avec un header différent

nicolas-huet

Membre depuis le 29/09/2024

actif

oui exact j'y pensais. cilium c'est du vxlan en général. donc mon prog simple s'attend à un ethhdr direct. c'est ptete ça le hic. comment on gère ça proprement en xdp ?

franck20

Membre depuis le 16/05/2020

actif secouriste

faut parser le header du tunnel avant. genre detecter si c'est vxlan u. t'auras un outer eth puis outer ip puis outer udp puis vxlan header puis le inner eth. ton prog doit ignorer tout ça ou décap avant de regarder le inner eth.

struct ethhdr *eth;
struct iphdr *iph;
struct udphdr *udph;
struct vxlanhdr *vnh;

// ... parse outer eth/ip/udp ...

if (udph->dest == bpf_htons(VXLAN_PORT)) {
  // Found VXLAN, now parse inner packet
  eth = (void *)udph + sizeof(struct udphdr) + sizeof(struct vxlanhdr);
  if ((void *)eth + sizeof(struct ethhdr) > data_end)
    return XDP_DROP;

  // Now eth points to the inner Ethernet header
  if (bpf_ntohs(eth->h_proto) == ETH_P_IP)
    return XDP_PASS;
}

nicolas-huet

Membre depuis le 29/09/2024

actif

ok je vois. c'est un peu plus lourd que prévu. je vais tenter de modifier le prog pour qu'il check les headers vxlan. ça veut dire que pour les paquets non tunnellisés il va se prendre les pieds dans le tapis aussi.

franck20

Membre depuis le 16/05/2020

actif secouriste

non tu peux faire un check conditionnel. si c vxlan tu pars le tunnel sinon tu pars le header eth normal. faut être précis avec les offsets. c le challenge des progs XDP qui doivent être hyper rapides

anne39

Membre depuis le 29/09/2019

actif secouriste

ouais et n'oublie pas les bpf_printk pour débugger dans dmesg ça aide énormément quand tu galères avec les offsets

nicolas-huet

Membre depuis le 29/09/2024

actif

j'ai mis ça en place mais j'ai encore des drops. je pense que mon offset est pas bon après le vxlan hdr. je suis toujours sur la même base

franck20

Membre depuis le 16/05/2020

actif secouriste

t'as essayé de choper un paquet droppé avec tcpdump sur l'interface avant xdp et un autre après pour comparer les headers? ou bpftrace pour tracer les offsets exacts que ton prog voit

nicolas-huet

Membre depuis le 29/09/2024

actif

j'ai fait un tcpdump sur la veth des pods et sur l'interface du node. les paquets qui arrivent au node sont bien encapsulés en vxlan mais certains ont un offset bizarre après le vxlan header genre le ethhdr n'est pas là où je l'attends.

franck20

Membre depuis le 16/05/2020

actif secouriste

c'est quelle version de kernel? et de cilium? des fois il y a des variations dans l'encapsulation ou le hardware offload qui peut foutre le boxon

nicolas-huet

Membre depuis le 29/09/2024

actif

j'ai trouvé ! c'était ma faute j'avais mal géré la taille du vxlan header dans le calcul de l'offset pour certains cas spécifiques de fragmentation. un petit ajustement et c niquel. putain la galère pour un offset.

nicolas-huet

Membre depuis le 29/09/2024

actif

tout est rentré dans l'ordre les drops ont disparu. merci à tous pour l'aide ça m'a bien aiguillé sur les offsets et les headers de tunnel. fallait juste que je recalcule ma logique de parsing.

Laisser une réponse

Vous devez être connecté pour poster un message !

Rejoindre la communauté

Recevoir les derniers articles gratuitement en créant un compte !

S'inscrire