- 论坛徽章:
- 0
|
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.tuple.dst.protonum = IPPROTO_UDP; //协议
sip.tuple.src.u.udp.port = htons(ports); //端口号:SIP_PORT=5060
sip.mask.src.u.udp.port = htons(0xFFFF); //源地址掩码
sip.mask.dst.protonum = 0xFF;
sip.max_expected = 2;
sip.timeout = 3 * 60; //超时时间:3 minutes
sip.me = THIS_MODULE;
sip.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、模块的调用
在连接跟踪的初时化时,有注册两个钩子:
/*连接跟踪初始化时,注册helper Hook*/
static struct nf_hook_ops ip_conntrack_helper_out_ops = {
.hook = ip_conntrack_help,
.owner = THIS_MODULE,
.pf = PF_INET,
.hooknum = NF_IP_POST_ROUTING,
.priority = NF_IP_PRI_CONNTRACK_HELPER, /*此优先级比同Hook上的ip_confirm的高*/
};
static struct nf_hook_ops ip_conntrack_helper_in_ops = {
.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 函数将被调用。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/103638/showart_2038255.html |
|