在内核模块中,如果给出struct sockaddr_storage
和ipv6字符串文字“:: 1”,如何比较ipv6地址?在linux 3.16.0-4-686-pae(x86)。
struct sockaddr_storage ss;
...
if(ss.ss_family == AF_INET6)
{
// ipv6
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&ss;
// compare ipv6 address
struct in6_addr addr;
inet_pton(AF_INET6, "::1", &addr); // error: implicit declaration of function ‘inet_pton’
if( (memcmp(addr.s6_addr, sin6->sin6_addr.s6_addr, sizeof(struct in6_addr)) == 0) && (htons(25) == sin6->sin6_port) )
return -EPERM;
}
答案 0 :(得分:2)
您使用的解析功能是用户空间,它不会在内核中工作。
使用ipv6_addr_cmp()
而不是裸memcmp()
可能更好地进行实际比较。
答案 1 :(得分:2)
inet_pton()
似乎不在标题中,但类似的函数in6_pton()
是。
#include <linux/inet.h>
in6_pton("::1", -1, addr.s6_addr, -1, NULL);