如何获取有关内核空间中的eth0
的信息?如果它已经设置了ipv6(当然还有ipv6),我需要知道它是启用还是禁用。
答案 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
结构中。