LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1616|回复: 0

在函数netif_receive_skb()函数里使用全局变量的问题

[复制链接]
发表于 2008-1-15 20:10:27 | 显示全部楼层 |阅读模式
想把收到数据包的信息从底层导出来,导到/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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表