From 68ebcb8f9d03abc9b497510d228fa291d1f09af9 Mon Sep 17 00:00:00 2001 From: "Michael L. Young" Date: Mon, 8 Apr 2013 19:55:34 +0000 Subject: [PATCH] Fix For Not Overriding The Default Settings In chan_sip The initial report was that the "nat" setting in the [general] section was not having any effect in overriding the default setting. Upon confirming that this was happening and looking into what was causing this, it was discovered that other default settings would not be overriden as well. This patch works similar to what occurs in build_peer(). We create a temporary ast_flags structure and using a mask, we override the default settings with whatever is set in the [general] section. In the bug report, the reporter who helped to test this patch noted that the directmedia settings were being overriden properly as well as the nat settings. (closes issue ASTERISK-21225) Reported by: Alexandre Vezina Tested by: Alexandre Vezina, Michael L. Young Patches: asterisk-21225-handle-options-default-prob_1.8_v4.diff.diff Michael L. Young (license 5026) Review: https://reviewboard.asterisk.org/r/2386/ git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@385008 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- UPGRADE.txt | 4 ++++ channels/chan_sip.c | 25 ++++++++++++++----------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/UPGRADE.txt b/UPGRADE.txt index 0cbbbf72ea..e93452e875 100644 --- a/UPGRADE.txt +++ b/UPGRADE.txt @@ -18,6 +18,10 @@ === =========================================================== +from 1.8.22.0 to 1.8.23.0: +* The default settings for chan_sip are now overriden properly by the general + settings in sip.conf. Please look over your settings upon upgrading. + from 1.8.21.0 to 1.8.22.0: * Added the 'n' option to MeetMe to prevent application of the DENOISE function to a channel joining a conference. Some channel drivers that vary the number diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 271c244535..8a3580ba07 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -27500,16 +27500,13 @@ static int handle_common_options(struct ast_flags *flags, struct ast_flags *mask } } else if (!strcasecmp(v->name, "nat")) { ast_set_flag(&mask[0], SIP_NAT_FORCE_RPORT); - ast_set_flag(&flags[0], SIP_NAT_FORCE_RPORT); /* Default to "force_rport" */ - if (!strcasecmp(v->value, "no")) { - ast_clear_flag(&flags[0], SIP_NAT_FORCE_RPORT); - } else if (!strcasecmp(v->value, "yes")) { - /* We've already defaulted to force_rport */ - ast_set_flag(&mask[1], SIP_PAGE2_SYMMETRICRTP); + ast_set_flag(&mask[1], SIP_PAGE2_SYMMETRICRTP); + if (!strcasecmp(v->value, "yes")) { + ast_set_flag(&flags[0], SIP_NAT_FORCE_RPORT); ast_set_flag(&flags[1], SIP_PAGE2_SYMMETRICRTP); + } else if (!strcasecmp(v->value, "force_rport")) { + ast_set_flag(&flags[0], SIP_NAT_FORCE_RPORT); } else if (!strcasecmp(v->value, "comedia")) { - ast_clear_flag(&flags[0], SIP_NAT_FORCE_RPORT); - ast_set_flag(&mask[1], SIP_PAGE2_SYMMETRICRTP); ast_set_flag(&flags[1], SIP_PAGE2_SYMMETRICRTP); } } else if (!strcasecmp(v->name, "directmedia") || !strcasecmp(v->name, "canreinvite")) { @@ -28659,7 +28656,8 @@ static int reload_config(enum channelreloadreason reason) struct sip_peer *peer; char *cat, *stringp, *context, *oldregcontext; char newcontexts[AST_MAX_CONTEXT], oldcontexts[AST_MAX_CONTEXT]; - struct ast_flags dummy[2]; + struct ast_flags mask[3] = {{0}}; + struct ast_flags setflags[3] = {{0}}; struct ast_flags config_flags = { reason == CHANNEL_MODULE_LOAD ? 0 : ast_test_flag(&global_flags[1], SIP_PAGE2_RTCACHEFRIENDS) ? 0 : CONFIG_FLAG_FILEUNCHANGED }; int auto_sip_domains = FALSE; struct ast_sockaddr old_bindaddr = bindaddr; @@ -28894,10 +28892,10 @@ static int reload_config(enum channelreloadreason reason) /* Read the [general] config section of sip.conf (or from realtime config) */ for (v = ast_variable_browse(cfg, "general"); v; v = v->next) { - if (handle_common_options(&global_flags[0], &dummy[0], v)) { + if (handle_common_options(&setflags[0], &mask[0], v)) { continue; } - if (handle_t38_options(&global_flags[0], &dummy[0], v, &global_t38_maxdatagram)) { + if (handle_t38_options(&setflags[0], &mask[0], v, &global_t38_maxdatagram)) { continue; } /* handle jb conf */ @@ -29381,6 +29379,11 @@ static int reload_config(enum channelreloadreason reason) } } + /* Override global defaults if setting found in general section */ + ast_copy_flags(&global_flags[0], &setflags[0], mask[0].flags); + ast_copy_flags(&global_flags[1], &setflags[1], mask[1].flags); + ast_copy_flags(&global_flags[2], &setflags[2], mask[2].flags); + if (subscribe_network_change) { network_change_event_subscribe(); } else {