有关内核空间中网络接口的信息

时间:2016-01-09 22:46:47

标签: linux-kernel network-programming

如何获取有关内核空间中的eth0的信息?如果它已经设置了ipv6(当然还有ipv6),我需要知道它是启用还是禁用。

2 个答案:

答案 0 :(得分:2)

您正在寻找struct net_device

#include <linux/netdevice.h>

struct net_device *net_dev = __dev_get_by_name("eth0");

net_dev->flags; // IFF_UP will be set if an interface active (up)

要获取IPv6地址,您需要从net_device中获取struct inet6_dev,并从中获取IP地址:

#include <net/addrconf.h>
#include <net/if_inet6.h>

struct inet6_dev *net_dev6 = in6_dev_get(net_device);

答案 1 :(得分:0)

如果您无法从inet6_dev实例获取ipv6地址,则可以从内核源代码中获得一些线索

https://elixir.bootlin.com/linux/latest/source/net/ipv6/addrconf.c

static void ipv6_link_dev_addr(struct inet6_dev *idev, struct inet6_ifaddr *ifp) {
    struct list_head *p;
    int ifp_scope = ipv6_addr_src_scope(&ifp->addr);

    /*
     * Each device address list is sorted in order of scope -
     * global before linklocal.
     */
    list_for_each(p, &idev->addr_list) {
        struct inet6_ifaddr *ifa
            = list_entry(p, struct inet6_ifaddr, if_list);
        if (ifp_scope >= ipv6_addr_src_scope(&ifa->addr))
            break;
    }

    list_add_tail_rcu(&ifp->if_list, p);
}

从上面的代码中可以明显看出,可以通过在addr_list上调用inet6_dev来使用list_entry()的{​​{1}}字段来获取ipv6地址。实际上,addr_list.next字段嵌入在inet6_dev::addr_list.next结构中。