【发布时间】:2011-07-01 12:38:38
【问题描述】:
我需要从用户空间访问IF_RA_MANAGED 和IF_RA_OTHERCONF (in6_dev->if_flags)。
有人知道我该怎么做吗?
谢谢
【问题讨论】:
标签: linux-kernel ipv6
我需要从用户空间访问IF_RA_MANAGED 和IF_RA_OTHERCONF (in6_dev->if_flags)。
有人知道我该怎么做吗?
谢谢
【问题讨论】:
标签: linux-kernel ipv6
我认为您可以使用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
(为了偏执,删除了一些确切的地址)。我没有在此 LAN 上设置这些标志的任何 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;
}
}
所以我认为你应该能够使用这个来组合一个解决方案。
【讨论】:
onlink 和 autoconf 是前缀标志,但 otherconf 和 manager 不是前缀标志。它们是 inet6_dev.if_flags
这个问题现在在其副本“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 的博客中。
【讨论】: