免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2387 | 回复: 5
打印 上一主题 下一主题

[网络子系统] 编写netfilter模块,加载时内核崩溃,求解释!!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-17 10:17 |只看该作者 |倒序浏览
  1. #include <linux/module.h>  
  2. #include <linux/kernel.h>
  3. #include <linux/netfilter.h>
  4. #include <linux/netfilter_ipv4.h>
  5. #include <linux/ip.h>
  6. /* 用于注册我们的函数的数据结构 */
  7. static struct nf_hook_ops nfho;
  8. unsigned char *drop_ip="\xc0\xa8\x5\xad";
  9. /* 注册的hook函数的实现 */
  10. unsigned int hook_func(unsigned int hooknum,
  11.                        struct sk_buff **skb,
  12.                        const struct net_device *in,
  13.                        const struct net_device *out,
  14.                        int (*okfn)(struct sk_buff *))
  15. {
  16. #if 1
  17.                 struct sk_buff *sb=*skb;
  18.                 //if(sb !=NULL)
  19.                         //{
  20.                         //        printk("12313\n");
  21.                 struct iphdr *iph = ip_hdr(sb);
  22.        
  23.                    if (iph->saddr == *(unsigned int *)drop_ip) {
  24.                 // if (sb->nh.iph->saddr == drop_ip) {
  25.        
  26.                   printk("Dropped packet from... %d.%d.%d.%d\n",
  27.                 *drop_ip, *(drop_ip + 1),
  28.                 *(drop_ip + 2), *(drop_ip + 3));

  29.     return NF_DROP;           /* 丢弃所有的数据包 */
  30.   }
  31.   else
  32.           return NF_ACCEPT;


  33. #else
  34.         dump_stack();
  35. #endif
  36. }


  37. /* 初始化程序 */
  38. int init_module()
  39. {
  40.     /* 填充我们的hook数据结构 */
  41.     nfho.hook = hook_func;         /* 处理函数 */
  42.     nfho.hooknum  = NF_INET_PRE_ROUTING; /* 使用IPv4的第一个hook */
  43.     nfho.pf       = PF_INET;
  44.     nfho.priority = NF_IP_PRI_FIRST;   /* 让我们的函数首先执行 */

  45.     nf_register_hook(&nfho);

  46.     return 0;
  47. }

  48. /* 清除程序 */
  49. void cleanup_module()
  50. {
  51.     nf_unregister_hook(&nfho);
  52. }
  53. //module_init(init_module);
  54. //module_exit(cleanup_module);
  55. MODULE_LICENSE("GPL");
