帮我看看这些代码--关于链路层转发数据包
一、内核版本2.6.10
1。在dev.c文件中定义函数指针int (*fp)(struct sk_buff *) = 0
并立即EXPORT_SYMBOL(fp)
然后在netif_rx()函数的最开始添加了我的代码:
if (fp && ((*fp)(skb_copy(skb, GFP_ATOMIC)))) {
kfree_skb(skb);
return NET_RX_DROP;
}
...
这样重新编译内核后,在kallsyms中看不到fp这个符号,而system.map中存在fp,这是怎么回事?
2。我自己编写的内核模块
int init_module(void)
{
fp = dr_test;
printk("starting\n");
return 0;
}
void cleanup_module(void)
{
fp = 0;
printk("stop\n");
}
int dr_test(struct sk_buff *skb) //回调函数
{
printk("haha\n");
return 1;
}
insmod模块之后发现并不能截获到本机的数据包,就是说在var/log/messages中没有出现“haha”字串。但是如果本机自己请求本机,就可以拦截这个数据包,这又是怎么回事??
二、内核版本2.4.20
1。内核符号导出完全正确
2。在dr_test()中截获数据包完全正常,但是我转发数据包的时候死机:
skb->dev->hard_header(skb,skb->dev,ntohs(skb->protocol),MAC_ADDR,eth->h_source,skb- >len);
skb->dev->hard_start_xmit(skb,skb->dev); //死机!!!如果没有这句就ok
唉,发现不会的、不理解的东西太多了,希望大哥解答一下。