2012-02-15 11 views
8

Quiero convertir la fuente & direcciones IP de destino de un paquete capturado usando netfilter a char *.Convertir la dirección IP de origen de struct iphdr * a una cadena equivalente usando netfilter de Linux

En mi función de enlace netfilter, tienen:

sock_buff = skb; // argument 2 of hook function 

// ip_header is struct iphdr* 
ip_header = (struct iphdr *)skb_network_header(sock_buff); 

// now how to convert ip_header->saddr & ip_header->daddr to char * 
// ip_header->saddr & ip_header->daddr are of type __be32 

Gracias.

+0

con inet_ntoa()? –

+0

@ ott-- La conversión debe hacerse en el módulo kernel. No pude encontrar un archivo de encabezado en Linux/carpeta que contenga la función inet_ntoa(). Encontré in_aton() en linux/inet.h que hace exactamente lo contrario, convierte char * en __be32. – Jake

+0

Vaya, kernel. Prueba esto; 'printk (" dirección-IP es "NIPQUAD_FMT" \ n ", NIPQUAD (ip_header-> saddr));'. No puedo acceder a mis servidores Linux desde aquí, así que no puedo decir dónde están definidos los macros. Y es solo para ipv4. –

Respuesta

13

La familia del kernel de las funciones printf() tiene un especificador de formato especial para direcciones IP (%pI4 para direcciones IPv4, %pI6 para IPv6).

Así que con IPv4, se puede usar algo como:

char source[16]; 
snprintf(source, 16, "%pI4", &ip_header->saddr); // Mind the &! 

O escribir a la memoria asignada dinámicamente.

Si simplemente desea imprimir la salida de depuración, también puede usar printk(). Para las muchas otras características de %p, vea this document.

Cuestiones relacionadas