复制代码
编译成模块,在加载时出现内核崩溃,请对netfilter研究较深的专家们给菜鸟说明一下,为什么出现这种情况,谢谢!!
崩溃信息如下:
# insmod netfilter.ko
~ # [61527.556000] CPU 0 Unable to handle kernel paging request at virtual address 00000098, epc == 82f29078, ra == 8015ca44
[61527.568000] Oops[#1]:
[61527.568000] Cpu 0
[61527.568000] $ 0   : 00000000 00000000 82f30000 00000000
[61527.568000] $ 4   : 00000000 832b2200 83833c00 00000000
[61527.568000] $ 8   : 82f29130 800fc8e0 00000005 00000800
[61527.568000] $12   : 83221dfc 00000009 83221e70 2aaec39c
[61527.568000] $16   : 83221ae0 00000004 00000001 80000000
[61527.568000] $20   : 83833c00 80163740 00000000 00000000
[61527.568000] $24   : 00000000 80163a98                  
[61527.568000] $28   : 83220000 83221a60 832b2200 8015ca44
[61527.568000] Hi    : 00006157
[61527.568000] Lo    : 1a768aa1
[61527.568000] epc   : 82f29078 hook_func+0x14/0x6c [netfilter]
[61527.568000]     Tainted: P         
[61527.568000] ra    : 8015ca44 nf_iterate+0x84/0xf8
[61527.568000] Status: 1100ff03    KERNEL EXL IE
[61527.568000] Cause : 00800008
[61527.568000] BadVA : 00000098
[61527.568000] PrId  : 0001974c (MIPS 74Kc)
[61527.568000] Modules linked in:
[61527.568000] [<82f29000>] netfilter
[61527.568000] [<82f34000>] ath_addon(P)
[61527.568000] [<82d78000>] ath_pktlog(P)
[61527.568000] [<83100000>] umac
[61527.568000] [<830c0000>] ath_dev(P)
[61527.568000] [<83e70000>] ath_dfs(P)
[61527.568000] [<83f20000>] ath_rate_atheros(P)
[61527.568000] [<83000000>] ath_hal(P)
[61527.568000] [<83e48000>] asf(P)
[61527.568000] [<83e5c000>] adf
[61527.568000] [<83e60000>] athrs_gmac
[61527.568000] [<83e11000>] athrs_tun_var(P)
[61527.568000] Process ap2snmpd (pid: 2052, threadinfo=83220000, task=82dabac8, tls=00000000)
[61527.568000] Stack : 83eb82c0 831218e0 800fc4c0 83eb8868 00000000 00000000 04000200 8015ca44
[61527.568000]         021b0000 83000448 00000018 830003f4 80163740 0000401c 832b2200 00000000
[61527.568000]         8029ce50 00000002 83833c00 80163740 00000000 00000003 00000005 8015cc48
[61527.568000]         8029ce50 f0010473 83eb0000 00000002 00000000 83221ae0 80163740 80000000
[61527.568000]         82f294f0 83eb82c0 00000001 832b2200 83833c00 802533ac 802533c4 80250000
[61527.568000]         ...
[61527.568000] Call Trace:
[61527.568000] [<82f29078>] hook_func+0x14/0x6c [netfilter]
[61527.568000] [<8015ca44>] nf_iterate+0x84/0xf8
[61527.568000] [<8015cc48>] nf_hook_slow+0x94/0x130
[61527.568000] [<80163d90>] ip_rcv+0x2f8/0x35c
[61527.568000] [<80146874>] process_backlog+0xa8/0x108
[61527.568000] [<80146fd8>] net_rx_action+0x90/0x1b0
[61527.568000] [<8002ac98>] __do_softirq+0xb0/0x148
[61527.568000] [<8002ad78>] do_softirq+0x48/0x6c
[61527.568000] [<8002b000>] local_bh_enable+0x8c/0xcc
[61527.568000] [<80147d8c>] dev_queue_xmit+0x32c/0x378
[61527.568000] [<8016872c>] ip_push_pending_frames+0x2e8/0x37c
[61527.568000] [<80186528>] udp_push_pending_frames+0x2fc/0x368
[61527.568000] [<80187f4c>] udp_sendmsg+0x4c8/0x5e8
[61527.568000] [<80135598>] sock_sendmsg+0xa8/0xc0
[61527.568000] [<80136b3c>] sys_sendto+0xc0/0x100
[61527.568000] [<8000f984>] stack_done+0x20/0x3c
[61527.568000]
[61527.568000]
[61527.568000] Code: 8ca30000  3c0282f3  8c4893c0 <8c640098> 8d030000  8c82000c  10430005  24050001  8fbf001c
[61527.840000] Kernel panic - not syncing: Fatal exception in interrupt

U-Boot 1.1.4 (May  4 2013 - 14:58:21)

论坛徽章:
1
15-16赛季CBA联赛之新疆
日期:2017-03-09 12:33:45
2 [报告]
发表于 2013-08-17 11:45 |只看该作者
回复 1# allenhuang87


    你的skb==NULL

论坛徽章:
0
3 [报告]
发表于 2013-08-17 13:16 |只看该作者
netfilter只有在收到包的情况下才会调用这个勾子函数吧?为什么sb会是NULL?回复 2# jeppeter


   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2013-08-17 23:10 |只看该作者
回复 1# allenhuang87

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 *))


这个接口中 skb 还是二级指针,这么用的 kernel 版本是 2.6.21(既不清楚某个具体版本号了,可能是) 以前的版本。之后的都是一级指针了。

你用的是什么版本?

内核代码的接口不同版本之间都有可能不一样的,问别人问题的时候,带上自己的内核版本,是一个好习惯。

   

论坛徽章:
0
5 [报告]
发表于 2013-08-29 11:20 |只看该作者
回复 4# Godbach
谢谢!我用的2.6.31的内核,的确是使用二级指针导致内核崩溃,改回一级指针正常运行!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
6 [报告]
发表于 2013-08-29 13:33 |只看该作者
回复 5# allenhuang87
:wink:


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP