Почему sk_buff равен NULL?
Здравствуйте все!
Разбираюсь с сетевой подсистемой ядра Linux. Решил попрактиковаться. Порылся в инете, нашел простенький модуль, который с помощью netfilter хуков перехватывает пакеты. Взял его за пример.
Но никак не могу заставить его работать. Что бы я ни делал, указатель на структуру sk_buff в хук-функции всегда равен NULL.
В интернете есть примеры для ядер 2.6.12 - 2.6.18. У меня 2.6.26, в котором сама струтура sk_buff имеет отличные от предыдущих версий поля. Может подскажите как в ядре 2.6.26 перехватить пакет на уровне ядра? Куда копать? Что "курить"? Можно наверно покапаться в исходниках того же iptables, но надо чем быстрее, тем лучше.
Заранее спасибо!
Вот код тестого модуля:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/sched.h>
#include <linux/string.h>
#include <linux/signal.h>
//#include <linux/signalfd.h>
#include <asm/unistd.h>
#include <asm/siginfo.h>
#include <asm/uaccess.h> /* for copy_from_user */
#include <linux/syscalls.h>
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/fcntl.h>
#include <linux/time.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <net/sock.h>
#include <linux/netfilter_ipv4.h>
#include <linux/netdevice.h>
MODULE_LICENSE("GPL");
struct nf_hook_ops nf_outgoing;
struct sk_buff *skbf;
//============================================================================= ========================
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*))
{
skbf = *skb;
//printk("In hook\n");
if (skbf == NULL) printk("skbf = NULL\n"); //Почему???
return NF_ACCEPT;
}
//============================================================================= ========================
static int net_mod_init(void)
{
printk(KERN_INFO "net_mod init\n");
nf_outgoing.hook = main_hook;
nf_outgoing.pf = PF_INET;
nf_outgoing.hooknum = 4;//NF_IP_PRE_ROUTING;
nf_outgoing.priority = NF_IP_PRI_FIRST;
//Registration
nf_register_hook(&nf_outgoing);
return 0;
}
//============================================================================= ========================
static void net_mod_exit(void)
{
nf_unregister_hook(&nf_outgoing);
printk(KERN_INFO "net_mod exit\n");
}
//============================================================================= ========================
module_init(net_mod_init);
module_exit(net_mod_exit);