Linux kernel 从用户空间访问IF_RA_MANAGED和IF_RA_OTHERCONF
我需要从用户空间访问Linux kernel 从用户空间访问IF_RA_MANAGED和IF_RA_OTHERCONF,linux-kernel,ipv6,Linux Kernel,Ipv6,我需要从用户空间访问IF_RA_MANAGED和IF_RA_OTHERCONF(in6_dev->IF_flags) 有人知道我怎么做吗 谢谢我想你可以用PF\u NETLINK插座来实现这一点 ip实用程序是iproute2的一部分,它有一个显示此信息的监控模式,例如: ajw@rapunzel:/tmp/iproute-20100519/ip > ip -6 monitor 2: eth0 inet6 2001:XXXX:XXXX:0:XXXX:XXXX:XXXX:XXXX/64
IF_RA_MANAGED
和IF_RA_OTHERCONF
(in6_dev->IF_flags
)
有人知道我怎么做吗
谢谢我想你可以用
PF\u NETLINK
插座来实现这一点
ip
实用程序是iproute2
的一部分,它有一个显示此信息的监控模式,例如:
ajw@rapunzel:/tmp/iproute-20100519/ip > ip -6 monitor
2: eth0 inet6 2001:XXXX:XXXX:0:XXXX:XXXX:XXXX:XXXX/64 scope global dynamic
valid_lft 86400sec preferred_lft 14400sec
prefix 2001:XXXX:XXXX::X/64 dev eth0 onlink autoconf valid 14400 preferred 131084
(为了偏执狂,一些确切的地址被删除了)。我没有在这个局域网上设置这些标志的RAs,但我99%肯定它们也会出现在那里
用strace
拨弄一下,有趣的调用似乎是:
socket(PF_NETLINK, SOCK_RAW, 0) = 3
setsockopt(3, SOL_SOCKET, SO_SNDBUF, [32768], 4) = 0
setsockopt(3, SOL_SOCKET, SO_RCVBUF, [1048576], 4) = 0
bind(3, {sa_family=AF_NETLINK, pid=0, groups=fffffff7}, 12) = 0
getsockname(3, {sa_family=AF_NETLINK, pid=7151, groups=fffffff7}, [12]) = 0
time(NULL) = 1309595579
send(3, "...", 20, 0) = 20
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"...", 16384}], msg_controllen=0, msg_flags=0}, 0) = 864
iproute2
的源代码有一个文件,ip/ipmonitor.c
,它似乎完成了大部分工作:
int print_prefix(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg);
int accept_msg(const struct sockaddr_nl *who,
struct nlmsghdr *n, void *arg)
{
// Snipped some unrelated stuff
if (n->nlmsg_type == RTM_NEWPREFIX) {
if (prefix_banner)
fprintf(fp, "[PREFIX]");
print_prefix(who, n, arg);
return 0;
}
}
因此,我认为您应该能够使用它来组合解决方案。我认为您可以使用
PF\u NETLINK
套接字来实现这一点
ip
实用程序是iproute2
的一部分,它有一个显示此信息的监控模式,例如:
ajw@rapunzel:/tmp/iproute-20100519/ip > ip -6 monitor
2: eth0 inet6 2001:XXXX:XXXX:0:XXXX:XXXX:XXXX:XXXX/64 scope global dynamic
valid_lft 86400sec preferred_lft 14400sec
prefix 2001:XXXX:XXXX::X/64 dev eth0 onlink autoconf valid 14400 preferred 131084
(为了偏执狂,一些确切的地址被删除了)。我没有在这个局域网上设置这些标志的RAs,但我99%肯定它们也会出现在那里
用strace
拨弄一下,有趣的调用似乎是:
socket(PF_NETLINK, SOCK_RAW, 0) = 3
setsockopt(3, SOL_SOCKET, SO_SNDBUF, [32768], 4) = 0
setsockopt(3, SOL_SOCKET, SO_RCVBUF, [1048576], 4) = 0
bind(3, {sa_family=AF_NETLINK, pid=0, groups=fffffff7}, 12) = 0
getsockname(3, {sa_family=AF_NETLINK, pid=7151, groups=fffffff7}, [12]) = 0
time(NULL) = 1309595579
send(3, "...", 20, 0) = 20
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"...", 16384}], msg_controllen=0, msg_flags=0}, 0) = 864
iproute2
的源代码有一个文件,ip/ipmonitor.c
,它似乎完成了大部分工作:
int print_prefix(const struct sockaddr_nl *who, struct nlmsghdr *n, void *arg);
int accept_msg(const struct sockaddr_nl *who,
struct nlmsghdr *n, void *arg)
{
// Snipped some unrelated stuff
if (n->nlmsg_type == RTM_NEWPREFIX) {
if (prefix_banner)
fprintf(fp, "[PREFIX]");
print_prefix(who, n, arg);
return 0;
}
}
因此,我认为您应该能够使用这个方法来制定解决方案。现在,这个问题的答案是重复的“”。具体来说,问题海报找到了问题的解决方案,并将代码发布在了一个博客上。这个问题的答案现在是重复的“”。具体而言,问题海报找到了问题的解决方案,并将代码发布在博客上。
onlink
和autoconf
是前缀标志,而otherconf和manager不是前缀标志。如果标志onlink
和autoconf
是前缀标志,而otherconf和manager不是前缀标志,那么它们就是inet6开发。它们是inet6\u dev.if\u标志