Cabezales ICMP

Cabezales ICMP

de Matias Cikurel Tashiro -
Número de respuestas: 8

Buenas, viendo el header ICMP que nos dan en el código (sr_icmp_hdr ) y viendo también el formato de los headers de echo reply y time exceeded en Network Sorcery, vemos que en el código nos hacen falta campos, por ejemplo identificador, numero de secuencia y data en el caso de echo reply. 

Cual seria la forma de encarar esto?

Gracias. 

En respuesta a Matias Cikurel Tashiro

Re: Cabezales ICMP

de Leonardo Vidal -

Hola.

A veces "no queda más remedio" que ir a leer las RFCs :))

La RFC 792, al respecto de los mensajes Echo y Echo Reply, dice:

Identifier

If code = 0, an identifier to aid in matching echos and replies, may be zero.

Sequence Number

If code = 0, a sequence number to aid in matching echos and replies, may be zero.

Description

The data received in the echo message must be returned in the echo reply message.

The identifier and sequence number may be used by the echo sender to aid in matching the replies with the echo requests. For example, the identifier might be used like a port in TCP or UDP to identify a session, and the sequence number might be incremented on each echo request sent. The echoer returns these same values in the echo reply.

Code 0 may be received from a gateway or a host.

Por lo tanto, una manera adecuda de encararlo podría ser, enviar Echos desde el cliente y los servidores, capturarlos y analizarlos para ver qué "viaja" en cada campo, y con ello (más lo que dice la RFC), trabajar en la solución a implementar en el router.

Saludos.

En respuesta a Leonardo Vidal

Re: Cabezales ICMP

de Matias Cikurel Tashiro -
Bien, hasta ahí estamos de acuerdo. Sin embargo, puede que no haya sido claro con la pregunta. 

Tomando como ejemplo el mensaje time exceeded:

El RFC dice lo siguiente: 

Time Exceeded Message

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             unused                            |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |      Internet Header + 64 bits of Original Data Datagram      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Viendo esto, entendemos que el cabezal ICMP en el código debería soportar esta estructura para el paquete. 

struct sr_icmp_hdr {
  uint8_t icmp_type;
  uint8_t icmp_code;
  uint16_t icmp_sum;  
}

No comprendemos si hay que modificar el código que nos entregaron, concatenar los campos que no aparecen en la estructura o ignorarlos. Vemos en la captura, que la solución incluye los campos faltantes. Por lo tanto creemos que ignorarlos no seria la solución.

Saludos. 

En respuesta a Matias Cikurel Tashiro

Re: Cabezales ICMP

de Matias Richart -

Hola. Si entiendo bien la pregunta, lo que necesitan es esto ¿no?

Este struct también esta definido en sr_protocol.h

/* Structure of a type3 ICMP header
 */
struct sr_icmp_t3_hdr {
  uint8_t icmp_type;
  uint8_t icmp_code;
  uint16_t icmp_sum;
  uint16_t unused;
  uint16_t next_mtu;
  uint8_t data[ICMP_DATA_SIZE];

}

En respuesta a Matias Richart

Re: Cabezales ICMP

de Sofia Tito Virgilio Rodriguez -

Buenas, 

Es cierto que esa estructura podría adaptarse también para el mensaje Time Exceeded interpretando el campo next_mtu de manera diferente dependiendo del ICMP que se esté construyendo. 
Pero en el caso del mensaje Echo Reply:

Echo or Echo Reply Message

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Identifier          |        Sequence Number        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Data ...
   +-+-+-+-+-
 

Sería correcto utilizar también los campos unused y next_mtu como si fuesen identifier y sequence number respectivamente? 

Además, la data que lleva el paquete según entendí del RFC:

The data received in the echo message must be returned in the echo
      reply message.
Ya no es cabezal_IP + 8 bytes, sino que pasa a ser toda la data que se haya recibido en el Echo Request, por lo que no sé si nos serviría el campo data para adaptarlo a este caso. 


Cómo deberíamos proceder entonces en el caso Echo Reply? Concatenando los campos faltantes al cabezal sr_icmp_hdr o intentando adaptar el cabezal sr_icmp_t3_hdr ?


Saludos. 

En respuesta a Sofia Tito Virgilio Rodriguez

Re: Cabezales ICMP

de Matias Richart -

Hola.

Lo importante es buscar la manera mas fácil para acceder a esos lugares de memoria.

En este caso unused y next_mtu son de 16 bits por lo que se ajustan bien a este caso.

Igualmente, dado que hay que responder con los mismos datos que llegaron en el request, creo que lo mas sencillo es tomar el paquete recibido, cambiarle lo que corresponda a nivel de IP e ICMP y reenviarlo.

Notar que Identifier y Sequence Number del mensaje de reply son los mismo que en el request.

Saludos