Tanto o código anterior, obtido da RFC 1701, quanto o código atual contém um erro sutil: Os "carry" bits, entre duas acumulações não são considerados!
Usei a rotina como referência de otimização num material que estou escrevendo e percebi o bug. Acontece que, na linguagem C, o bit de carry é ignorado em operações com inteiros. Se você fizer:
unsigned short a, b, c;
a = b = 0xffff;
c = a + b;
A variável 'c' conterá 0xfffe e não 0x1fffe, como deveria ser. O bit adicional é simplesmente jogado fora...
Para meus propósitos reescrevi a rotina em assembly (para x86-64) e obtive 130% de ganho de performance. Que vale à pena, já que cksum é chamada na confecção de todo pacote...
Se houver interesse, posso colocar ambas as rotinas no T50, compiladas de acordo com a arquitetura do usuário... Uma em C (mais genérica) e outra em ASM (usando NASM)...
A correção tá lá no GITHUB (sem o código em ASM)...
Desculpem por ter passado tanto tempo sem dar atenção ao projeto...
[]s
Fred