内核比较ipv6地址

Kernel compare ipv6 address

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

您使用的解析函数是用户空间的,在内核中是行不通的。

使用 ipv6_addr_cmp() 进行实际比较可能比直接使用 memcmp() 更好。

inet_pton() 似乎不在 headers 中,但类似的函数 in6_pton() 却在。

#include <linux/inet.h>

in6_pton("::1", -1, addr.s6_addr, -1, NULL);