gpt4 book ai didi

c - 获取Linux内核模块中的接口(interface)网络掩码

转载 作者:行者123 更新时间:2023-11-30 14:33:21 25 4
gpt4 key购买 nike

我用 netfilter hook 编写 Linux 内核模块。我想阻止任何不是来 self 的子网的数据包。

有没有简单的方法可以在内核模式下获取接口(interface)的网络掩码?我只找到了在用户模式下使用 ioctl() 获取它的方法。

最佳答案

有一个非常简单的方法来获取它。
网络设备由struct net_device描述。 .
<linux/netdevice.h> :

struct net_device {
...
struct in_device __rcu *ip_ptr;
...

net_device有一个指向“inet”设备的指针( in_device )。

<linux/inetdevice.h> :

struct in_device {
...
struct in_ifaddr *ifa_list; /* IP ifaddr chain */
...

最终指向 in_ifaddr 链包含所有接口(interface)信息:

struct in_ifaddr {
struct hlist_node hash;
struct in_ifaddr *ifa_next;
struct in_device *ifa_dev;
struct rcu_head rcu_head;
__be32 ifa_local;
__be32 ifa_address;
__be32 ifa_mask;
__u32 ifa_rt_priority;
__be32 ifa_broadcast;
unsigned char ifa_scope;
unsigned char ifa_prefixlen;
__u32 ifa_flags;
char ifa_label[IFNAMSIZ];

/* In seconds, relative to tstamp. Expiry is at tstamp + HZ * lft. */
__u32 ifa_valid_lft;
__u32 ifa_preferred_lft;
unsigned long ifa_cstamp; /* created timestamp */
unsigned long ifa_tstamp; /* updated timestamp */
};
<小时/>

为了使我的答案更加通用,这是一个抽象示例(不绑定(bind)到 设备逻辑):

struct in_ifaddr *ifa;
struct net_device *dev = dev_get_by_name(&init_net, "wlp7s0");
if(!dev) {
printk(KERN_ERR "Can't obtain device\n");
return;
}

// roughly
rcu_read_lock();
for(ifa = rcu_dereference(dev->ip_ptr->ifa_list);
ifa;
ifa = rcu_dereference(ifa->ifa_next))
printk("address: %pI4, mask: %pI4\n", &ifa->ifa_address, &ifa->ifa_mask);
rcu_read_unlock();

从示例中您可以看到,您可以根据某些特定逻辑处理整个链(@larsks 在评论中提到)。

附注不要忘记包含 <linux/netdevice.h><linux/inetdevice.h> .

关于c - 获取Linux内核模块中的接口(interface)网络掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59382141/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com