diff --git a/addons/chan_ooh323.c b/addons/chan_ooh323.c index 8111b712ec3d4c1bce521defdbeb2e9feb82a758..52c0404a5f50c0db64e0e6753fb5c58eca9d263e 100644 --- a/addons/chan_ooh323.c +++ b/addons/chan_ooh323.c @@ -295,8 +295,6 @@ AST_MUTEX_DEFINE_STATIC(h323_reload_lock); static int usecnt = 0; AST_MUTEX_DEFINE_STATIC(usecnt_lock); -AST_MUTEX_DEFINE_STATIC(ooh323c_cmd_lock); - static long callnumber = 0; AST_MUTEX_DEFINE_STATIC(ooh323c_cn_lock); @@ -696,7 +694,7 @@ static struct ast_channel *ooh323_request(const char *type, struct ast_format_ca ooh323_destroy(p); ast_mutex_unlock(&iflock); return NULL; - } else if (gH323ep.gkClient && gH323ep.gkClient->state != GkClientRegistered) { + } else if (!gH323ep.gkClient || (gH323ep.gkClient && gH323ep.gkClient->state != GkClientRegistered)) { ast_log(LOG_ERROR, "Gatekeeper client is configured but not registered\n"); *cause = AST_CAUSE_NORMAL_TEMPORARY_FAILURE; return NULL; @@ -751,7 +749,6 @@ static struct ast_channel *ooh323_request(const char *type, struct ast_format_ca } ast_mutex_unlock(&p->lock); - ast_mutex_lock(&ooh323c_cmd_lock); ast_cond_init(&p->rtpcond, NULL); ooMakeCall(data, p->callToken, AST_MAX_EXTENSION, NULL); ast_mutex_lock(&p->lock); @@ -760,7 +757,6 @@ static struct ast_channel *ooh323_request(const char *type, struct ast_format_ca } ast_mutex_unlock(&p->lock); ast_cond_destroy(&p->rtpcond); - ast_mutex_unlock(&ooh323c_cmd_lock); } restart_monitor(); @@ -3505,6 +3501,9 @@ static char *handle_cli_ooh323_show_gk(struct ast_cli_entry *e, int cmd, struct case GkClientFailed: ast_cli(a->fd, "%-20s%s\n", "GK state:", "Failed"); break; + case GkClientStopped: + ast_cli(a->fd, "%-20s%s\n", "GK state:", "Shutdown"); + break; default: break; } @@ -3946,6 +3945,13 @@ static void *do_monitor(void *data) ast_verb(1, "Reloading H.323\n"); ooh323_do_reload(); } + if (gH323ep.gkClient && gH323ep.gkClient->state == GkClientStopped) { + ooGkClientDestroy(); + ast_verb(0, "Restart stopped gatekeeper client\n"); + ooGkClientInit(gRasGkMode, (gRasGkMode == RasUseSpecificGatekeeper) ? + gGatekeeper : 0, 0); + ooGkClientStart(gH323ep.gkClient); + } /* Check for interfaces needing to be killed */ ast_mutex_lock(&iflock); diff --git a/addons/ooh323c/src/ooGkClient.c b/addons/ooh323c/src/ooGkClient.c index 3aaaba774b9935afae2d1f82da44793724195bb5..af6a10bbd37c30dfbb3e682fd9cc84c52bb0d6b7 100644 --- a/addons/ooh323c/src/ooGkClient.c +++ b/addons/ooh323c/src/ooGkClient.c @@ -2851,13 +2851,13 @@ int ooGkClientHandleClientOrGkFailure(ooGkClient *pGkClient) { OOTRACEERR1("Error: Gatekeeper error detected. Closing GkClient as " "Gk mode is UseSpecifcGatekeeper\n"); - ooGkClientDestroy(); + pGkClient->state = GkClientStopped; return OO_FAILED; } else{ OOTRACEERR1("Error: Gatekeeper error detected. Closing GkClient. NEED" " to implement recovery by rediscovering another gk\n"); - ooGkClientDestroy(); + pGkClient->state = GkClientStopped; return OO_FAILED; } } diff --git a/addons/ooh323c/src/ooGkClient.h b/addons/ooh323c/src/ooGkClient.h index e12b45a9621154b038298ebac0cd8d369fd54a0f..59230e9539d3845bd5dbe95f3db53a31f0db520f 100644 --- a/addons/ooh323c/src/ooGkClient.h +++ b/addons/ooh323c/src/ooGkClient.h @@ -108,7 +108,8 @@ enum OOGkClientState { GkClientRegistered, /* registered with gk */ GkClientUnregistered, GkClientGkErr,/*Gk is not responding, in discover mode can look for new GK*/ - GkClientFailed + GkClientFailed, + GkClientStopped }; diff --git a/addons/ooh323c/src/oochannels.c b/addons/ooh323c/src/oochannels.c index f581d76f992bcf6d37c4e92cddf0d6146729b767..de85389100985e3bb72f4f9ae1f79f553ad5b0e3 100644 --- a/addons/ooh323c/src/oochannels.c +++ b/addons/ooh323c/src/oochannels.c @@ -603,11 +603,7 @@ int ooProcessFDSETsAndTimers if(gH323ep.gkClient->state == GkClientFailed || gH323ep.gkClient->state == GkClientGkErr) { - if(ooGkClientHandleClientOrGkFailure(gH323ep.gkClient)!=OO_OK) - { - //ooStopMonitorCalls(); //Function calling ooProcessFDSETsAndTimers is responsible for this. - return OO_FAILED; - } + ooGkClientHandleClientOrGkFailure(gH323ep.gkClient); } }