从用户空间访问IF_RA_MANAGED和IF_RA_OTHERCONF

时间:2011-07-01 12:38:39

标签: linux-kernel ipv6

我需要从用户空间访问IF_RA_MANAGEDIF_RA_OTHERCONFin6_dev->if_flags)。

有谁知道我该怎么做?

由于

2 个答案:

答案 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的博客中。