我需要从用户空间访问IF_RA_MANAGED
和IF_RA_OTHERCONF
(in6_dev->if_flags
)。
有谁知道我该怎么做?
由于
答案 0 :(得分:1)
我认为您可以使用PF_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
(为了偏执而删除了一些确切的地址)。我没有在这个局域网上设置这些标志的任何RA,但我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;
}
}
所以我认为你应该能够用这个来组合一个解决方案。
答案 1 :(得分:0)
此问题现已在其副本“Where m flag and o flag will be stored in Linux”中得到解答。具体来说,问题海报找到了解决问题的方法,并将代码发布在http://kumaran127.blogspot.jp/2013/05/get-m-and-o-flag-of-most-recently.html的博客中。