内核比较ipv6地址

时间:2015-07-03 11:10:21

标签: c linux-kernel kernel kernel-module

在内核模块中,如果给出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;
}

2 个答案:

答案 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);