|
想把收到数据包的信息从底层导出来,导到/proc/目录下,于是在netif_receive_skb()函数里使用了全局变量,涉及到的部分代码如下:
int forward_flag=0;
EXPORT_SYMBOL(forward_flag);
int netif_receive_skb(struct sk_buff *skb)
{
......
if(forward_flag)
{
iph = skb->nh.iph;
tdaddr=iph->daddr;
tsaddr=iph->saddr;
iidaddr[0]=((tdaddr >> 24) & 255);
iidaddr[1]=((tdaddr >> 16) & 255);
iidaddr[2]=((tdaddr >> 8) & 255);
iidaddr[3]=(tdaddr & 255);
iisaddr[0]=((tsaddr >> 24) & 255);
iisaddr[1]=((tsaddr >> 16) & 255);
iisaddr[2]=((tsaddr >> 8) & 255);
iisaddr[3]=(tsaddr & 255);
}
skb->h.raw = skb->nh.raw = skb->data;
skb->mac_len = skb->nh.raw - skb->mac.raw;
......
}
forward_flag是通过外部加载模块使其等于1的。
然后在net_dev_init()函数里注册了一个proc文件,
proc_rcv_info = create_proc_read_entry("networkinfo", 0, NULL, netinfo_proc_read, NULL);
netinfo_proc_read()的代码如下:
int netinfo_proc_read(char *buf,char **start, off_t off, int count, int *eof, void *data)
{
int len;
len=sprintf(buf,"the dest is %d.%d.%d.%d\n the source is %d.%d.%d.%d\n",iidaddr[3],iidaddr[2],iidaddr[1],iidaddr[0],iisaddr[3],iisaddr[2],iisaddr[1],iisaddr[0]);
*eof=1;
return len;
}
但是一加载模块,置forward_flag为1,就会死机。
先前试过完全用模块的方式来导出数据包的信息,也是在netif_receive_skb()里调用一个模块函数,但哪怕这个模块函数只有一句 return 0 也会死机。
究竟怎么回事呢?难道netif_receive_skb()里不能用全局变量,也不能调用模块函数?
那该如何将数据从最底层导出来呢?
请指教,谢谢!!
内核版本 2.6.21.7 |
|