You create your module to handle all ethernet packets. Linux will send packets to all relevant protocol handlers. Since IP is already registered in your kernel, your module and ip_rcv will receive all SKBs with IP headers.
You cannot change this behavior without changing the kernel code. One possibility is to create a netfilter module. Thus, you can intercept the packet after the ip_rcv function and delete it if you want (in Netfilters PREROUTING hook).
Here is a small Netfilter module that I extracted from some code that I already wrote. This module is not complete, but the main material is in place.
#include <linux/netfilter.h> #include <linux/netfilter_ipv4.h> // Handler function static unsigned int my_handler ( unsigned int hook, struct sk_buff *skb, const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *)) { return NF_ACCEPT; // or return NF_DROP; } // Handler registering struct static struct nf_hook_ops my_hook __read_mostly = { .hook = my_handler, .pf = NFPROTO_IPV4, .hooknum = (1 << NF_INET_PRE_ROUTING), .priority = NF_IP_PRI_FIRST // My hook will be run before any other netfilter hook }; int my_init() { int err = nf_register_hook (&my_hook); if (err) { printk (KERN_ERR "Could not register hook\n"); } return err; }
Atle
source share