如何在内核空间获取有关eth0
的信息?我需要知道它是否已启用或禁用,是否设置了ipv6(当然还包括ipv6)。
如何在内核空间获取有关eth0
的信息?我需要知道它是否已启用或禁用,是否设置了ipv6(当然还包括ipv6)。
#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)
#include <net/addrconf.h>
#include <net/if_inet6.h>
struct inet6_dev *net_dev6 = in6_dev_get(net_device);
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);
}
inet6_dev
上调用list_entry()
来使用inet6_dev
的addr_list
字段获取ipv6地址。实际上,addr_list.next
字段嵌入在一个inet6_ifaddr
结构体中。
void get_ipv6(char * buf){ struct net_device *dev; dev = _dev_get_by_name("eth0"); sprintf(buf, "%pI6", dev->ip6_ptr->something); //我不知道确切的字段 }
当我想从ip6_ptr中获取一些内容时,总是会得到“dereferencing pointer to incomplete type”的错误提示。 - Kalvy