2012-02-15 8 views
8

Desidero convertire gli indirizzi IP di origine & da un pacchetto acquisito utilizzando netfilter in char *.Converti indirizzo IP sorgente da struct iphdr * a equivalente stringa usando Linux netfilter

Nella mia funzione di hook netfilter, ho:

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 

Grazie.

+0

Con inet_ntoa()? –

+0

@ ott-- La conversione deve essere eseguita nel modulo del kernel. Non sono riuscito a trovare un file di intestazione in linux/cartella contenente la funzione inet_ntoa(). Ho trovato in_aton() in linux/inet.h che fa esattamente il contrario, converte char * in __be32. – Jake

+0

Oops, kernel. Prova questo; 'printk (" indirizzo-ip è "NIPQUAD_FMT" \ n ", NIPQUAD (ip_header-> saddr));'. Non posso accedere ai miei host Linux da qui, quindi non posso dire dove sono definite le macro. Ed è solo per ipv4. –

risposta

13

La famiglia del kernel di printf() funzioni ha una speciale identificatore di formato per indirizzi IP (IPv4 %pI4 per indirizzi, %pI6 per IPv6).

Quindi, con IPv4, si potrebbe usare qualcosa come:

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

oppure scrivere a memoria allocata dinamicamente.

Se si desidera semplicemente stampare l'output di debug, è anche possibile utilizzare printk(). Per le molte altre funzionalità di %p, vedere this document.