使用Linux netfilter将struct iphdr*中的源IP地址转换为等效字符串

Jak*_*ake 10 c linux kernel netfilter kernel-module

我想将源和目标IP地址从使用netfilter捕获的数据包转换为char*.

在我的netfilter钩子函数中,我有:

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
Run Code Online (Sandbox Code Playgroud)

谢谢.

fnl*_*fnl 16

内核的printf()函数系列具有IP地址的特殊格式说明符(%pI4对于IPv4地址,%pI6对于IPv6).

因此,使用IPv4,您可以使用以下内容:

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

或写入动态分配的内存.

如果您只想打印调试输出,也可以使用printk().有关其他许多功能%p,请参阅此文档.