Skip to content
Snippets Groups Projects
Commit 821ab513 authored by Kevin Harwell's avatar Kevin Harwell
Browse files

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/
........

Merged revisions 404663 from http://svn.asterisk.org/svn/asterisk/branches/12


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@404664 65c4cc65-6c06-0410-ace0-fbb531ad65f3
parent f720a9ac
No related branches found
No related tags found
No related merge requests found
...@@ -1177,6 +1177,9 @@ res_pjsip (and many others) ...@@ -1177,6 +1177,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
......
...@@ -346,6 +346,7 @@ static struct ast_channel *chan_pjsip_new(struct ast_sip_session *session, int s ...@@ -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 ...@@ -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);
......
...@@ -539,7 +539,8 @@ ...@@ -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]
......
...@@ -589,6 +589,8 @@ struct ast_sip_endpoint { ...@@ -589,6 +589,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;
}; };
/*! /*!
......
...@@ -665,6 +665,14 @@ ...@@ -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>
......
...@@ -754,6 +754,43 @@ static int t38udptl_ec_to_str(const void *obj, const intptr_t *args, char **buf) ...@@ -754,6 +754,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);
...@@ -1476,6 +1513,7 @@ int ast_res_pjsip_initialize_configuration(const struct ast_module_info *ast_mod ...@@ -1476,6 +1513,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");
...@@ -1581,6 +1619,7 @@ static void endpoint_destructor(void* obj) ...@@ -1581,6 +1619,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)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment