res_pjsip: add 'set_var' support on endpoints

Added a new 'set_var' option for ast_sip_endpoint(s).  For each variable
specified that variable gets set upon creation of a pjsip channel involving
the endpoint.

(closes issue ASTERISK-22868)
Reported by: Joshua Colp
Review: https://reviewboard.asterisk.org/r/3095/


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@404663 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Kevin Harwell
2014-01-02 19:06:28 +00:00
parent 0c4b1ca477
commit e99940111c
6 changed files with 60 additions and 1 deletions

View File

@@ -1117,6 +1117,9 @@ res_pjsip (and many others)
these modules is performed in pjsip.conf. Other modules may use their these modules is performed in pjsip.conf. Other modules may use their
own configuration files. own configuration files.
* Added 'set_var' option for an endpoint. For each variable specified that
variable gets set upon creation of a channel involving the endpoint.
res_rtp_asterisk res_rtp_asterisk
------------------ ------------------
* ICE/STUN/TURN support in res_rtp_asterisk has been made optional. To enable * ICE/STUN/TURN support in res_rtp_asterisk has been made optional. To enable

View File

@@ -346,6 +346,7 @@ static struct ast_channel *chan_pjsip_new(struct ast_sip_session *session, int s
struct ast_format fmt; struct ast_format fmt;
RAII_VAR(struct chan_pjsip_pvt *, pvt, NULL, ao2_cleanup); RAII_VAR(struct chan_pjsip_pvt *, pvt, NULL, ao2_cleanup);
struct ast_sip_channel_pvt *channel; struct ast_sip_channel_pvt *channel;
struct ast_variable *var;
if (!(pvt = ao2_alloc(sizeof(*pvt), chan_pjsip_pvt_dtor))) { if (!(pvt = ao2_alloc(sizeof(*pvt), chan_pjsip_pvt_dtor))) {
return NULL; return NULL;
@@ -364,6 +365,11 @@ static struct ast_channel *chan_pjsip_new(struct ast_sip_session *session, int s
return NULL; return NULL;
} }
for (var = session->endpoint->channel_vars; var; var = var->next) {
char buf[512];
pbx_builtin_setvar_helper(chan, var->name, ast_get_encoded_str(
var->value, buf, sizeof(buf)));
}
ast_channel_stage_snapshot(chan); ast_channel_stage_snapshot(chan);

View File

@@ -539,7 +539,8 @@
; other party or both (default: "") ; other party or both (default: "")
;srtp_tag_32=no ; Determines whether 32 byte tags should be used instead of 80 ;srtp_tag_32=no ; Determines whether 32 byte tags should be used instead of 80
; byte tags (default: "no") ; byte tags (default: "no")
;set_var= ; Variable set on a channel involving the endpoint. For multiple
; channel variables specify multiple 'set_var'(s)
;==========================AUTH SECTION OPTIONS========================= ;==========================AUTH SECTION OPTIONS=========================
;[auth] ;[auth]

View File

@@ -592,6 +592,8 @@ struct ast_sip_endpoint {
unsigned int allowtransfer; unsigned int allowtransfer;
/*! Method used when handling redirects */ /*! Method used when handling redirects */
enum ast_sip_session_redirect redirect_method; enum ast_sip_session_redirect redirect_method;
/*! Variables set on channel creation */
struct ast_variable *channel_vars;
}; };
/*! /*!

View File

@@ -665,6 +665,14 @@
set to <literal>sdes</literal> or <literal>dtls</literal>. set to <literal>sdes</literal> or <literal>dtls</literal>.
</para></description> </para></description>
</configOption> </configOption>
<configOption name="set_var">
<synopsis>Variable set on a channel involving the endpoint.</synopsis>
<description><para>
When a new channel is created using the endpoint set the specified
variable(s) on that channel. For multiple channel variables specify
multiple 'set_var'(s).
</para></description>
</configOption>
</configObject> </configObject>
<configObject name="auth"> <configObject name="auth">
<synopsis>Authentication type</synopsis> <synopsis>Authentication type</synopsis>

View File

@@ -761,6 +761,43 @@ static int t38udptl_ec_to_str(const void *obj, const intptr_t *args, char **buf)
return 0; return 0;
} }
static int set_var_handler(const struct aco_option *opt,
struct ast_variable *var, void *obj)
{
struct ast_sip_endpoint *endpoint = obj;
struct ast_variable *new_var;
char *name = ast_strdupa(var->value), *val = strchr(name, '=');
if (!val) {
return -1;
}
*val++ = '\0';
if (!(new_var = ast_variable_new(name, val, ""))) {
return -1;
}
new_var->next = endpoint->channel_vars;
endpoint->channel_vars = new_var;
return 0;
}
static int set_var_to_str(const void *obj, const intptr_t *args, char **buf)
{
struct ast_str *str = ast_str_create(MAX_OBJECT_FIELD);
const struct ast_sip_endpoint *endpoint = obj;
struct ast_variable *var;
for (var = endpoint->channel_vars; var; var = var->next) {
ast_str_append(&str, 0, "%s=%s,", var->name, var->value);
}
*buf = ast_strdup(ast_str_truncate(str, -1));
ast_free(str);
return 0;
}
static void *sip_nat_hook_alloc(const char *name) static void *sip_nat_hook_alloc(const char *name)
{ {
return ast_sorcery_generic_alloc(sizeof(struct ast_sip_nat_hook), NULL); return ast_sorcery_generic_alloc(sizeof(struct ast_sip_nat_hook), NULL);
@@ -1483,6 +1520,7 @@ int ast_res_pjsip_initialize_configuration(const struct ast_module_info *ast_mod
ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtls_setup", "", dtls_handler, dtlssetup_to_str, 0, 0); ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "dtls_setup", "", dtls_handler, dtlssetup_to_str, 0, 0);
ast_sorcery_object_field_register(sip_sorcery, "endpoint", "srtp_tag_32", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.srtp_tag_32)); ast_sorcery_object_field_register(sip_sorcery, "endpoint", "srtp_tag_32", "no", OPT_BOOL_T, 1, FLDSET(struct ast_sip_endpoint, media.rtp.srtp_tag_32));
ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "redirect_method", "user", redirect_handler, NULL, 0, 0); ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "redirect_method", "user", redirect_handler, NULL, 0, 0);
ast_sorcery_object_field_register_custom(sip_sorcery, "endpoint", "set_var", "", set_var_handler, set_var_to_str, 0, 0);
if (ast_sip_initialize_sorcery_transport(sip_sorcery)) { if (ast_sip_initialize_sorcery_transport(sip_sorcery)) {
ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n"); ast_log(LOG_ERROR, "Failed to register SIP transport support with sorcery\n");
@@ -1588,6 +1626,7 @@ static void endpoint_destructor(void* obj)
endpoint->pickup.named_callgroups = ast_unref_namedgroups(endpoint->pickup.named_callgroups); endpoint->pickup.named_callgroups = ast_unref_namedgroups(endpoint->pickup.named_callgroups);
endpoint->pickup.named_pickupgroups = ast_unref_namedgroups(endpoint->pickup.named_pickupgroups); endpoint->pickup.named_pickupgroups = ast_unref_namedgroups(endpoint->pickup.named_pickupgroups);
ao2_cleanup(endpoint->persistent); ao2_cleanup(endpoint->persistent);
ast_variables_destroy(endpoint->channel_vars);
} }
static int init_subscription_configuration(struct ast_sip_endpoint_subscription_configuration *subscription) static int init_subscription_configuration(struct ast_sip_endpoint_subscription_configuration *subscription)