From b83a26eefab34561ec94f043bc17b672df46fae8 Mon Sep 17 00:00:00 2001 From: Matthew Nicholson Date: Tue, 16 Aug 2011 14:40:37 +0000 Subject: [PATCH] In 10 and trunk this option is disabled by default. Merged revisions 332021 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.8 ........ r332021 | mnicholson | 2011-08-16 09:20:43 -0500 (Tue, 16 Aug 2011) | 7 lines Added the 'storesipcause' option to sip.conf to allow the user to disable the setting of HASH(SIP_CAUSE,) on the channel. Having chan_sip set HASH(SIP_CAUSE,) on the channel carries a significant performance penalty because of the usage of the MASTER_CHANNEL() dialplan function. AST-580 ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@332022 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- CHANGES | 7 ++++++- channels/chan_sip.c | 8 +++++++- configs/sip.conf.sample | 10 ++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index d4526a24ae..4b3e1dac75 100644 --- a/CHANGES +++ b/CHANGES @@ -179,6 +179,9 @@ res_fax SIP Changes ----------- * Add T38 support for REJECTED state where T.38 Negotiation is explicitly rejected. + * Setting of HASH(SIP_CAUSE,) on channels is now disabled + by default. It can be enabled using the 'storesipcause' option. This feature + has a significant performance penalty. Queue changes ------------- @@ -245,7 +248,9 @@ SIP Changes and enables symmetric RTP support. * Slave SIP channels now set HASH(SIP_CAUSE,) on each response. This permits the master channel to know how each channel dialled - in a multi-channel setup resolved in an individual way. + in a multi-channel setup resolved in an individual way. This carries a + performance penalty and can be disabled in sip.conf using the + 'storesipcause' option. * Added 'externtcpport' and 'externtlsport' options to allow custom port configuration for the externip and externhost options when tcp or tls is used. * Added support for message body (stored in content variable) to SIP NOTIFY message diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 6629efb029..d128ad85f8 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -746,6 +746,8 @@ static enum st_refresher global_st_refresher; /*!< Session-Timer refresher static int global_min_se; /*!< Lowest threshold for session refresh interval */ static int global_max_se; /*!< Highest threshold for session refresh interval */ +static int global_store_sip_cause; /*!< Whether the MASTER_CHANNEL(HASH(SIP_CAUSE,[chan_name])) var should be set */ + static int global_dynamic_exclude_static = 0; /*!< Exclude static peers from contact registrations */ /*@}*/ @@ -17962,6 +17964,7 @@ static char *sip_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_ ast_cli(a->fd, " SIP realtime: Enabled\n" ); ast_cli(a->fd, " Qualify Freq : %d ms\n", global_qualifyfreq); ast_cli(a->fd, " Q.850 Reason header: %s\n", AST_CLI_YESNO(ast_test_flag(&global_flags[1], SIP_PAGE2_Q850_REASON))); + ast_cli(a->fd, " Store SIP_CAUSE: %s\n", AST_CLI_YESNO(global_store_sip_cause)); ast_cli(a->fd, "\nNetwork QoS Settings:\n"); ast_cli(a->fd, "---------------------------\n"); ast_cli(a->fd, " IP ToS SIP: %s\n", ast_tos2str(global_tos_sip)); @@ -25055,7 +25058,7 @@ static int handle_incoming(struct sip_pvt *p, struct sip_request *req, struct as handle_response(p, respid, e + len, req, seqno); - if (p->owner) { + if (global_store_sip_cause && p->owner) { struct ast_channel *owner = p->owner; snprintf(causevar, sizeof(causevar), "MASTER_CHANNEL(HASH(SIP_CAUSE,%s))", owner->name); @@ -28086,6 +28089,7 @@ static int reload_config(enum channelreloadreason reason) global_shrinkcallerid = 1; authlimit = DEFAULT_AUTHLIMIT; authtimeout = DEFAULT_AUTHTIMEOUT; + global_store_sip_cause = FALSE; sip_cfg.matchexternaddrlocally = DEFAULT_MATCHEXTERNADDRLOCALLY; @@ -28563,6 +28567,8 @@ static int reload_config(enum channelreloadreason reason) } else { global_st_refresher = i; } + } else if (!strcasecmp(v->name, "storesipcause")) { + global_store_sip_cause = ast_true(v->value); } else if (!strcasecmp(v->name, "qualifygap")) { if (sscanf(v->value, "%30d", &global_qualify_gap) != 1) { ast_log(LOG_WARNING, "Invalid qualifygap '%s' at line %d of %s\n", v->value, v->lineno, config); diff --git a/configs/sip.conf.sample b/configs/sip.conf.sample index f33b1cf320..fb487dba66 100644 --- a/configs/sip.conf.sample +++ b/configs/sip.conf.sample @@ -1016,6 +1016,16 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls ; but occasionally has spikes. ; jblog = no ; Enables jitterbuffer frame logging. Defaults to "no". + +;----------------------------- SIP_CAUSE reporting --------------------------------- +; storesipcause = no ; This option causes chan_sip to set the + ; HASH(SIP_CAUSE,) channel variable + ; to the value of the last sip response. + ; WARNING: enabling this option carries a + ; significant performance burden. It should only + ; be used in low call volume situations. This + ; option defaults to "no". + ;----------------------------------------------------------------------------------- [authentication] -- 2.47.2