From 8182146e850515084056acc9f3d7b0b6534af44e Mon Sep 17 00:00:00 2001 From: Daniel Journo Date: Sun, 10 Jan 2016 22:22:12 +0000 Subject: pjsip: Add option global/regcontext Added new global option (regcontext) to pjsip. When set, Asterisk will dynamically create and destroy a NoOp priority 1 extension for a given endpoint who registers or unregisters with us. ASTERISK-25670 #close Reported-by: Daniel Journo Change-Id: Ib1530c5b45340625805c057f8ff1fb240a43ea62 --- res/res_pjsip/pjsip_configuration.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) (limited to 'res/res_pjsip/pjsip_configuration.c') diff --git a/res/res_pjsip/pjsip_configuration.c b/res/res_pjsip/pjsip_configuration.c index 926bf3793..4afa9507d 100644 --- a/res/res_pjsip/pjsip_configuration.c +++ b/res/res_pjsip/pjsip_configuration.c @@ -21,6 +21,7 @@ #include "asterisk/callerid.h" #include "asterisk/test.h" #include "asterisk/statsd.h" +#include "asterisk/pbx.h" /*! \brief Number of buckets for persistent endpoint information */ #define PERSISTENT_BUCKETS 53 @@ -68,6 +69,7 @@ static int persistent_endpoint_update_state(void *obj, void *arg, int flags) struct ao2_iterator i; struct ast_sip_contact *contact; enum ast_endpoint_state state = AST_ENDPOINT_OFFLINE; + char *regcontext; if (status) { char rtt[32]; @@ -116,16 +118,37 @@ static int persistent_endpoint_update_state(void *obj, void *arg, int flags) return 0; } + regcontext = ast_sip_get_regcontext(); + if (state == AST_ENDPOINT_ONLINE) { ast_endpoint_set_state(endpoint, AST_ENDPOINT_ONLINE); blob = ast_json_pack("{s: s}", "peer_status", "Reachable"); + + if (!ast_strlen_zero(regcontext)) { + if (!ast_exists_extension(NULL, regcontext, ast_endpoint_get_resource(endpoint), 1, NULL)) { + ast_add_extension(regcontext, 1, ast_endpoint_get_resource(endpoint), 1, NULL, NULL, + "Noop", ast_strdup(ast_endpoint_get_resource(endpoint)), ast_free_ptr, "SIP"); + } + } + ast_verb(1, "Endpoint %s is now Reachable\n", ast_endpoint_get_resource(endpoint)); } else { ast_endpoint_set_state(endpoint, AST_ENDPOINT_OFFLINE); blob = ast_json_pack("{s: s}", "peer_status", "Unreachable"); + + if (!ast_strlen_zero(regcontext)) { + struct pbx_find_info q = { .stacklen = 0 }; + + if (pbx_find_extension(NULL, NULL, &q, regcontext, ast_endpoint_get_resource(endpoint), 1, NULL, "", E_MATCH)) { + ast_context_remove_extension(regcontext, ast_endpoint_get_resource(endpoint), 1, NULL); + } + } + ast_verb(1, "Endpoint %s is now Unreachable\n", ast_endpoint_get_resource(endpoint)); } + ast_free(regcontext); + ast_endpoint_blob_publish(endpoint, ast_endpoint_state_type(), blob); ast_json_unref(blob); ast_devstate_changed(AST_DEVICE_UNKNOWN, AST_DEVSTATE_CACHABLE, "PJSIP/%s", ast_endpoint_get_resource(endpoint)); -- cgit v1.2.3