Bonjour tout le monde,

Je débute dans la programmation de module linux et avec l'utilisation de netfilter en C.

J'aimerais pouvoir faire un programme/module linux permettant de mettre en place des fonctions hook afin de pouvoir DROP ou ACCEPT les paquets ARP.

Pour le moment, j'ai tenté de faire ce code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
 
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/netfilter_arp/arp_tables.h>
 
static struct nf_hook_ops netfilter_ops_in;
static struct nf_hook_ops netfilter_ops_out;
 
static unsigned int main_hook(unsigned int hooknum, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff*)) {
  printk(KERN_ALERT "ARP !\n");
  return NF_ACCEPT;
}
 
static int __init mon_module_init(void) {
  printk(KERN_ALERT "init. \n");
  netfilter_ops_in.hook = main_hook;
  netfilter_ops_in.pf = NF_ARP;
  netfilter_ops_in.hooknum = NF_ARP_IN;
 
 
  netfilter_ops_out.hook = main_hook;
  netfilter_ops_out.pf = NF_ARP;
  netfilter_ops_out.hooknum = NF_ARP_OUT;
  netfilter_ops_out.priority = NF_INET_LOCAL_OUT;
 
  nf_register_hook(&netfilter_ops_out);
 
  return 0;
}
 
static void __exit mon_module_cleanup(void) {
  printk(KERN_ALERT "exit.\n");
  nf_unregister_hook(&netfilter_ops_out);
}
 
module_init(mon_module_init);
module_exit(mon_module_cleanup);
Mais je n'ai jamais réussis a avoir mon message : "ARP !\n" dans mon log : /var/log/syslog

Alors que j'ai bien les messages d'init et d'exit et que ma génération de paquets ARP fonctionne (Je l'ai vérifié avec wireshark).

De plus, quand je compile, j'obtiens ce warning :
warning: assignment from incompatible pointer type [enabled by default]
netfilter_ops_out.hook = main_hook;
Merci d'avance pour votre aide,