5 typedef unsigned char u8;
6 typedef unsigned short u16;
9 * Función para calcular checksum.
11 * Para verificar un checksum, hay que poner los datos con checksum incluído y
12 * la suma final debe dar 0.
14 * Al aplicar el checksum al paquete IP, hay que hacerlo a TODA la cabecera,
15 * incluyendo el src y dst y el checksum mismo (se toma todo 0 al checksum a la
16 * hora de calcularlo).
18 * @param buf array con palabritas de 16 bits.
19 * @param len tamaño del array (en cantidad de elementos).
21 u16 chksum(u16* buf, u8 len)
27 /* suma de complemento a 1 */
29 if (sum < buf[i]) ++sum; /* corrección de carry (hubo OV) */
35 * Función para convertir un string en un array de palabras de 16 bits.
37 u8 strtou16(char* buf, u8 len, u16* ret)
40 for (i = 0; i < len; i += 4)
42 char tmp[5] = { buf[i], buf[i+1], buf[i+2], buf[i+3], '\0' };
43 ret[i/4] = strtoul(tmp, NULL, 16);
48 int main(int argc, char* argv[])
55 fprintf(stderr, "Uso: %s string_hexa_con_tamaño_multiplo_de_4\n", argv[0]);
58 len = strtou16(argv[1], strlen(argv[1]), buf);
59 sum = chksum(buf, len);
62 printf("%hX\n", chksum(buf, len));