Až Vám zčerná obrazovka, přejděte na Linux!

Proč používat Linux

úterý 8. prosince 2009

Invalid checksum na UDP paketech

Nějakou dobu jsem laboroval s tím, že mi javovská aplikace běžící na IBM xSeries x3650 s OpenSuSE 11.0 generovala invalidní UDP pakety. Hlásil mi to WireShark (dříve ethreal).
Firmware jednočipu G2 to nebyl sto sežrat a pokud jsem na něj chtěl data dostat, musel jsem to vyřešit. Tak jsem Gůglil a zkoušel...

Výsledek mého snažení lze shrnout do těchto bodů:
  • Je to víc jak rok známý problém a řeší se, ale ještě není vyřešen.
  • Problém není v Javě, ale někde mezi jádrem a síťovkou. Stejný kernel na jiné síťovce funguje, jsou prý kernely, které s těmito síťovkami fungují. V tomto případě to nechodí na Broadcom Corporation NetXtreme II BCM5708 Gigabit Ethernet (rev 12)
  • Na vině je chybné generování checksumu síťovkou, neboť při použití Raw Socket (což Java dělá), generuje checksum právě síťovka (nebo její modul, nevím, ve zdrojácích jsem nebyl)
  • Řešením je použití TCP checksum offload, které vypíná ono generování kontrolního součtu.
  • Na Linuxu se k vypnutí použije ethtool -K ethN rx off tx off, kde ethN odpovídá konkrétní síťovce, kde to chcete vypnout (tedy eth0, eth1,...)

Třeba to někomu pomůže...

1 komentář:

Anonymní řekl(a)...

Díky za článek. Pomohl. Řeším to samé s CentOS/RHEL a BINDem.

JoLa