06.01.2015 Views

universidad autónoma metropolitana unidad azcapotzalco una ...

universidad autónoma metropolitana unidad azcapotzalco una ...

universidad autónoma metropolitana unidad azcapotzalco una ...

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

APÉNDICE A. CODIGO FUENTE DE LA HERRAMIENTA DE GESTION DE REDES VIRTUALES<br />

La función ethernet() es la rutina de callback ejecutada cada vez que llegue un paquete y éste<br />

cumpla el filtro establecido. Esta función se encarga de mostrar por pantalla los campos de<br />

información indicados.<br />

void ethernet(u_char *u, const struct pcap_pkthdr *h, const u_char *d ) {<br />

struct ether_header eth;<br />

struct iphdr ip;<br />

int i;<br />

memcpy(&eth, d, sizeof(struct ether_header);<br />

memcpy(&ip, d + ETH_HLEN, sizeof(struct iphdr);<br />

for (i = 0; i < ETH ALEN; i++)<br />

{<br />

fprintf(stdout, “%02X”, eth.ether_shost[i]);<br />

if (i != ETH_LEN-1) fprintf(stdout, “:”);<br />

}<br />

fprintf(stdout, “ -> ”);<br />

for (i = o; i < ETH_ALEN; i++)<br />

{<br />

fprintf(stdout, “%02X”, eth.ether_dhost[i]);<br />

if (i != ETH_ALEN-1) fprintf(stdout, ':');<br />

}<br />

if (ntohs(eth.ether_type) == ETHERTYPE_IP) {<br />

fprintf(stdout, “%s ->”, inet_ntoa(ip.saddr));<br />

fprintf(stdout. “%s”, inet_ntoa(ip.daddr));<br />

switch (ip.protocol){<br />

case IPPROTO_rCMP:<br />

fprintf(stdout,” [ICMP]”);<br />

break;<br />

case IPPROTO_TCP:<br />

fprintf(stdout, “ [TCP] ”);<br />

break;<br />

case IPPROTO_UDP:<br />

fprintf (stdout, “[UDP]”);<br />

break;<br />

}<br />

}<br />

fprintf(stdout, '\n');<br />

}<br />

En la función main del programa se obtiene un dispositivo de captura con pcap_lookupdev(), se<br />

abre con pcap_open_live() y se obtiene el tipo de enlace de red del que se dispone mediante<br />

pcap_datalink(). Dependiendo del tipo de enlace se elige <strong>una</strong> rutina de callback u otra, ya que los<br />

campos de las tramas y la forma de tratar los datos puede ser diferente. En nuestro caso<br />

únicamente se define <strong>una</strong> rutina para un enlace ethemet. A continuación se obtiene la red y<br />

máscara de red configuradas para el dispositivo seleccionado mediante pcap_lookupnet(), se<br />

compila el filtro pasado, opcionalmente como primer parámetro al programa utilizando<br />

pcap_compile() y se activa el filtro con pcap_setfilter(). Por último se entra en un bucle infinito<br />

para la captura de todos los paquetes de la red. De este bucle se sale cuando surja algún error o<br />

al pulsar el usuario CTRL+C.<br />

132

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!