/** protocolos soportados */
enum { ICMP = 0x01, UDP = 0x11 };
-extern byte ip_addr_local[IP_ADDR_SIZE];
+byte ip_addr_local[IP_ADDR_SIZE];
-extern byte ip_addr_remote[IP_ADDR_SIZE];
+byte ip_addr_remote[IP_ADDR_SIZE];
byte ip_packet_len;
bool ip_proto_icmp;
+/* para calcular checksum */
uint16 checksum;
+/* agrega un word al checksum calculado */
static void sum(uint16 w)
{
checksum += w;
/** @file
* Datagrama UDP.
*
+ * <pre>
* 0 7 8 15 16 23 24 31
* +--------+--------+--------+--------+
* | Source | Destination |
* |
* | data octets ...
* +---------------- ...
+ * </pre>
*
* Aceptamos sólo datagramas UDP que vayan a el puerto de nuestra aplicación y
* cuyo tamaño sea menor a 255. El resto es descartado.
* El Length es tanto de la cabecera como datos, por lo tanto el tamaño mínimo
- * es 8. El checksum no se calcula ni se verifica, ya que sabemos que la capa
- * inferior (ethernet) tiene verificación de errores de los datos.
+ * es 8.
+ *
+ * El checksum se calcula utilizando algunos datos de la capa inferior e incluye
+ * a los datos. Entonces es calculado sobre el siguiente paquete 'virtual':
+ *
+ * <pre>
+ * 0 7 8 15 16 23 24 31
+ * +--------+--------+--------+--------+
+ * | ip source address |
+ * +--------+--------+--------+--------+
+ * | ip destination address |
+ * +--------+--------+--------+--------+
+ * | zero |protocol| UDP length |
+ * +--------+--------+--------+--------+
+ * | Source | Destination |
+ * | Port | Port |
+ * +--------+--------+--------+--------+
+ * | | |
+ * | Length | Checksum |
+ * +--------+--------+--------+--------+
+ * |
+ * | data octets ...
+ * +---------------- ...
+ * </pre>
*/
/** Puerto UDP nuestro */