--- chan_h323_ori.c 2009-04-30 07:14:58.000000000 +0800 +++ chan_h323_new.c 2009-10-16 09:19:56.000000000 +0800 @@ -134,6 +134,7 @@ static int h323_signalling_port = 1720; static char gatekeeper[100]; static int gatekeeper_disable = 1; +static int gatekeeper_is_valid = 0; static int gatekeeper_discover = 0; static int gkroute = 0; /* Find user by alias (h.323 id) is default, alternative is the incomming call's source IP address*/ @@ -2892,6 +2893,7 @@ strcpy(default_context, "default"); h323_signalling_port = 1720; gatekeeper_disable = 1; + gatekeeper_is_valid = 0; gatekeeper_discover = 0; gkroute = 0; userbyalias = 1; @@ -2963,11 +2965,14 @@ } else if (!strcasecmp(v->name, "gatekeeper")) { if (!strcasecmp(v->value, "DISABLE")) { gatekeeper_disable = 1; + gatekeeper_is_valid = 0; } else if (!strcasecmp(v->value, "DISCOVER")) { gatekeeper_disable = 0; gatekeeper_discover = 1; + gatekeeper_is_valid = 1; } else { gatekeeper_disable = 0; + gatekeeper_is_valid = 1; ast_copy_string(gatekeeper, v->value, sizeof(gatekeeper)); } } else if (!strcasecmp(v->name, "secret")) { @@ -3208,6 +3213,25 @@ .set_rtp_peer = oh323_set_rtp_peer, }; +static pthread_t gkreg_thread = AST_PTHREADT_NULL; +static void *do_gkreg(void *data) +{ + while(1) { + sleep(120); + if(gatekeeper_is_valid && gatekeeper_disable) { + h323_gk_urq(); + if (h323_set_gk(gatekeeper_discover, gatekeeper, secret)) { + ast_debug(1, "Gatekeeper registration failed.\n"); + }else{ + gatekeeper_disable = 0; + ast_debug(1, "Gatekeeper registration OK.\n"); + } + } + } + + return NULL; +} + static enum ast_module_load_result load_module(void) { int res; @@ -3307,6 +3331,11 @@ } /* And start the monitor for the first time */ restart_monitor(); + if (gkreg_thread == AST_PTHREADT_NULL) { + if (ast_pthread_create_background(&gkreg_thread, NULL, do_gkreg, NULL) < 0) { + ast_log(LOG_ERROR, "Unable to start gkreg_thread thread.\n"); + } + } } return res; }