2

我正在尝试使用 netfilter 挂钩功能从 skbuffs 中打印数据。唯一的问题是当我运行此代码时,我的操作系统冻结并且必须强制关闭。我是内核编码的新手,所以我希望有人可以看看这个并解释如何修复。

我注意到的一件事是,如果我在 hook_func 的开头添加一行“if (!sb) return NF_ACCEPT;” 然后程序运行良好。编辑:接受不打印 skb 数据,因为始终启动 if 语句。

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/netfilter.h>
#include <linux/skbuff.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/netfilter_ipv4.h>

/* This is the structure we shall use to register our function */ 
static struct nf_hook_ops nfho; 

/* This is the hook function itself */ 
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 *)) 
{ 
    struct sk_buff *sb = *skb; 

    int kk=0; 
    for (kk=0; (kk<sb->len) && (kk < 300); kk++) 
            printk("%c", &sb->data+kk ); 
    printk("\n----------------\n"); 

    return NF_ACCEPT;
} 

/* Initialisation routine */ 
int init_module() 
{  
    /* Fill in our hook structure */ 
    nfho.hook = hook_func; 
    /* Handler function */ 
    nfho.hooknum = NF_INET_PRE_ROUTING; /* First for IPv4 */ 
    nfho.pf = PF_INET; 
    nfho.priority = NF_IP_PRI_FIRST; /* Make our func first */ 

    nf_register_hook(&nfho); 

    return 0; 
} 

/*Cleanup routine */ 
void cleanup_module() 
{ 
nf_unregister_hook(&nfho); 
} 

我真的需要一些帮助!干杯本

4

1 回答 1

0

所以现在回答我自己的问题。经过一番搜索和进一步调试,我设法找到了有类似问题的人:

http://forum.kernelnewbies.org/read.php?15,1100,1100

事实证明,由于“linux版本> = 2,6,20”,钩子函数确实以相同的方式定义skb。现在它只是一个单指针,所以钩子函数应该是这样的:

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 *)) 
{ 
    struct sk_buff *sb = skb; 

    int kk=0; 
    for (kk=0; (kk<sb->len) && (kk < 300); kk++) 
            printk("%c", &sb->data+kk ); 
    printk("\n----------------\n"); 

    return NF_ACCEPT;
} 

注意 hook_func(unsigned int hooknum, struct sk_buff **skb...) 现在已更改为 hook_func(unsigned int hooknum, struct sk_buff *skb...)

结构 sk_buff *sb = *skb; 现在已更改为 struct sk_buff *sb = skb;

希望这对和我有同样问题的人有所帮助。

于 2013-05-01T20:32:52.157 回答