diff --git a/channels/chan_pjsip.c b/channels/chan_pjsip.c index 7c6b301080..a759117ce0 100644 --- a/channels/chan_pjsip.c +++ b/channels/chan_pjsip.c @@ -1183,10 +1183,14 @@ static int chan_pjsip_devicestate(const char *data) return AST_DEVICE_INVALID; } - if (endpoint_snapshot->state == AST_ENDPOINT_OFFLINE) { - state = AST_DEVICE_UNAVAILABLE; - } else if (endpoint_snapshot->state == AST_ENDPOINT_ONLINE) { - state = AST_DEVICE_NOT_INUSE; + if (ast_sip_get_rtstatic()) { + state = AST_DEVICE_UNKNOWN; + } else { + if (endpoint_snapshot->state == AST_ENDPOINT_OFFLINE) { + state = AST_DEVICE_UNAVAILABLE; + } else if (endpoint_snapshot->state == AST_ENDPOINT_ONLINE) { + state = AST_DEVICE_NOT_INUSE; + } } if (!endpoint_snapshot->num_channels) { diff --git a/res/res_pjsip/config_global.c b/res/res_pjsip/config_global.c index 4620c3f544..8d31f9cef4 100644 --- a/res/res_pjsip/config_global.c +++ b/res/res_pjsip/config_global.c @@ -54,6 +54,7 @@ #define DEFAULT_SEND_CONTACT_STATUS_ON_UPDATE_REGISTRATION 0 #define DEFAULT_TASKPROCESSOR_OVERLOAD_TRIGGER TASKPROCESSOR_OVERLOAD_TRIGGER_GLOBAL #define DEFAULT_NOREFERSUB 1 +#define DEFAULT_RTSTATIC 0 /*! * \brief Cached global config object @@ -119,6 +120,8 @@ struct global_config { enum ast_sip_taskprocessor_overload_trigger overload_trigger; /*! Nonzero if norefersub is to be sent in Supported header */ unsigned int norefersub; + /*! If enabled will return AST_DEVICE_UNKNOWN for all endpoints */ + unsigned int rtstatic; }; static void global_destructor(void *obj) @@ -537,6 +540,21 @@ unsigned int ast_sip_get_norefersub(void) return norefersub; } +unsigned int ast_sip_get_rtstatic(void) +{ + unsigned int rtstatic; + struct global_config *cfg; + + cfg = get_global_cfg(); + if (!cfg) { + return DEFAULT_RTSTATIC; + } + + rtstatic = cfg->rtstatic; + ao2_ref(cfg, -1); + return rtstatic; +} + static int overload_trigger_handler(const struct aco_option *opt, struct ast_variable *var, void *obj) { @@ -744,6 +762,9 @@ int ast_sip_initialize_sorcery_global(void) ast_sorcery_object_field_register(sorcery, "global", "norefersub", DEFAULT_NOREFERSUB ? "yes" : "no", OPT_YESNO_T, 1, FLDSET(struct global_config, norefersub)); + ast_sorcery_object_field_register(sorcery, "global", "rtstatic", + DEFAULT_RTSTATIC ? "yes" : "no", + OPT_YESNO_T, 1, FLDSET(struct global_config, rtstatic)); if (ast_sorcery_instance_observer_add(sorcery, &observer_callbacks_global)) { return -1;