|
|
|
|
127
|
|
127
|
|
128
|
1. Estudia el archivo `ethernet_hdr.h`. Este archivo contiene la siguiente definición de la estructura de datos que representa un encabezado de Ethernet:
|
128
|
1. Estudia el archivo `ethernet_hdr.h`. Este archivo contiene la siguiente definición de la estructura de datos que representa un encabezado de Ethernet:
|
129
|
|
129
|
|
130
|
- #define ETHER_ADDR_LEN 6
|
|
|
|
|
130
|
+ #define ETHER_ADDR_LEN 6
|
131
|
|
131
|
|
132
|
- struct sniff_ethernet {
|
|
|
|
|
132
|
+ struct sniff_ethernet {
|
133
|
u_char ether_dhost[ETHER_ADDR_LEN]; /* direccion destino */
|
133
|
u_char ether_dhost[ETHER_ADDR_LEN]; /* direccion destino */
|
134
|
u_char ether_shost[ETHER_ADDR_LEN]; /* direccion fuente */
|
134
|
u_char ether_shost[ETHER_ADDR_LEN]; /* direccion fuente */
|
135
|
u_short ether_type; /* IP? ARP? RARP? etc */
|
135
|
u_short ether_type; /* IP? ARP? RARP? etc */
|
136
|
- };
|
|
|
|
|
136
|
+ };
|
137
|
|
137
|
|
138
|
El encabezado de Ethernet de arriba es usado para decodificar la parte Ethernet de los datos crudos en cada paquete. Este se compone de la dirección MAC fuente (`ether_shost`, 6 bytes), la dirección MAC destino (`ether_dhost`, 6 bytes), y el tipo de paquete de Ethernet (`ether_type`, 2 bytes) que es usado para determinar si el paquete es un paquete de IP.
|
138
|
El encabezado de Ethernet de arriba es usado para decodificar la parte Ethernet de los datos crudos en cada paquete. Este se compone de la dirección MAC fuente (`ether_shost`, 6 bytes), la dirección MAC destino (`ether_dhost`, 6 bytes), y el tipo de paquete de Ethernet (`ether_type`, 2 bytes) que es usado para determinar si el paquete es un paquete de IP.
|
139
|
|
139
|
|
|
|
|
|
141
|
|
141
|
|
142
|
2. El siguiente código es la definición de la clase `ethernet_packet`, que se encuentra en el archivo `ethernet_packet.h`:
|
142
|
2. El siguiente código es la definición de la clase `ethernet_packet`, que se encuentra en el archivo `ethernet_packet.h`:
|
143
|
|
143
|
|
144
|
- class ethernet_packet
|
|
|
145
|
- {
|
|
|
|
|
144
|
+ class ethernet_packet
|
|
|
145
|
+ {
|
146
|
sniff_ethernet ethernet ;
|
146
|
sniff_ethernet ethernet ;
|
147
|
|
147
|
|
148
|
// Devuelve una direccion de 6 bytes MAC en una cadena de caracteres.
|
148
|
// Devuelve una direccion de 6 bytes MAC en una cadena de caracteres.
|
149
|
string mac2string(u_char []) ;
|
149
|
string mac2string(u_char []) ;
|
150
|
|
150
|
|
151
|
- public:
|
|
|
|
|
151
|
+ public:
|
152
|
ethernet_packet(); // Constructor por defecto
|
152
|
ethernet_packet(); // Constructor por defecto
|
153
|
|
153
|
|
154
|
// Ajusta la variable miembro ether_dhost a los valores
|
154
|
// Ajusta la variable miembro ether_dhost a los valores
|
|
|
|
|
169
|
|
169
|
|
170
|
// Devuelve el tipo de ethernet.
|
170
|
// Devuelve el tipo de ethernet.
|
171
|
u_short getEtherType() ;
|
171
|
u_short getEtherType() ;
|
172
|
- };
|
|
|
|
|
172
|
+ };
|
173
|
|
173
|
|
174
|
Nota que cada objeto de clase `ethernet_packet` solo tiene el siguiente atributo: una estructura tipo `sniff_ethernet` llamada `ethernet`.
|
174
|
Nota que cada objeto de clase `ethernet_packet` solo tiene el siguiente atributo: una estructura tipo `sniff_ethernet` llamada `ethernet`.
|
175
|
|
175
|
|
|
|
|
|
182
|
* `getEtherType()` es un *getter* que devuelve el valor de `ether_type` como *unsigned char*.
|
182
|
* `getEtherType()` es un *getter* que devuelve el valor de `ether_type` como *unsigned char*.
|
183
|
* el método privado `string mac2string(u_char [])` recibe un arreglo de seis *unsigned characters* y devuelve el string correspondiente a su representación hexadecimal. Por ejemplo, si recibe `{ 0x8A, 0x11, 0xAB, 0xFF, 0x12, 0x34}` debe devolver el string `"8A:11:AB:FF:12:34"`.
|
183
|
* el método privado `string mac2string(u_char [])` recibe un arreglo de seis *unsigned characters* y devuelve el string correspondiente a su representación hexadecimal. Por ejemplo, si recibe `{ 0x8A, 0x11, 0xAB, 0xFF, 0x12, 0x34}` debe devolver el string `"8A:11:AB:FF:12:34"`.
|
184
|
|
184
|
|
185
|
- Tu tarea en este ejercicio es implementar las siete funciones listadas arriba en el archivo `ethetnet_packet.cpp`. Los encabezados de algunas de la funciones están provistos en el archivo.
|
|
|
|
|
185
|
+4. Tu tarea en este ejercicio es implementar las siete funciones listadas arriba en el archivo `ethetnet_packet.cpp`. Los encabezados de algunas de la funciones están provistos en el archivo.
|
186
|
|
186
|
|
187
|
### Ejercicio 3 - Construir la declaración de `ip_packet`
|
187
|
### Ejercicio 3 - Construir la declaración de `ip_packet`
|
188
|
|
188
|
|