我有以下代码从内核 3.18 取消注册和注册 sip conntrack
static void __nf_conntrack_sip_fini(void)
{
int i, j;
for (i = 0; i < ports_c; i++) {
for (j = 0; j < ARRAY_SIZE(sip[i]); j++) {
if (sip[i][j].me == NULL)
continue;
nf_conntrack_helper_unregister(&sip[i][j]);
}
}
memset(sip, 0, sizeof(sip));
}
static int __nf_conntrack_sip_init(void)
{
int i, j, ret;
if (ports_c == 0)
ports[ports_c++] = SIP_PORT;
for (i = 0; i < ports_c; i++) {
memset(&sip[i], 0, sizeof(sip[i]));
sip[i][0].tuple.src.l3num = AF_INET;
sip[i][0].tuple.dst.protonum = IPPROTO_UDP;
sip[i][0].help = sip_help_udp;
sip[i][1].tuple.src.l3num = AF_INET;
sip[i][1].tuple.dst.protonum = IPPROTO_TCP;
sip[i][1].help = sip_help_tcp;
sip[i][2].tuple.src.l3num = AF_INET6;
sip[i][2].tuple.dst.protonum = IPPROTO_UDP;
sip[i][2].help = sip_help_udp;
sip[i][3].tuple.src.l3num = AF_INET6;
sip[i][3].tuple.dst.protonum = IPPROTO_TCP;
sip[i][3].help = sip_help_tcp;
for (j = 0; j < ARRAY_SIZE(sip[i]); j++) {
sip[i][j].data_len = sizeof(struct nf_ct_sip_master);
sip[i][j].tuple.src.u.udp.port = htons(ports[i]);
sip[i][j].expect_policy = sip_exp_policy;
sip[i][j].expect_class_max = SIP_EXPECT_MAX;
sip[i][j].me = THIS_MODULE;
if (ports[i] == SIP_PORT)
sprintf(sip[i][j].name, "sip");
else
sprintf(sip[i][j].name, "sip-%u", i);
pr_debug("port #%u: %u\n", i, ports[i]);
ret = nf_conntrack_helper_register(&sip[i][j]);
if (ret) {
printk(KERN_ERR "nf_ct_sip: failed to register"
" helper for pf: %u port: %u i=%d\n",
sip[i][j].tuple.src.l3num, ports[i], i);
__nf_conntrack_sip_fini();
return ret;
}
}
}
return 0;
}
我开发了以下代码来使用相同的第一个端口重新启动注册的 sip conntrack
static void nf_conntrack_sip_restart(void)
{
//here ports[] = {5060, 0}
__nf_conntrack_sip_fini();
memcpy(ports,newports,sizeof(ports));
//here ports[] = {5060, 5555}
__nf_conntrack_sip_init(); // <---- It fails
}
当我从用户空间触发此重新启动功能时,新端口数组的寄存器失败
如果我使用其他端口,那么它可以工作:
static void nf_conntrack_sip_restart(void)
{
//here ports[] = {5060, 0}
__nf_conntrack_sip_fini();
memcpy(ports,newports,sizeof(ports));
//here ports[] = {5061, 5555}
__nf_conntrack_sip_init(); // <---- It works
}
我缺少什么?
下面是经过我修改的 nf_conntrack_sip.c 文件的整个源代码:http://vpaste.net/PgUVD http://vpaste.net/PgUVD
要查看我的修改,您可以与 linux 3.18 的原始源代码进行 diff