文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>SIP跟踪

SIP跟踪

时间:2009-08-27  来源:vinnacy

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、模块的调用
在连接跟踪的初时化时,有注册两个钩子:

/*连接跟踪初始化时,注册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 函数将被调用。
相关阅读 更多 +
排行榜 更多 +
试着飞手游下载

试着飞手游下载

休闲益智 下载
血染小镇(功能菜单)中文版下载

血染小镇(功能菜单)中文版下载

飞行射击 下载
泰坦之旅高爆版下载

泰坦之旅高爆版下载

角色扮演 下载