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