Chinaunix首页 | 论坛 | 博客
  • 博客访问: 24409
  • 博文数量: 10
  • 博客积分: 400
  • 博客等级: 下士
  • 技术积分: 120
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-27 09:17
文章分类

全部博文(10)

文章存档

2009年(10)

我的朋友

分类: LINUX

2009-08-27 10:17:05

1、模块的注册(ip_conntrack_sip.c)
1.1 init函数
初始化全局变量:
    static struct ip_conntrack_helper sip[MAX_PORTS];
并注册:
    memset(&sip, 0, sizeof(struct ip_conntrack_helper));
    ……
    ret=ip_conntrack_helper_register(&sip);

sip是一个数组,最大允许MAX_PORTS个,并且变量ports_c决定其个数,目前,只注册了一个sip。
sip是一个ip_conntrack_helper类型,初始化函数中,调用ip_conntrack_helper_register函数注册了一个sip的helper模块。
在为sip的成员赋初始值时,对照理解struct ip_conntrack_helper结构的许多重要的成员:


  sip[i].tuple.dst.protonum = IPPROTO_UDP;       //协议
  sip[i].tuple.src.u.udp.port = htons(ports[i]); //端口号:SIP_PORT=5060
  sip[i].mask.src.u.udp.port = htons(0xFFFF);    //源地址掩码
  sip[i].mask.dst.protonum = 0xFF;
  sip[i].max_expected = 2;
  sip[i].timeout = 3 * 60;   //超时时间:3 minutes
  sip[i].me = THIS_MODULE;
  sip[i].help = sip_help;    // very important

 
ip_conntrack_helper_register函数实质上是把该模块添加进以全局变量helpers为首的链表中去:
 

int ip_conntrack_helper_register(struct ip_conntrack_helper *me)
{
 BUG_ON(me->timeout == 0);
 WRITE_LOCK(&ip_conntrack_lock);
 list_prepend(&helpers, me);
 WRITE_UNLOCK(&ip_conntrack_lock);
 return 0;
}

至此,sip的helper模块被注册了,它什么时候被调用?以及它有什么用呢??
 
2、模块的调用

在连接跟踪的初始化时,有注册两个钩子: (ip_conntrack_standalone.c

/*连接跟踪初始化时,注册helper Hook*/
static struct nf_hook_ops ip_conntrack_ops[] = {
...
 {
  .hook  = ip_conntrack_help,
  .owner  = THIS_MODULE,
  .pf  = PF_INET,
  .hooknum = NF_IP_POST_ROUTING,
  .priority = NF_IP_PRI_CONNTRACK_HELPER,
 },
 {
  .hook  = ip_conntrack_help,
  .owner  = THIS_MODULE,
  .pf  = PF_INET,
  .hooknum = NF_IP_LOCAL_IN,
  .priority = NF_IP_PRI_CONNTRACK_HELPER,
 },
...

};

数据包经过Hook点时,ip_conntrack_help 函数将被调用。
阅读(649) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:syslog to freshman

给主人留下些什么吧!~~