Хук Netfilter получает имя интерфейса - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь получить имена 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 снова застревал в компьютере.

...