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