Я пытаюсь получить имена net_device для in / out в хуке netfilter, который я написал.
После прочтения этих вопросов и ответов: NetFilterHook: имя интерфейса дисплеев , я попытался распечатать его, как сказано, однако он не работает.
Каждый раз, когда я пытаюсь напечатать имя интерфейса IN , я получаю массив символов со всеми нулями (пустая строка).
Каждый раз, когда я пытаюсь напечатать имя интерфейса OUT , компьютер зависает , как будто в драйвере возникает ошибка сегментации.
Если снять строки печати - драйвер работает нормально.
//Filename: hello-netfilter.c
#include <linux/module.h>
#include <linux/init.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
static struct nf_hook_ops nfho;
unsigned int hook_func(unsigned int hooknum,
struct sk_buff **skb,
const struct net_device *in,
const struct net_device *out,
int (*okfn)(struct sk_buff *)) {
printk(KERN_INFO "Packet!\n");
if (in != NULL && in->name != NULL)
{
printk(KERN_INFO "net_device in name: %s\n", in->name);
}
if (out != NULL && out->name != NULL)
{
printk(KERN_INFO "net_device out name: %s\n", out->name);
}
return NF_ACCEPT;
}
static int __init initialize(void) {
nfho.hook = hook_func; //Points to our hook function.
nfho.hooknum = NF_INET_PRE_ROUTING;
nfho.pf = PF_INET;
nfho.priority = NF_IP_PRI_FIRST;
nf_register_hook(&nfho);
return 0;
}
static void __exit cleanup(void) {
nf_unregister_hook(&nfho);
}
module_init(initialize);
module_exit(cleanup);
Я попытался распечатать каждый символ из обоих массивов символов - массив IN был равен 0, а OUT снова застревал в компьютере.