- /* checksum */
- net_getb(); net_getb(); /* TODO: verificar checksum */
- /* obtenemos IP de origen */
- for (c = 0; c < IP_ADDR_SIZE; ++c)
- ip_addr_remote[c] = net_getb();
- /* vemos si el paquete es para nosotros (ningún soportar broadcast =) */
- for (c = 0; c < IP_ADDR_SIZE; ++c)
- if (ip_addr_local[c] != net_getb())
- return false; /* no es para nosotros */
+ /* sigo calculando checksum */
+ sum(WORD(h, l));
+ /* obtenemos checksum y seguimos el cálculo */
+ sum(net_getw());
+ /* obtenemos IP de origen (mientras seguimos calculando el checksum) */
+ for (l = 0; l < IP_ADDR_SIZE; ++l)
+ {
+ ip_addr_remote[l] = net_getb();
+ if (l % 2)
+ sum(WORD(h, ip_addr_remote[l]));
+ else
+ h = ip_addr_remote[l];
+ }
+ /* vemos si el paquete es para nosotros (ningún soportar broadcast =)
+ * (mientras seguimos calculando el checksum) */
+ for (l = 0; l < IP_ADDR_SIZE; ++l)
+ {
+ if (ip_addr_local[l] != net_getb())
+ return false; /* drop (no es para nosotros) */
+ if (l % 2)
+ sum(WORD(h, ip_addr_local[l]));
+ else
+ h = ip_addr_local[l];
+ }
+ /* verificamos checksum */
+ if (~checksum)
+ return false; /* checksum malo, drop */