Moving more variables to the sip_cfg structure, as I have some future ideas for the...
authorOlle Johansson <oej@edvina.net>
Sun, 26 Oct 2008 09:45:17 +0000 (09:45 +0000)
committerOlle Johansson <oej@edvina.net>
Sun, 26 Oct 2008 09:45:17 +0000 (09:45 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@152019 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index 3c3658f..37b2798 100644 (file)
@@ -766,6 +766,7 @@ static const struct cfsip_options {
 #define DEFAULT_CALLERID       "asterisk"      /*!< Default caller ID */
 #define DEFAULT_NOTIFYMIME     "application/simple-message-summary"
 #define DEFAULT_ALLOWGUEST     TRUE
 #define DEFAULT_CALLERID       "asterisk"      /*!< Default caller ID */
 #define DEFAULT_NOTIFYMIME     "application/simple-message-summary"
 #define DEFAULT_ALLOWGUEST     TRUE
+#define DEFAULT_RTPKEEPALIVE   0               /*!< Default RTPkeepalive setting */
 #define DEFAULT_CALLCOUNTER    FALSE
 #define DEFAULT_SRVLOOKUP      TRUE            /*!< Recommended setting is ON */
 #define DEFAULT_COMPACTHEADERS FALSE           /*!< Send compact (one-character) SIP headers. Default off */
 #define DEFAULT_CALLCOUNTER    FALSE
 #define DEFAULT_SRVLOOKUP      TRUE            /*!< Recommended setting is ON */
 #define DEFAULT_COMPACTHEADERS FALSE           /*!< Send compact (one-character) SIP headers. Default off */
@@ -782,7 +783,10 @@ static const struct cfsip_options {
 #define DEFAULT_NOTIFYRINGING  TRUE            /*!< Notify devicestate system on ringing state */
 #define DEFAULT_PEDANTIC       FALSE           /*!< Avoid following SIP standards for dialog matching */
 #define DEFAULT_AUTOCREATEPEER FALSE           /*!< Don't create peers automagically */
 #define DEFAULT_NOTIFYRINGING  TRUE            /*!< Notify devicestate system on ringing state */
 #define DEFAULT_PEDANTIC       FALSE           /*!< Avoid following SIP standards for dialog matching */
 #define DEFAULT_AUTOCREATEPEER FALSE           /*!< Don't create peers automagically */
+#define        DEFAULT_MATCHEXTERNIPLOCALLY FALSE      /*!< Match extern IP locally default setting */
 #define DEFAULT_QUALIFY                FALSE           /*!< Don't monitor devices */
 #define DEFAULT_QUALIFY                FALSE           /*!< Don't monitor devices */
+#define DEFAULT_CALLEVENTS     FALSE           /*!< Extra manager SIP call events */
+#define DEFAULT_ALWAYSAUTHREJECT       FALSE   /*!< Don't reject authentication requests always */
 #define DEFAULT_REGEXTENONQUALIFY FALSE
 #define DEFAULT_T1MIN          100             /*!< 100 MS for minimal roundtrip time */
 #define DEFAULT_MAX_CALL_BITRATE (384)         /*!< Max bitrate for video */
 #define DEFAULT_REGEXTENONQUALIFY FALSE
 #define DEFAULT_T1MIN          100             /*!< 100 MS for minimal roundtrip time */
 #define DEFAULT_MAX_CALL_BITRATE (384)         /*!< Max bitrate for video */
@@ -815,14 +819,6 @@ static struct ast_codec_pref default_prefs;                /*!< Default codec prefs */
 static unsigned int default_transports;                        /*!< Default Transports (enum sip_transport) that are acceptable */
 static unsigned int default_primary_transport;         /*!< Default primary Transport (enum sip_transport) for outbound connections to devices */
 
 static unsigned int default_transports;                        /*!< Default Transports (enum sip_transport) that are acceptable */
 static unsigned int default_primary_transport;         /*!< Default primary Transport (enum sip_transport) for outbound connections to devices */
 
-/*! \brief a place to store all global settings for the sip channel driver */
-struct sip_settings {
-       int peer_rtupdate;      /*!< G: Update database with registration data for peer? */
-       int rtsave_sysname;     /*!< G: Save system name at registration? */
-       int ignore_regexpire;   /*!< G: Ignore expiration of peer  */
-};
-
-static struct sip_settings sip_cfg;
 /*@}*/ 
 
 /*! \name GlobalSettings
 /*@}*/ 
 
 /*! \name GlobalSettings
@@ -830,25 +826,42 @@ static struct sip_settings sip_cfg;
        of sip.conf
 */
 /*@{*/ 
        of sip.conf
 */
 /*@{*/ 
-static int global_directrtpsetup;      /*!< Enable support for Direct RTP setup (no re-invites) */
-static int global_rtautoclear;         /*!< Realtime ?? */
+/*! \brief a place to store all global settings for the sip channel driver 
+*/
+struct sip_settings {
+       int peer_rtupdate;              /*!< G: Update database with registration data for peer? */
+       int rtsave_sysname;             /*!< G: Save system name at registration? */
+       int ignore_regexpire;           /*!< G: Ignore expiration of peer  */
+       int rtautoclear;                /*!< Realtime ?? */
+       int directrtpsetup;             /*!< Enable support for Direct RTP setup (no re-invites) */
+       int pedanticsipchecking;        /*!< Extra checking ?  Default off */
+       int autocreatepeer;             /*!< Auto creation of peers at registration? Default off. */
+       int srvlookup;                  /*!< SRV Lookup on or off. Default is on */
+       int allowguest;                 /*!< allow unauthenticated peers to connect? */
+       int alwaysauthreject;           /*!< Send 401 Unauthorized for all failing requests */
+       int compactheaders;             /*!< send compact sip headers */
+       int allow_external_domains;     /*!< Accept calls to external SIP domains? */
+       int callevents;                 /*!< Whether we send manager events or not */
+       int regextenonqualify;          /*!< Whether to add/remove regexten when qualifying peers */
+       int matchexterniplocally;       /*!< Match externip/externhost setting against localnet setting */
+};
+
+static struct sip_settings sip_cfg;
+
 static int global_notifyringing;       /*!< Send notifications on ringing */
 static int global_notifyhold;          /*!< Send notifications on hold */
 static int global_notifyringing;       /*!< Send notifications on ringing */
 static int global_notifyhold;          /*!< Send notifications on hold */
-static int global_alwaysauthreject;    /*!< Send 401 Unauthorized for all failing requests */
-static int global_srvlookup;           /*!< SRV Lookup on or off. Default is on */
-static int pedanticsipchecking;                /*!< Extra checking ?  Default off */
-static int autocreatepeer;             /*!< Auto creation of peers at registration? Default off. */
 static int global_match_auth_username;         /*!< Match auth username if available instead of From: Default off. */
 static int global_match_auth_username;         /*!< Match auth username if available instead of From: Default off. */
+
 static int global_relaxdtmf;           /*!< Relax DTMF */
 static int global_rtptimeout;          /*!< Time out call if no RTP */
 static int global_rtpholdtimeout;      /*!< Time out call if no RTP during hold */
 static int global_rtpkeepalive;                /*!< Send RTP keepalives */
 static int global_reg_timeout; 
 static int global_regattempts_max;     /*!< Registration attempts before giving up */
 static int global_relaxdtmf;           /*!< Relax DTMF */
 static int global_rtptimeout;          /*!< Time out call if no RTP */
 static int global_rtpholdtimeout;      /*!< Time out call if no RTP during hold */
 static int global_rtpkeepalive;                /*!< Send RTP keepalives */
 static int global_reg_timeout; 
 static int global_regattempts_max;     /*!< Registration attempts before giving up */
-static int global_allowguest;          /*!< allow unauthenticated peers to connect? */
 static int global_callcounter;         /*!< Enable call counters for all devices. This is currently enabled by setting the peer
                                                call-limit to 999. When we remove the call-limit from the code, we can make it
                                                with just a boolean flag in the device structure */
 static int global_callcounter;         /*!< Enable call counters for all devices. This is currently enabled by setting the peer
                                                call-limit to 999. When we remove the call-limit from the code, we can make it
                                                with just a boolean flag in the device structure */
+static enum transfermodes global_allowtransfer;        /*!< SIP Refer restriction scheme */
 static int global_allowsubscribe;      /*!< Flag for disabling ALL subscriptions, this is FALSE only if all peers are FALSE 
                                            the global setting is in globals_flags[1] */
 static unsigned int global_tos_sip;            /*!< IP type of service for SIP packets */
 static int global_allowsubscribe;      /*!< Flag for disabling ALL subscriptions, this is FALSE only if all peers are FALSE 
                                            the global setting is in globals_flags[1] */
 static unsigned int global_tos_sip;            /*!< IP type of service for SIP packets */
@@ -859,7 +872,6 @@ static unsigned int global_cos_sip;         /*!< 802.1p class of service for SIP packet
 static unsigned int global_cos_audio;          /*!< 802.1p class of service for audio RTP packets */
 static unsigned int global_cos_video;          /*!< 802.1p class of service for video RTP packets */
 static unsigned int global_cos_text;           /*!< 802.1p class of service for text RTP packets */
 static unsigned int global_cos_audio;          /*!< 802.1p class of service for audio RTP packets */
 static unsigned int global_cos_video;          /*!< 802.1p class of service for video RTP packets */
 static unsigned int global_cos_text;           /*!< 802.1p class of service for text RTP packets */
-static int compactheaders;             /*!< send compact sip headers */
 static int recordhistory;              /*!< Record SIP history. Off by default */
 static int dumphistory;                        /*!< Dump history to verbose before destroying SIP dialog */
 static char global_realm[MAXHOSTNAMELEN];              /*!< Default realm */
 static int recordhistory;              /*!< Record SIP history. Off by default */
 static int dumphistory;                        /*!< Dump history to verbose before destroying SIP dialog */
 static char global_realm[MAXHOSTNAMELEN];              /*!< Default realm */
@@ -867,17 +879,12 @@ static char global_regcontext[AST_MAX_CONTEXT];           /*!< Context for auto-extension
 static char global_useragent[AST_MAX_EXTENSION];       /*!< Useragent for the SIP channel */
 static char global_sdpsession[AST_MAX_EXTENSION];      /*!< SDP session name for the SIP channel */
 static char global_sdpowner[AST_MAX_EXTENSION];        /*!< SDP owner name for the SIP channel */
 static char global_useragent[AST_MAX_EXTENSION];       /*!< Useragent for the SIP channel */
 static char global_sdpsession[AST_MAX_EXTENSION];      /*!< SDP session name for the SIP channel */
 static char global_sdpowner[AST_MAX_EXTENSION];        /*!< SDP owner name for the SIP channel */
-static int allow_external_domains;     /*!< Accept calls to external SIP domains? */
-static int global_callevents;          /*!< Whether we send manager events or not */
 static int global_authfailureevents;           /*!< Whether we send authentication failure manager events or not. Default no. */
 static int global_t1;                  /*!< T1 time */
 static int global_t1min;               /*!< T1 roundtrip time minimum */
 static int global_timer_b;                     /*!< Timer B - RFC 3261 Section 17.1.1.2 */
 static int global_authfailureevents;           /*!< Whether we send authentication failure manager events or not. Default no. */
 static int global_t1;                  /*!< T1 time */
 static int global_t1min;               /*!< T1 roundtrip time minimum */
 static int global_timer_b;                     /*!< Timer B - RFC 3261 Section 17.1.1.2 */
-static int global_regextenonqualify;           /*!< Whether to add/remove regexten when qualifying peers */
 static int global_autoframing;                 /*!< Turn autoframing on or off. */
 static int global_autoframing;                 /*!< Turn autoframing on or off. */
-static enum transfermodes global_allowtransfer;        /*!< SIP Refer restriction scheme */
 static struct sip_proxy global_outboundproxy;  /*!< Outbound proxy */
 static struct sip_proxy global_outboundproxy;  /*!< Outbound proxy */
-static int global_matchexterniplocally;                /*!< Match externip/externhost setting against localnet setting */
 static int global_qualifyfreq;                 /*!< Qualify frequency */
 
 
 static int global_qualifyfreq;                 /*!< Qualify frequency */
 
 
@@ -2747,7 +2754,7 @@ static int proxy_update(struct sip_proxy *proxy)
        if (!inet_aton(proxy->name, &proxy->ip.sin_addr)) {
                /* Ok, not an IP address, then let's check if it's a domain or host */
                /* XXX Todo - if we have proxy port, don't do SRV */
        if (!inet_aton(proxy->name, &proxy->ip.sin_addr)) {
                /* Ok, not an IP address, then let's check if it's a domain or host */
                /* XXX Todo - if we have proxy port, don't do SRV */
-               if (ast_get_ip_or_srv(&proxy->ip, proxy->name, global_srvlookup ? "_sip._udp" : NULL) < 0) {
+               if (ast_get_ip_or_srv(&proxy->ip, proxy->name, sip_cfg.srvlookup ? "_sip._udp" : NULL) < 0) {
                        ast_log(LOG_WARNING, "Unable to locate host '%s'\n", proxy->name);
                        return FALSE;
                }
                        ast_log(LOG_WARNING, "Unable to locate host '%s'\n", proxy->name);
                        return FALSE;
                }
@@ -3051,7 +3058,7 @@ static void ast_sip_ouraddrfor(struct in_addr *them, struct sockaddr_in *us)
                ast_apply_ha(localaddr, &theirs) == AST_SENSE_ALLOW ;
 
        if (want_remap &&
                ast_apply_ha(localaddr, &theirs) == AST_SENSE_ALLOW ;
 
        if (want_remap &&
-           (!global_matchexterniplocally || !ast_apply_ha(localaddr, us)) ) {
+           (!sip_cfg.matchexterniplocally || !ast_apply_ha(localaddr, us)) ) {
                /* if we used externhost or stun, see if it is time to refresh the info */
                if (externexpire && time(NULL) >= externexpire) {
                        if (stunaddr.sin_addr.s_addr) {
                /* if we used externhost or stun, see if it is time to refresh the info */
                if (externexpire && time(NULL) >= externexpire) {
                        if (stunaddr.sin_addr.s_addr) {
@@ -4211,7 +4218,7 @@ static struct sip_peer *realtime_peer(const char *newpeername, struct sockaddr_i
                /* Cache peer */
                ast_copy_flags(&peer->flags[1], &global_flags[1], SIP_PAGE2_RTAUTOCLEAR|SIP_PAGE2_RTCACHEFRIENDS);
                if (ast_test_flag(&global_flags[1], SIP_PAGE2_RTAUTOCLEAR)) {
                /* Cache peer */
                ast_copy_flags(&peer->flags[1], &global_flags[1], SIP_PAGE2_RTAUTOCLEAR|SIP_PAGE2_RTCACHEFRIENDS);
                if (ast_test_flag(&global_flags[1], SIP_PAGE2_RTAUTOCLEAR)) {
-                       AST_SCHED_REPLACE(peer->expire, sched, global_rtautoclear * 1000, expire_register, (void *) peer);
+                       AST_SCHED_REPLACE(peer->expire, sched, sip_cfg.rtautoclear * 1000, expire_register, (void *) peer);
                        /* we could be incr. its refcount right here, but I guess, since
                           peers hang around until module unload time anyway, it's not worth the trouble */
                }
                        /* we could be incr. its refcount right here, but I guess, since
                           peers hang around until module unload time anyway, it's not worth the trouble */
                }
@@ -4574,7 +4581,7 @@ static int create_addr(struct sip_pvt *dialog, const char *opeer, struct sockadd
                 */
                hostn = peername;
                portno = port ? atoi(port) : (dialog->socket.type & SIP_TRANSPORT_TLS) ? STANDARD_TLS_PORT : STANDARD_SIP_PORT;
                 */
                hostn = peername;
                portno = port ? atoi(port) : (dialog->socket.type & SIP_TRANSPORT_TLS) ? STANDARD_TLS_PORT : STANDARD_SIP_PORT;
-               if (global_srvlookup) {
+               if (sip_cfg.srvlookup) {
                        char service[MAXHOSTNAMELEN];
                        int tportno;
        
                        char service[MAXHOSTNAMELEN];
                        int tportno;
        
@@ -5902,7 +5909,7 @@ static struct ast_channel *sip_new(struct sip_pvt *i, int state, const char *tit
                append_history(i, "NewChan", "Channel %s - from %s", tmp->name, i->callid);
 
        /* Inform manager user about new channel and their SIP call ID */
                append_history(i, "NewChan", "Channel %s - from %s", tmp->name, i->callid);
 
        /* Inform manager user about new channel and their SIP call ID */
-       if (global_callevents)
+       if (sip_cfg.callevents)
                manager_event(EVENT_FLAG_SYSTEM, "ChannelUpdate",
                        "Channel: %s\r\nUniqueid: %s\r\nChanneltype: %s\r\nSIPcallid: %s\r\nSIPfullcontact: %s\r\n",
                        tmp->name, tmp->uniqueid, "SIP", i->callid, i->fullcontact);
                manager_event(EVENT_FLAG_SYSTEM, "ChannelUpdate",
                        "Channel: %s\r\nUniqueid: %s\r\nChanneltype: %s\r\nSIPcallid: %s\r\nSIPfullcontact: %s\r\n",
                        tmp->name, tmp->uniqueid, "SIP", i->callid, i->fullcontact);
@@ -6017,7 +6024,7 @@ static const char *__get_header(const struct sip_request *req, const char *name,
                for (x=*start; x<req->headers; x++) {
                        if (!strncasecmp(req->header[x], name, len)) {
                                char *r = req->header[x] + len; /* skip name */
                for (x=*start; x<req->headers; x++) {
                        if (!strncasecmp(req->header[x], name, len)) {
                                char *r = req->header[x] + len; /* skip name */
-                               if (pedanticsipchecking)
+                               if (sip_cfg.pedanticsipchecking)
                                        r = ast_skip_blanks(r);
 
                                if (*r == ':') {
                                        r = ast_skip_blanks(r);
 
                                if (*r == ':') {
@@ -6384,7 +6391,7 @@ static int find_call_cb(void *__pvt, void *__arg, int flags)
                        found = (!strcmp(p->callid, arg->callid));
                else {
                        found = !strcmp(p->callid, arg->callid);
                        found = (!strcmp(p->callid, arg->callid));
                else {
                        found = !strcmp(p->callid, arg->callid);
-                       if (pedanticsipchecking && found) {
+                       if (sip_cfg.pedanticsipchecking && found) {
                                found = ast_strlen_zero(arg->tag) || ast_strlen_zero(p->theirtag) || !ast_test_flag(&p->flags[1], SIP_PAGE2_DIALOG_ESTABLISHED) || !strcmp(p->theirtag, arg->tag);
                        } 
                }
                                found = ast_strlen_zero(arg->tag) || ast_strlen_zero(p->theirtag) || !ast_test_flag(&p->flags[1], SIP_PAGE2_DIALOG_ESTABLISHED) || !strcmp(p->theirtag, arg->tag);
                        } 
                }
@@ -6392,7 +6399,7 @@ static int find_call_cb(void *__pvt, void *__arg, int flags)
                ast_debug(5, "= %s Their Call ID: %s Their Tag %s Our tag: %s\n", found ? "Found" : "No match", p->callid, p->theirtag, p->tag);
                
                /* If we get a new request within an existing to-tag - check the to tag as well */
                ast_debug(5, "= %s Their Call ID: %s Their Tag %s Our tag: %s\n", found ? "Found" : "No match", p->callid, p->theirtag, p->tag);
                
                /* If we get a new request within an existing to-tag - check the to tag as well */
-               if (pedanticsipchecking && found && arg->method != SIP_RESPONSE) { /* SIP Request */
+               if (sip_cfg.pedanticsipchecking && found && arg->method != SIP_RESPONSE) { /* SIP Request */
                        if (p->tag[0] == '\0' && arg->totag[0]) {
                                /* We have no to tag, but they have. Wrong dialog */
                                found = FALSE;
                        if (p->tag[0] == '\0' && arg->totag[0]) {
                                /* We have no to tag, but they have. Wrong dialog */
                                found = FALSE;
@@ -6438,7 +6445,7 @@ static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *si
        arg.totag = totag;
        arg.tag = ""; /* make sure tag is never NULL */
 
        arg.totag = totag;
        arg.tag = ""; /* make sure tag is never NULL */
 
-       if (pedanticsipchecking) {
+       if (sip_cfg.pedanticsipchecking) {
                /* In principle Call-ID's uniquely identify a call, but with a forking SIP proxy
                   we need more to identify a branch - so we have to check branch, from
                   and to tags to identify a call leg.
                /* In principle Call-ID's uniquely identify a call, but with a forking SIP proxy
                   we need more to identify a branch - so we have to check branch, from
                   and to tags to identify a call leg.
@@ -6466,7 +6473,7 @@ static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *si
        }
 
 restartsearch:
        }
 
 restartsearch:
-       if (!pedanticsipchecking) {
+       if (!sip_cfg.pedanticsipchecking) {
                struct sip_pvt tmp_dialog = {
                        .callid = callid,
                };                      
                struct sip_pvt tmp_dialog = {
                        .callid = callid,
                };                      
@@ -7665,7 +7672,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
                ast_queue_frame(p->owner, &ast_null_frame);
                /* Queue Manager Unhold event */
                append_history(p, "Unhold", "%s", req->data->str);
                ast_queue_frame(p->owner, &ast_null_frame);
                /* Queue Manager Unhold event */
                append_history(p, "Unhold", "%s", req->data->str);
-               if (global_callevents)
+               if (sip_cfg.callevents)
                        manager_event(EVENT_FLAG_CALL, "Hold",
                                      "Status: Off\r\n"
                                      "Channel: %s\r\n"
                        manager_event(EVENT_FLAG_CALL, "Hold",
                                      "Status: Off\r\n"
                                      "Channel: %s\r\n"
@@ -7687,7 +7694,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
                ast_queue_frame(p->owner, &ast_null_frame);
                /* Queue Manager Hold event */
                append_history(p, "Hold", "%s", req->data->str);
                ast_queue_frame(p->owner, &ast_null_frame);
                /* Queue Manager Hold event */
                append_history(p, "Hold", "%s", req->data->str);
-               if (global_callevents && !ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD)) {
+               if (sip_cfg.callevents && !ast_test_flag(&p->flags[1], SIP_PAGE2_CALL_ONHOLD)) {
                        manager_event(EVENT_FLAG_CALL, "Hold",
                                      "Status: On\r\n"
                                      "Channel: %s\r\n"
                        manager_event(EVENT_FLAG_CALL, "Hold",
                                      "Status: On\r\n"
                                      "Channel: %s\r\n"
@@ -7732,7 +7739,7 @@ static int add_header(struct sip_request *req, const char *var, const char *valu
        ast_str_append(&req->data, 0, "%s: %s\r\n", var, value);
        req->header[req->headers] = req->data->str + req->len;
 
        ast_str_append(&req->data, 0, "%s: %s\r\n", var, value);
        req->header[req->headers] = req->data->str + req->len;
 
-       if (compactheaders)
+       if (sip_cfg.compactheaders)
                var = find_alias(var, var);
        req->len += strlen(req->header[req->headers]);
        req->headers++;
                var = find_alias(var, var);
        req->len += strlen(req->header[req->headers]);
        req->headers++;
@@ -7915,7 +7922,7 @@ static void set_destination(struct sip_pvt *p, char *uri)
        struct ast_hostent ahp;
        int debug=sip_debug_test_pvt(p);
        int tls_on = FALSE;
        struct ast_hostent ahp;
        int debug=sip_debug_test_pvt(p);
        int tls_on = FALSE;
-       int use_dns = global_srvlookup;
+       int use_dns = sip_cfg.srvlookup;
 
        if (debug)
                ast_verbose("set_destination: Parsing <%s> for address/port to send to\n", uri);
 
        if (debug)
                ast_verbose("set_destination: Parsing <%s> for address/port to send to\n", uri);
@@ -9367,7 +9374,7 @@ static void initreqprep(struct sip_request *req, struct sip_pvt *p, int sipmetho
        else /* Save for any further attempts */
                ast_string_field_set(p, fromname, n);
 
        else /* Save for any further attempts */
                ast_string_field_set(p, fromname, n);
 
-       if (pedanticsipchecking) {
+       if (sip_cfg.pedanticsipchecking) {
                ast_uri_encode(n, tmp_n, sizeof(tmp_n), 0);
                n = tmp_n;
                ast_uri_encode(l, tmp_l, sizeof(tmp_l), 0);
                ast_uri_encode(n, tmp_n, sizeof(tmp_n), 0);
                n = tmp_n;
                ast_uri_encode(l, tmp_l, sizeof(tmp_l), 0);
@@ -9389,7 +9396,7 @@ static void initreqprep(struct sip_request *req, struct sip_pvt *p, int sipmetho
                ast_str_append(&invite, 0, "sip:");
                if (!ast_strlen_zero(p->username)) {
                        n = p->username;
                ast_str_append(&invite, 0, "sip:");
                if (!ast_strlen_zero(p->username)) {
                        n = p->username;
-                       if (pedanticsipchecking) {
+                       if (sip_cfg.pedanticsipchecking) {
                                ast_uri_encode(n, tmp_n, sizeof(tmp_n), 0);
                                n = tmp_n;
                        }
                                ast_uri_encode(n, tmp_n, sizeof(tmp_n), 0);
                                n = tmp_n;
                        }
@@ -9615,7 +9622,7 @@ static int __sip_subscribe_mwi_do(struct sip_subscription_mwi *mwi)
        if (!mwi->dnsmgr) {
                char transport[MAXHOSTNAMELEN];
                snprintf(transport, sizeof(transport), "_sip._%s", get_transport(mwi->transport));
        if (!mwi->dnsmgr) {
                char transport[MAXHOSTNAMELEN];
                snprintf(transport, sizeof(transport), "_sip._%s", get_transport(mwi->transport));
-               ast_dnsmgr_lookup(mwi->hostname, &mwi->us, &mwi->dnsmgr, global_srvlookup ? transport : NULL);
+               ast_dnsmgr_lookup(mwi->hostname, &mwi->us, &mwi->dnsmgr, sip_cfg.srvlookup ? transport : NULL);
        }
 
        /* If we already have a subscription up simply send a resubscription */
        }
 
        /* If we already have a subscription up simply send a resubscription */
@@ -10169,7 +10176,7 @@ static int transmit_register(struct sip_registry *r, int sipmethod, const char *
        if (r->dnsmgr == NULL) {
                char transport[MAXHOSTNAMELEN];
                snprintf(transport, sizeof(transport), "_sip._%s", get_transport(r->transport)); /* have to use static get_transport function */
        if (r->dnsmgr == NULL) {
                char transport[MAXHOSTNAMELEN];
                snprintf(transport, sizeof(transport), "_sip._%s", get_transport(r->transport)); /* have to use static get_transport function */
-               ast_dnsmgr_lookup(r->hostname, &r->us, &r->dnsmgr, global_srvlookup ? transport : NULL);
+               ast_dnsmgr_lookup(r->hostname, &r->us, &r->dnsmgr, sip_cfg.srvlookup ? transport : NULL);
        }
 
        if (r->call) {  /* We have a registration */
        }
 
        if (r->call) {  /* We have a registration */
@@ -11359,7 +11366,7 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct sockaddr
        terminate_uri(uri);     /* warning, overwrite the string */
 
        ast_copy_string(tmp, get_header(req, "To"), sizeof(tmp));
        terminate_uri(uri);     /* warning, overwrite the string */
 
        ast_copy_string(tmp, get_header(req, "To"), sizeof(tmp));
-       if (pedanticsipchecking)
+       if (sip_cfg.pedanticsipchecking)
                ast_uri_decode(tmp);
 
        c = get_in_brackets(tmp);
                ast_uri_decode(tmp);
 
        c = get_in_brackets(tmp);
@@ -11459,7 +11466,7 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct sockaddr
                        } 
                }
        }
                        } 
                }
        }
-       if (!peer && autocreatepeer) {
+       if (!peer && sip_cfg.autocreatepeer) {
                /* Create peer if we have autocreate mode enabled */
                peer = temp_peer(name);
                if (peer) {
                /* Create peer if we have autocreate mode enabled */
                peer = temp_peer(name);
                if (peer) {
@@ -11517,7 +11524,7 @@ static enum check_auth_result register_verify(struct sip_pvt *p, struct sockaddr
                case AUTH_NOT_FOUND:
                case AUTH_PEER_NOT_DYNAMIC:
                case AUTH_ACL_FAILED:
                case AUTH_NOT_FOUND:
                case AUTH_PEER_NOT_DYNAMIC:
                case AUTH_ACL_FAILED:
-                       if (global_alwaysauthreject) {
+                       if (sip_cfg.alwaysauthreject) {
                                transmit_fake_auth_response(p, &p->initreq, 1);
                        } else {
                                /* URI not found */
                                transmit_fake_auth_response(p, &p->initreq, 1);
                        } else {
                                /* URI not found */
@@ -11666,7 +11673,7 @@ static int get_destination(struct sip_pvt *p, struct sip_request *oreq)
        if (req->rlPart2)
                ast_copy_string(tmp, req->rlPart2, sizeof(tmp));
        
        if (req->rlPart2)
                ast_copy_string(tmp, req->rlPart2, sizeof(tmp));
        
-       if (pedanticsipchecking)
+       if (sip_cfg.pedanticsipchecking)
                ast_uri_decode(tmp);
 
        uri = get_in_brackets(tmp);
                ast_uri_decode(tmp);
 
        uri = get_in_brackets(tmp);
@@ -11686,7 +11693,7 @@ static int get_destination(struct sip_pvt *p, struct sip_request *oreq)
         */
        ast_copy_string(tmpf, get_header(req, "From"), sizeof(tmpf));
        if (!ast_strlen_zero(tmpf)) {
         */
        ast_copy_string(tmpf, get_header(req, "From"), sizeof(tmpf));
        if (!ast_strlen_zero(tmpf)) {
-               if (pedanticsipchecking)
+               if (sip_cfg.pedanticsipchecking)
                        ast_uri_decode(tmpf);
                from = get_in_brackets(tmpf);
        } 
                        ast_uri_decode(tmpf);
                from = get_in_brackets(tmpf);
        } 
@@ -11732,7 +11739,7 @@ static int get_destination(struct sip_pvt *p, struct sip_request *oreq)
 
                domain_context[0] = '\0';
                if (!check_sip_domain(p->domain, domain_context, sizeof(domain_context))) {
 
                domain_context[0] = '\0';
                if (!check_sip_domain(p->domain, domain_context, sizeof(domain_context))) {
-                       if (!allow_external_domains && (req->method == SIP_INVITE || req->method == SIP_REFER)) {
+                       if (!sip_cfg.allow_external_domains && (req->method == SIP_INVITE || req->method == SIP_REFER)) {
                                ast_debug(1, "Got SIP %s to non-local domain '%s'; refusing request.\n", sip_methods[req->method].text, p->domain);
                                return -2;
                        }
                                ast_debug(1, "Got SIP %s to non-local domain '%s'; refusing request.\n", sip_methods[req->method].text, p->domain);
                                return -2;
                        }
@@ -11798,7 +11805,7 @@ static struct sip_pvt *get_sip_pvt_byid_locked(const char *callid, const char *t
        if (sip_pvt_ptr) {
                /* Go ahead and lock it (and its owner) before returning */
                sip_pvt_lock(sip_pvt_ptr);
        if (sip_pvt_ptr) {
                /* Go ahead and lock it (and its owner) before returning */
                sip_pvt_lock(sip_pvt_ptr);
-               if (pedanticsipchecking) {
+               if (sip_cfg.pedanticsipchecking) {
                        const char *pvt_fromtag, *pvt_totag;
                        unsigned char frommismatch = 0, tomismatch = 0;
 
                        const char *pvt_fromtag, *pvt_totag;
                        unsigned char frommismatch = 0, tomismatch = 0;
 
@@ -11896,7 +11903,7 @@ static int get_refer_info(struct sip_pvt *transferer, struct sip_request *outgoi
        }
        h_refer_to = ast_strdupa(p_refer_to);
        refer_to = get_in_brackets(h_refer_to);
        }
        h_refer_to = ast_strdupa(p_refer_to);
        refer_to = get_in_brackets(h_refer_to);
-       if (pedanticsipchecking)
+       if (sip_cfg.pedanticsipchecking)
                ast_uri_decode(refer_to);
 
        if (!strncasecmp(refer_to, "sip:", 4)) {
                ast_uri_decode(refer_to);
 
        if (!strncasecmp(refer_to, "sip:", 4)) {
@@ -11923,7 +11930,7 @@ static int get_refer_info(struct sip_pvt *transferer, struct sip_request *outgoi
        if (!ast_strlen_zero(p_referred_by)) {
                char *lessthan;
                h_referred_by = ast_strdupa(p_referred_by);
        if (!ast_strlen_zero(p_referred_by)) {
                char *lessthan;
                h_referred_by = ast_strdupa(p_referred_by);
-               if (pedanticsipchecking)
+               if (sip_cfg.pedanticsipchecking)
                        ast_uri_decode(h_referred_by);
 
                /* Store referrer's caller ID name */
                        ast_uri_decode(h_referred_by);
 
                /* Store referrer's caller ID name */
@@ -11982,7 +11989,7 @@ static int get_refer_info(struct sip_pvt *transferer, struct sip_request *outgoi
                                ast_copy_string(referdata->replaces_callid_fromtag, ptr, sizeof(referdata->replaces_callid_fromtag));
                        }
 
                                ast_copy_string(referdata->replaces_callid_fromtag, ptr, sizeof(referdata->replaces_callid_fromtag));
                        }
 
-                       if (!pedanticsipchecking)
+                       if (!sip_cfg.pedanticsipchecking)
                                ast_debug(2, "Attended transfer: Will use Replace-Call-ID : %s (No check of from/to tags)\n", referdata->replaces_callid );
                        else
                                ast_debug(2, "Attended transfer: Will use Replace-Call-ID : %s F-tag: %s T-tag: %s\n", referdata->replaces_callid, referdata->replaces_callid_fromtag ? referdata->replaces_callid_fromtag : "<none>", referdata->replaces_callid_totag ? referdata->replaces_callid_totag : "<none>" );
                                ast_debug(2, "Attended transfer: Will use Replace-Call-ID : %s (No check of from/to tags)\n", referdata->replaces_callid );
                        else
                                ast_debug(2, "Attended transfer: Will use Replace-Call-ID : %s F-tag: %s T-tag: %s\n", referdata->replaces_callid, referdata->replaces_callid_fromtag ? referdata->replaces_callid_fromtag : "<none>", referdata->replaces_callid_totag ? referdata->replaces_callid_totag : "<none>" );
@@ -12064,7 +12071,7 @@ static int get_also_info(struct sip_pvt *p, struct sip_request *oreq)
        ast_copy_string(tmp, get_header(req, "Also"), sizeof(tmp));
        c = get_in_brackets(tmp);
 
        ast_copy_string(tmp, get_header(req, "Also"), sizeof(tmp));
        c = get_in_brackets(tmp);
 
-       if (pedanticsipchecking)
+       if (sip_cfg.pedanticsipchecking)
                ast_uri_decode(c);
 
        if (!strncasecmp(c, "sip:", 4)) {
                ast_uri_decode(c);
 
        if (!strncasecmp(c, "sip:", 4)) {
@@ -12471,7 +12478,7 @@ static enum check_auth_result check_user_full(struct sip_pvt *p, struct sip_requ
        terminate_uri(uri2);    /* trim extra stuff */
 
        ast_copy_string(from, get_header(req, "From"), sizeof(from));
        terminate_uri(uri2);    /* trim extra stuff */
 
        ast_copy_string(from, get_header(req, "From"), sizeof(from));
-       if (pedanticsipchecking)
+       if (sip_cfg.pedanticsipchecking)
                ast_uri_decode(from);
        /* XXX here tries to map the username for invite things */
        memset(calleridname, 0, sizeof(calleridname));
                ast_uri_decode(from);
        /* XXX here tries to map the username for invite things */
        memset(calleridname, 0, sizeof(calleridname));
@@ -12562,10 +12569,10 @@ static enum check_auth_result check_user_full(struct sip_pvt *p, struct sip_requ
                return res;
 
        /* Finally, apply the guest policy */
                return res;
 
        /* Finally, apply the guest policy */
-       if (global_allowguest) {
+       if (sip_cfg.allowguest) {
                replace_cid(p, rpid_num, calleridname);
                res = AUTH_SUCCESSFUL;
                replace_cid(p, rpid_num, calleridname);
                res = AUTH_SUCCESSFUL;
-       } else if (global_alwaysauthreject)
+       } else if (sip_cfg.alwaysauthreject)
                res = AUTH_FAKE_AUTH; /* reject with fake authorization request */
        else
                res = AUTH_SECRET_FAILED; /* we don't want any guests, authentication will fail */
                res = AUTH_FAKE_AUTH; /* reject with fake authorization request */
        else
                res = AUTH_SECRET_FAILED; /* we don't want any guests, authentication will fail */
@@ -14126,9 +14133,9 @@ static char *sip_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_
        }
        ast_cli(a->fd, "  Videosupport:           %s\n", cli_yesno(ast_test_flag(&global_flags[1], SIP_PAGE2_VIDEOSUPPORT)));
        ast_cli(a->fd, "  Textsupport:            %s\n", cli_yesno(ast_test_flag(&global_flags[1], SIP_PAGE2_TEXTSUPPORT)));
        }
        ast_cli(a->fd, "  Videosupport:           %s\n", cli_yesno(ast_test_flag(&global_flags[1], SIP_PAGE2_VIDEOSUPPORT)));
        ast_cli(a->fd, "  Textsupport:            %s\n", cli_yesno(ast_test_flag(&global_flags[1], SIP_PAGE2_TEXTSUPPORT)));
-       ast_cli(a->fd, "  AutoCreate Peer:        %s\n", cli_yesno(autocreatepeer));
+       ast_cli(a->fd, "  AutoCreate Peer:        %s\n", cli_yesno(sip_cfg.autocreatepeer));
        ast_cli(a->fd, "  Match Auth Username:    %s\n", cli_yesno(global_match_auth_username));
        ast_cli(a->fd, "  Match Auth Username:    %s\n", cli_yesno(global_match_auth_username));
-       ast_cli(a->fd, "  Allow unknown access:   %s\n", cli_yesno(global_allowguest));
+       ast_cli(a->fd, "  Allow unknown access:   %s\n", cli_yesno(sip_cfg.allowguest));
        ast_cli(a->fd, "  Allow subscriptions:    %s\n", cli_yesno(ast_test_flag(&global_flags[1], SIP_PAGE2_ALLOWSUBSCRIBE)));
        ast_cli(a->fd, "  Allow overlap dialing:  %s\n", cli_yesno(ast_test_flag(&global_flags[1], SIP_PAGE2_ALLOWOVERLAP)));
        ast_cli(a->fd, "  Allow promsic. redir:   %s\n", cli_yesno(ast_test_flag(&global_flags[0], SIP_PROMISCREDIR)));
        ast_cli(a->fd, "  Allow subscriptions:    %s\n", cli_yesno(ast_test_flag(&global_flags[1], SIP_PAGE2_ALLOWSUBSCRIBE)));
        ast_cli(a->fd, "  Allow overlap dialing:  %s\n", cli_yesno(ast_test_flag(&global_flags[1], SIP_PAGE2_ALLOWOVERLAP)));
        ast_cli(a->fd, "  Allow promsic. redir:   %s\n", cli_yesno(ast_test_flag(&global_flags[0], SIP_PROMISCREDIR)));
@@ -14136,19 +14143,19 @@ static char *sip_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_
        ast_cli(a->fd, "  SIP domain support:     %s\n", cli_yesno(!AST_LIST_EMPTY(&domain_list)));
        ast_cli(a->fd, "  Realm. auth:            %s\n", cli_yesno(authl != NULL));
        ast_cli(a->fd, "  Our auth realm          %s\n", global_realm);
        ast_cli(a->fd, "  SIP domain support:     %s\n", cli_yesno(!AST_LIST_EMPTY(&domain_list)));
        ast_cli(a->fd, "  Realm. auth:            %s\n", cli_yesno(authl != NULL));
        ast_cli(a->fd, "  Our auth realm          %s\n", global_realm);
-       ast_cli(a->fd, "  Call to non-local dom.: %s\n", cli_yesno(allow_external_domains));
+       ast_cli(a->fd, "  Call to non-local dom.: %s\n", cli_yesno(sip_cfg.allow_external_domains));
        ast_cli(a->fd, "  URI user is phone no:   %s\n", cli_yesno(ast_test_flag(&global_flags[0], SIP_USEREQPHONE)));
        ast_cli(a->fd, "  URI user is phone no:   %s\n", cli_yesno(ast_test_flag(&global_flags[0], SIP_USEREQPHONE)));
-       ast_cli(a->fd, "  Always auth rejects:    %s\n", cli_yesno(global_alwaysauthreject));
-       ast_cli(a->fd, "  Direct RTP setup:       %s\n", cli_yesno(global_directrtpsetup));
+       ast_cli(a->fd, "  Always auth rejects:    %s\n", cli_yesno(sip_cfg.alwaysauthreject));
+       ast_cli(a->fd, "  Direct RTP setup:       %s\n", cli_yesno(sip_cfg.directrtpsetup));
        ast_cli(a->fd, "  User Agent:             %s\n", global_useragent);
        ast_cli(a->fd, "  SDP Session Name:       %s\n", ast_strlen_zero(global_sdpsession) ? "-" : global_sdpsession);
        ast_cli(a->fd, "  SDP Owner Name:         %s\n", ast_strlen_zero(global_sdpowner) ? "-" : global_sdpowner);
        ast_cli(a->fd, "  Reg. context:           %s\n", S_OR(global_regcontext, "(not set)"));
        ast_cli(a->fd, "  User Agent:             %s\n", global_useragent);
        ast_cli(a->fd, "  SDP Session Name:       %s\n", ast_strlen_zero(global_sdpsession) ? "-" : global_sdpsession);
        ast_cli(a->fd, "  SDP Owner Name:         %s\n", ast_strlen_zero(global_sdpowner) ? "-" : global_sdpowner);
        ast_cli(a->fd, "  Reg. context:           %s\n", S_OR(global_regcontext, "(not set)"));
-       ast_cli(a->fd, "  Regexten on Qualify:    %s\n", cli_yesno(global_regextenonqualify));
+       ast_cli(a->fd, "  Regexten on Qualify:    %s\n", cli_yesno(sip_cfg.regextenonqualify));
        ast_cli(a->fd, "  Caller ID:              %s\n", default_callerid);
        ast_cli(a->fd, "  From: Domain:           %s\n", default_fromdomain);
        ast_cli(a->fd, "  Record SIP history:     %s\n", recordhistory ? "On" : "Off");
        ast_cli(a->fd, "  Caller ID:              %s\n", default_callerid);
        ast_cli(a->fd, "  From: Domain:           %s\n", default_fromdomain);
        ast_cli(a->fd, "  Record SIP history:     %s\n", recordhistory ? "On" : "Off");
-       ast_cli(a->fd, "  Call Events:            %s\n", global_callevents ? "On" : "Off");
+       ast_cli(a->fd, "  Call Events:            %s\n", sip_cfg.callevents ? "On" : "Off");
        ast_cli(a->fd, "  Auth. Failure Events:   %s\n", global_authfailureevents ? "On" : "Off");
 
        ast_cli(a->fd, "  T38 fax pt UDPTL:       %s\n", cli_yesno(ast_test_flag(&global_flags[1], SIP_PAGE2_T38SUPPORT_UDPTL)));
        ast_cli(a->fd, "  Auth. Failure Events:   %s\n", global_authfailureevents ? "On" : "Off");
 
        ast_cli(a->fd, "  T38 fax pt UDPTL:       %s\n", cli_yesno(ast_test_flag(&global_flags[1], SIP_PAGE2_T38SUPPORT_UDPTL)));
@@ -14219,13 +14226,13 @@ static char *sip_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_
        ast_cli(a->fd, "\n");
        ast_cli(a->fd, "  Relax DTMF:             %s\n", cli_yesno(global_relaxdtmf));
        ast_cli(a->fd, "  RFC2833 Compensation:   %s\n", cli_yesno(ast_test_flag(&global_flags[1], SIP_PAGE2_RFC2833_COMPENSATE)));
        ast_cli(a->fd, "\n");
        ast_cli(a->fd, "  Relax DTMF:             %s\n", cli_yesno(global_relaxdtmf));
        ast_cli(a->fd, "  RFC2833 Compensation:   %s\n", cli_yesno(ast_test_flag(&global_flags[1], SIP_PAGE2_RFC2833_COMPENSATE)));
-       ast_cli(a->fd, "  Compact SIP headers:    %s\n", cli_yesno(compactheaders));
+       ast_cli(a->fd, "  Compact SIP headers:    %s\n", cli_yesno(sip_cfg.compactheaders));
        ast_cli(a->fd, "  RTP Keepalive:          %d %s\n", global_rtpkeepalive, global_rtpkeepalive ? "" : "(Disabled)" );
        ast_cli(a->fd, "  RTP Timeout:            %d %s\n", global_rtptimeout, global_rtptimeout ? "" : "(Disabled)" );
        ast_cli(a->fd, "  RTP Hold Timeout:       %d %s\n", global_rtpholdtimeout, global_rtpholdtimeout ? "" : "(Disabled)");
        ast_cli(a->fd, "  MWI NOTIFY mime type:   %s\n", default_notifymime);
        ast_cli(a->fd, "  RTP Keepalive:          %d %s\n", global_rtpkeepalive, global_rtpkeepalive ? "" : "(Disabled)" );
        ast_cli(a->fd, "  RTP Timeout:            %d %s\n", global_rtptimeout, global_rtptimeout ? "" : "(Disabled)" );
        ast_cli(a->fd, "  RTP Hold Timeout:       %d %s\n", global_rtpholdtimeout, global_rtpholdtimeout ? "" : "(Disabled)");
        ast_cli(a->fd, "  MWI NOTIFY mime type:   %s\n", default_notifymime);
-       ast_cli(a->fd, "  DNS SRV lookup:         %s\n", cli_yesno(global_srvlookup));
-       ast_cli(a->fd, "  Pedantic SIP support:   %s\n", cli_yesno(pedanticsipchecking));
+       ast_cli(a->fd, "  DNS SRV lookup:         %s\n", cli_yesno(sip_cfg.srvlookup));
+       ast_cli(a->fd, "  Pedantic SIP support:   %s\n", cli_yesno(sip_cfg.pedanticsipchecking));
        ast_cli(a->fd, "  Reg. min duration       %d secs\n", min_expiry);
        ast_cli(a->fd, "  Reg. max duration:      %d secs\n", max_expiry);
        ast_cli(a->fd, "  Reg. default duration:  %d secs\n", default_expiry);
        ast_cli(a->fd, "  Reg. min duration       %d secs\n", min_expiry);
        ast_cli(a->fd, "  Reg. max duration:      %d secs\n", max_expiry);
        ast_cli(a->fd, "  Reg. default duration:  %d secs\n", default_expiry);
@@ -14271,7 +14278,7 @@ static char *sip_show_settings(struct ast_cli_entry *e, int cmd, struct ast_cli_
                ast_cli(a->fd, "  Update:                 %s\n", cli_yesno(sip_cfg.peer_rtupdate));
                ast_cli(a->fd, "  Ignore Reg. Expire:     %s\n", cli_yesno(sip_cfg.ignore_regexpire));
                ast_cli(a->fd, "  Save sys. name:         %s\n", cli_yesno(sip_cfg.rtsave_sysname));
                ast_cli(a->fd, "  Update:                 %s\n", cli_yesno(sip_cfg.peer_rtupdate));
                ast_cli(a->fd, "  Ignore Reg. Expire:     %s\n", cli_yesno(sip_cfg.ignore_regexpire));
                ast_cli(a->fd, "  Save sys. name:         %s\n", cli_yesno(sip_cfg.rtsave_sysname));
-               ast_cli(a->fd, "  Auto Clear:             %d\n", global_rtautoclear);
+               ast_cli(a->fd, "  Auto Clear:             %d\n", sip_cfg.rtautoclear);
        }
        ast_cli(a->fd, "\n----\n");
        return CLI_SUCCESS;
        }
        ast_cli(a->fd, "\n----\n");
        return CLI_SUCCESS;
@@ -15955,7 +15962,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, char *rest, stru
                if (!req->ignore && p->owner) {
                        if (!reinvite) {
                                ast_queue_control(p->owner, AST_CONTROL_ANSWER);
                if (!req->ignore && p->owner) {
                        if (!reinvite) {
                                ast_queue_control(p->owner, AST_CONTROL_ANSWER);
-                               if (global_callevents)
+                               if (sip_cfg.callevents)
                                        manager_event(EVENT_FLAG_SYSTEM, "ChannelUpdate",
                                                "Channel: %s\r\nChanneltype: %s\r\nUniqueid: %s\r\nSIPcallid: %s\r\nSIPfullcontact: %s\r\nPeername: %s\r\n",
                                                p->owner->name, p->owner->uniqueid, "SIP", p->callid, p->fullcontact, p->peername);
                                        manager_event(EVENT_FLAG_SYSTEM, "ChannelUpdate",
                                                "Channel: %s\r\nChanneltype: %s\r\nUniqueid: %s\r\nSIPcallid: %s\r\nSIPfullcontact: %s\r\nPeername: %s\r\n",
                                                p->owner->name, p->owner->uniqueid, "SIP", p->callid, p->fullcontact, p->peername);
@@ -16494,7 +16501,7 @@ static void handle_response_peerpoke(struct sip_pvt *p, int resp, struct sip_req
                manager_event(EVENT_FLAG_SYSTEM, "PeerStatus",
                        "ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: %s\r\nTime: %d\r\n",
                        peer->name, s, pingtime);
                manager_event(EVENT_FLAG_SYSTEM, "PeerStatus",
                        "ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: %s\r\nTime: %d\r\n",
                        peer->name, s, pingtime);
-               if (is_reachable && global_regextenonqualify)
+               if (is_reachable && sip_cfg.regextenonqualify)
                        register_peer_exten(peer, TRUE);
        }
 
                        register_peer_exten(peer, TRUE);
        }
 
@@ -17917,7 +17924,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
                /* If pedantic is on, we need to check the tags. If they're different, this is
                in fact a forked call through a SIP proxy somewhere. */
                int different;
                /* If pedantic is on, we need to check the tags. If they're different, this is
                in fact a forked call through a SIP proxy somewhere. */
                int different;
-               if (pedanticsipchecking)
+               if (sip_cfg.pedanticsipchecking)
                        different = sip_uri_cmp(p->initreq.rlPart2, req->rlPart2);
                else
                        different = strcmp(p->initreq.rlPart2, req->rlPart2);
                        different = sip_uri_cmp(p->initreq.rlPart2, req->rlPart2);
                else
                        different = strcmp(p->initreq.rlPart2, req->rlPart2);
@@ -18825,7 +18832,7 @@ static int handle_request_refer(struct sip_pvt *p, struct sip_request *req, int
                ast_string_field_set(p, context, default_context);
 
        /* If we do not support SIP domains, all transfers are local */
                ast_string_field_set(p, context, default_context);
 
        /* If we do not support SIP domains, all transfers are local */
-       if (allow_external_domains && check_sip_domain(p->refer->refer_to_domain, NULL, 0)) {
+       if (sip_cfg.allow_external_domains && check_sip_domain(p->refer->refer_to_domain, NULL, 0)) {
                p->refer->localtransfer = 1;
                if (sipdebug)
                        ast_debug(3, "This SIP transfer is local : %s\n", p->refer->refer_to_domain);
                p->refer->localtransfer = 1;
                if (sipdebug)
                        ast_debug(3, "This SIP transfer is local : %s\n", p->refer->refer_to_domain);
@@ -19811,7 +19818,7 @@ static int handle_incoming(struct sip_pvt *p, struct sip_request *req, struct so
        }
        snprintf(p->lastmsg, sizeof(p->lastmsg), "Rx: %s", cmd);
 
        }
        snprintf(p->lastmsg, sizeof(p->lastmsg), "Rx: %s", cmd);
 
-       if (pedanticsipchecking) {
+       if (sip_cfg.pedanticsipchecking) {
                /* If this is a request packet without a from tag, it's not
                        correct according to RFC 3261  */
                /* Check if this a new request in a new dialog with a totag already attached to it,
                /* If this is a request packet without a from tag, it's not
                        correct according to RFC 3261  */
                /* Check if this a new request in a new dialog with a totag already attached to it,
@@ -19967,7 +19974,7 @@ static int handle_request_do(struct sip_request *req, struct sockaddr_in *sin)
 
        if (sip_debug_test_addr(sin))   /* Set the debug flag early on packet level */
                req->debug = 1;
 
        if (sip_debug_test_addr(sin))   /* Set the debug flag early on packet level */
                req->debug = 1;
-       if (pedanticsipchecking)
+       if (sip_cfg.pedanticsipchecking)
                req->len = lws2sws(req->data->str, req->len);   /* Fix multiline headers */
        if (req->debug) {
                ast_verbose("\n<--- SIP read from %s:%s:%d --->\n%s\n<------------->\n", 
                req->len = lws2sws(req->data->str, req->len);   /* Fix multiline headers */
        if (req->debug) {
                ast_verbose("\n<--- SIP read from %s:%s:%d --->\n%s\n<------------->\n", 
@@ -20774,7 +20781,7 @@ static int sip_poke_noanswer(const void *data)
        if (peer->lastms > -1) {
                ast_log(LOG_NOTICE, "Peer '%s' is now UNREACHABLE!  Last qualify: %d\n", peer->name, peer->lastms);
                manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: Unreachable\r\nTime: %d\r\n", peer->name, -1);
        if (peer->lastms > -1) {
                ast_log(LOG_NOTICE, "Peer '%s' is now UNREACHABLE!  Last qualify: %d\n", peer->name, peer->lastms);
                manager_event(EVENT_FLAG_SYSTEM, "PeerStatus", "ChannelType: SIP\r\nPeer: SIP/%s\r\nPeerStatus: Unreachable\r\nTime: %d\r\n", peer->name, -1);
-               if (global_regextenonqualify)
+               if (sip_cfg.regextenonqualify)
                        register_peer_exten(peer, FALSE);
        }
        if (peer->call) {
                        register_peer_exten(peer, FALSE);
        }
        if (peer->call) {
@@ -21129,7 +21136,7 @@ static struct ast_channel *sip_request_call(const char *type, int format, void *
        p->jointcapability = oldformat;
        sip_pvt_lock(p);
        tmpc = sip_new(p, AST_STATE_DOWN, host);        /* Place the call */
        p->jointcapability = oldformat;
        sip_pvt_lock(p);
        tmpc = sip_new(p, AST_STATE_DOWN, host);        /* Place the call */
-       if (global_callevents)
+       if (sip_cfg.callevents)
                manager_event(EVENT_FLAG_SYSTEM, "ChannelUpdate",
                        "Channel: %s\r\nChanneltype: %s\r\nSIPcallid: %s\r\nSIPfullcontact: %s\r\nPeername: %s\r\n",
                        p->owner? p->owner->name : "", "SIP", p->callid, p->fullcontact, p->peername);
                manager_event(EVENT_FLAG_SYSTEM, "ChannelUpdate",
                        "Channel: %s\r\nChanneltype: %s\r\nSIPcallid: %s\r\nSIPfullcontact: %s\r\nPeername: %s\r\n",
                        p->owner? p->owner->name : "", "SIP", p->callid, p->fullcontact, p->peername);
@@ -21953,7 +21960,7 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
                
                snprintf(transport, sizeof(transport), "_sip._%s", get_transport(peer->socket.type));
 
                
                snprintf(transport, sizeof(transport), "_sip._%s", get_transport(peer->socket.type));
 
-               if (ast_dnsmgr_lookup(_srvlookup, &peer->addr, &peer->dnsmgr, global_srvlookup ? transport : NULL)) {
+               if (ast_dnsmgr_lookup(_srvlookup, &peer->addr, &peer->dnsmgr, sip_cfg.srvlookup ? transport : NULL)) {
                        unref_peer(peer, "getting rid of a peer pointer");
                        return NULL;
                }
                        unref_peer(peer, "getting rid of a peer pointer");
                        return NULL;
                }
@@ -22158,7 +22165,7 @@ static int reload_config(enum channelreloadreason reason)
        ourport_tcp = STANDARD_SIP_PORT;
        ourport_tls = STANDARD_TLS_PORT;
        bindaddr.sin_port = htons(STANDARD_SIP_PORT);
        ourport_tcp = STANDARD_SIP_PORT;
        ourport_tls = STANDARD_TLS_PORT;
        bindaddr.sin_port = htons(STANDARD_SIP_PORT);
-       global_srvlookup = DEFAULT_SRVLOOKUP;
+       sip_cfg.srvlookup = DEFAULT_SRVLOOKUP;
        global_tos_sip = DEFAULT_TOS_SIP;
        global_tos_audio = DEFAULT_TOS_AUDIO;
        global_tos_video = DEFAULT_TOS_VIDEO;
        global_tos_sip = DEFAULT_TOS_SIP;
        global_tos_audio = DEFAULT_TOS_AUDIO;
        global_tos_video = DEFAULT_TOS_VIDEO;
@@ -22173,13 +22180,13 @@ static int reload_config(enum channelreloadreason reason)
        externrefresh = 10;
 
        /* Reset channel settings to default before re-configuring */
        externrefresh = 10;
 
        /* Reset channel settings to default before re-configuring */
-       allow_external_domains = DEFAULT_ALLOW_EXT_DOM;                         /* Allow external invites */
+       sip_cfg.allow_external_domains = DEFAULT_ALLOW_EXT_DOM;                         /* Allow external invites */
        global_regcontext[0] = '\0';
        global_regcontext[0] = '\0';
-       global_regextenonqualify = DEFAULT_REGEXTENONQUALIFY;
+       sip_cfg.regextenonqualify = DEFAULT_REGEXTENONQUALIFY;
        global_notifyringing = DEFAULT_NOTIFYRINGING;
        global_notifyhold = FALSE;              /*!< Keep track of hold status for a peer */
        global_notifyringing = DEFAULT_NOTIFYRINGING;
        global_notifyhold = FALSE;              /*!< Keep track of hold status for a peer */
-       global_directrtpsetup = FALSE;          /* Experimental feature, disabled by default */
-       global_alwaysauthreject = 0;
+       sip_cfg.directrtpsetup = FALSE;         /* Experimental feature, disabled by default */
+       sip_cfg.alwaysauthreject = DEFAULT_ALWAYSAUTHREJECT;
        global_allowsubscribe = FALSE;
        snprintf(global_useragent, sizeof(global_useragent), "%s %s", DEFAULT_USERAGENT, ast_get_version());
        snprintf(global_sdpsession, sizeof(global_sdpsession), "%s %s", DEFAULT_SDPSESSION, ast_get_version());
        global_allowsubscribe = FALSE;
        snprintf(global_useragent, sizeof(global_useragent), "%s %s", DEFAULT_USERAGENT, ast_get_version());
        snprintf(global_sdpsession, sizeof(global_sdpsession), "%s %s", DEFAULT_SDPSESSION, ast_get_version());
@@ -22187,20 +22194,20 @@ static int reload_config(enum channelreloadreason reason)
        ast_copy_string(default_notifymime, DEFAULT_NOTIFYMIME, sizeof(default_notifymime));
        ast_copy_string(global_realm, S_OR(ast_config_AST_SYSTEM_NAME, DEFAULT_REALM), sizeof(global_realm));
        ast_copy_string(default_callerid, DEFAULT_CALLERID, sizeof(default_callerid));
        ast_copy_string(default_notifymime, DEFAULT_NOTIFYMIME, sizeof(default_notifymime));
        ast_copy_string(global_realm, S_OR(ast_config_AST_SYSTEM_NAME, DEFAULT_REALM), sizeof(global_realm));
        ast_copy_string(default_callerid, DEFAULT_CALLERID, sizeof(default_callerid));
-       compactheaders = DEFAULT_COMPACTHEADERS;
+       sip_cfg.compactheaders = DEFAULT_COMPACTHEADERS;
        global_reg_timeout = DEFAULT_REGISTRATION_TIMEOUT;
        global_regattempts_max = 0;
        global_reg_timeout = DEFAULT_REGISTRATION_TIMEOUT;
        global_regattempts_max = 0;
-       pedanticsipchecking = DEFAULT_PEDANTIC;
-       autocreatepeer = DEFAULT_AUTOCREATEPEER;
+       sip_cfg.pedanticsipchecking = DEFAULT_PEDANTIC;
+       sip_cfg.autocreatepeer = DEFAULT_AUTOCREATEPEER;
        global_autoframing = 0;
        global_autoframing = 0;
-       global_allowguest = DEFAULT_ALLOWGUEST;
+       sip_cfg.allowguest = DEFAULT_ALLOWGUEST;
        global_callcounter = DEFAULT_CALLCOUNTER;
        global_match_auth_username = FALSE;             /*!< Match auth username if available instead of From: Default off. */
        global_rtptimeout = 0;
        global_rtpholdtimeout = 0;
        global_callcounter = DEFAULT_CALLCOUNTER;
        global_match_auth_username = FALSE;             /*!< Match auth username if available instead of From: Default off. */
        global_rtptimeout = 0;
        global_rtpholdtimeout = 0;
-       global_rtpkeepalive = 0;
+       global_rtpkeepalive = DEFAULT_RTPKEEPALIVE;
        global_allowtransfer = TRANSFER_OPENFORALL;     /* Merrily accept all transfers by default */
        global_allowtransfer = TRANSFER_OPENFORALL;     /* Merrily accept all transfers by default */
-       global_rtautoclear = 120;
+       sip_cfg.rtautoclear = 120;
        ast_set_flag(&global_flags[1], SIP_PAGE2_ALLOWSUBSCRIBE);       /* Default for all devices: TRUE */
        ast_set_flag(&global_flags[1], SIP_PAGE2_ALLOWOVERLAP);         /* Default for all devices: TRUE */
        sip_cfg.peer_rtupdate = TRUE;
        ast_set_flag(&global_flags[1], SIP_PAGE2_ALLOWSUBSCRIBE);       /* Default for all devices: TRUE */
        ast_set_flag(&global_flags[1], SIP_PAGE2_ALLOWOVERLAP);         /* Default for all devices: TRUE */
        sip_cfg.peer_rtupdate = TRUE;
@@ -22232,14 +22239,14 @@ static int reload_config(enum channelreloadreason reason)
 
        /* Misc settings for the channel */
        global_relaxdtmf = FALSE;
 
        /* Misc settings for the channel */
        global_relaxdtmf = FALSE;
-       global_callevents = FALSE;
+       sip_cfg.callevents = DEFAULT_CALLEVENTS;
        global_authfailureevents = FALSE;
        global_t1 = SIP_TIMER_T1;
        global_timer_b = 64 * SIP_TIMER_T1;
        global_t1min = DEFAULT_T1MIN;
        global_qualifyfreq = DEFAULT_QUALIFYFREQ;
 
        global_authfailureevents = FALSE;
        global_t1 = SIP_TIMER_T1;
        global_timer_b = 64 * SIP_TIMER_T1;
        global_t1min = DEFAULT_T1MIN;
        global_qualifyfreq = DEFAULT_QUALIFYFREQ;
 
-       global_matchexterniplocally = FALSE;
+       sip_cfg.matchexterniplocally = DEFAULT_MATCHEXTERNIPLOCALLY;
 
        /* Copy the default jb config over global_jbconf */
        memcpy(&global_jbconf, &default_jbconf, sizeof(struct ast_jb_conf));
 
        /* Copy the default jb config over global_jbconf */
        memcpy(&global_jbconf, &default_jbconf, sizeof(struct ast_jb_conf));
@@ -22263,7 +22270,7 @@ static int reload_config(enum channelreloadreason reason)
                } else if (!strcasecmp(v->name, "callcounter")) {
                        global_callcounter = ast_true(v->value) ? 1 : 0;
                } else if (!strcasecmp(v->name, "allowguest")) {
                } else if (!strcasecmp(v->name, "callcounter")) {
                        global_callcounter = ast_true(v->value) ? 1 : 0;
                } else if (!strcasecmp(v->name, "allowguest")) {
-                       global_allowguest = ast_true(v->value) ? 1 : 0;
+                       sip_cfg.allowguest = ast_true(v->value) ? 1 : 0;
                } else if (!strcasecmp(v->name, "realm")) {
                        ast_copy_string(global_realm, v->value, sizeof(global_realm));
                } else if (!strcasecmp(v->name, "useragent")) {
                } else if (!strcasecmp(v->name, "realm")) {
                        ast_copy_string(global_realm, v->value, sizeof(global_realm));
                } else if (!strcasecmp(v->name, "useragent")) {
@@ -22357,7 +22364,7 @@ static int reload_config(enum channelreloadreason reason)
                } else if (!strcasecmp(v->name, "rtautoclear")) {
                        int i = atoi(v->value);
                        if (i > 0)
                } else if (!strcasecmp(v->name, "rtautoclear")) {
                        int i = atoi(v->value);
                        if (i > 0)
-                               global_rtautoclear = i;
+                               sip_cfg.rtautoclear = i;
                        else
                                i = 0;
                        ast_set2_flag(&global_flags[1], i || ast_true(v->value), SIP_PAGE2_RTAUTOCLEAR);
                        else
                                i = 0;
                        ast_set2_flag(&global_flags[1], i || ast_true(v->value), SIP_PAGE2_RTAUTOCLEAR);
@@ -22380,20 +22387,20 @@ static int reload_config(enum channelreloadreason reason)
                } else if (!strcasecmp(v->name, "rtpkeepalive")) {
                        if ((sscanf(v->value, "%d", &global_rtpkeepalive) != 1) || (global_rtpkeepalive < 0)) {
                                ast_log(LOG_WARNING, "'%s' is not a valid RTP keepalive time at line %d.  Using default.\n", v->value, v->lineno);
                } else if (!strcasecmp(v->name, "rtpkeepalive")) {
                        if ((sscanf(v->value, "%d", &global_rtpkeepalive) != 1) || (global_rtpkeepalive < 0)) {
                                ast_log(LOG_WARNING, "'%s' is not a valid RTP keepalive time at line %d.  Using default.\n", v->value, v->lineno);
-                               global_rtpkeepalive = 0;
+                               global_rtpkeepalive = DEFAULT_RTPKEEPALIVE;
                        }
                } else if (!strcasecmp(v->name, "compactheaders")) {
                        }
                } else if (!strcasecmp(v->name, "compactheaders")) {
-                       compactheaders = ast_true(v->value);
+                       sip_cfg.compactheaders = ast_true(v->value);
                } else if (!strcasecmp(v->name, "notifymimetype")) {
                        ast_copy_string(default_notifymime, v->value, sizeof(default_notifymime));
                } else if (!strcasecmp(v->name, "directrtpsetup")) {
                } else if (!strcasecmp(v->name, "notifymimetype")) {
                        ast_copy_string(default_notifymime, v->value, sizeof(default_notifymime));
                } else if (!strcasecmp(v->name, "directrtpsetup")) {
-                       global_directrtpsetup = ast_true(v->value);
+                       sip_cfg.directrtpsetup = ast_true(v->value);
                } else if (!strcasecmp(v->name, "notifyringing")) {
                        global_notifyringing = ast_true(v->value);
                } else if (!strcasecmp(v->name, "notifyhold")) {
                        global_notifyhold = ast_true(v->value);
                } else if (!strcasecmp(v->name, "alwaysauthreject")) {
                } else if (!strcasecmp(v->name, "notifyringing")) {
                        global_notifyringing = ast_true(v->value);
                } else if (!strcasecmp(v->name, "notifyhold")) {
                        global_notifyhold = ast_true(v->value);
                } else if (!strcasecmp(v->name, "alwaysauthreject")) {
-                       global_alwaysauthreject = ast_true(v->value);
+                       sip_cfg.alwaysauthreject = ast_true(v->value);
                } else if (!strcasecmp(v->name, "mohinterpret")) {
                        ast_copy_string(default_mohinterpret, v->value, sizeof(default_mohinterpret));
                } else if (!strcasecmp(v->name, "mohsuggest")) {
                } else if (!strcasecmp(v->name, "mohinterpret")) {
                        ast_copy_string(default_mohinterpret, v->value, sizeof(default_mohinterpret));
                } else if (!strcasecmp(v->name, "mohsuggest")) {
@@ -22412,7 +22419,7 @@ static int reload_config(enum channelreloadreason reason)
                        }
                        ast_copy_string(global_regcontext, v->value, sizeof(global_regcontext));
                } else if (!strcasecmp(v->name, "regextenonqualify")) {
                        }
                        ast_copy_string(global_regcontext, v->value, sizeof(global_regcontext));
                } else if (!strcasecmp(v->name, "regextenonqualify")) {
-                       global_regextenonqualify = ast_true(v->value);
+                       sip_cfg.regextenonqualify = ast_true(v->value);
                } else if (!strcasecmp(v->name, "callerid")) {
                        ast_copy_string(default_callerid, v->value, sizeof(default_callerid));
                } else if (!strcasecmp(v->name, "fromdomain")) {
                } else if (!strcasecmp(v->name, "callerid")) {
                        ast_copy_string(default_callerid, v->value, sizeof(default_callerid));
                } else if (!strcasecmp(v->name, "fromdomain")) {
@@ -22446,13 +22453,13 @@ static int reload_config(enum channelreloadreason reason)
 
                        ast_copy_string(global_outboundproxy.name, proxyname, sizeof(global_outboundproxy.name));
                } else if (!strcasecmp(v->name, "autocreatepeer")) {
 
                        ast_copy_string(global_outboundproxy.name, proxyname, sizeof(global_outboundproxy.name));
                } else if (!strcasecmp(v->name, "autocreatepeer")) {
-                       autocreatepeer = ast_true(v->value);
+                       sip_cfg.autocreatepeer = ast_true(v->value);
                } else if (!strcasecmp(v->name, "match_auth_username")) {
                        global_match_auth_username = ast_true(v->value);
                } else if (!strcasecmp(v->name, "srvlookup")) {
                } else if (!strcasecmp(v->name, "match_auth_username")) {
                        global_match_auth_username = ast_true(v->value);
                } else if (!strcasecmp(v->name, "srvlookup")) {
-                       global_srvlookup = ast_true(v->value);
+                       sip_cfg.srvlookup = ast_true(v->value);
                } else if (!strcasecmp(v->name, "pedantic")) {
                } else if (!strcasecmp(v->name, "pedantic")) {
-                       pedanticsipchecking = ast_true(v->value);
+                       sip_cfg.pedanticsipchecking = ast_true(v->value);
                } else if (!strcasecmp(v->name, "maxexpirey") || !strcasecmp(v->name, "maxexpiry")) {
                        max_expiry = atoi(v->value);
                        if (max_expiry < 1)
                } else if (!strcasecmp(v->name, "maxexpirey") || !strcasecmp(v->name, "maxexpiry")) {
                        max_expiry = atoi(v->value);
                        if (max_expiry < 1)
@@ -22528,7 +22535,7 @@ static int reload_config(enum channelreloadreason reason)
                } else if (!strcasecmp(v->name, "autoframing")) {
                        global_autoframing = ast_true(v->value);
                } else if (!strcasecmp(v->name, "allowexternaldomains")) {
                } else if (!strcasecmp(v->name, "autoframing")) {
                        global_autoframing = ast_true(v->value);
                } else if (!strcasecmp(v->name, "allowexternaldomains")) {
-                       allow_external_domains = ast_true(v->value);
+                       sip_cfg.allow_external_domains = ast_true(v->value);
                } else if (!strcasecmp(v->name, "autodomain")) {
                        auto_sip_domains = ast_true(v->value);
                } else if (!strcasecmp(v->name, "domain")) {
                } else if (!strcasecmp(v->name, "autodomain")) {
                        auto_sip_domains = ast_true(v->value);
                } else if (!strcasecmp(v->name, "domain")) {
@@ -22619,7 +22626,7 @@ static int reload_config(enum channelreloadreason reason)
                                global_qualifyfreq = DEFAULT_QUALIFYFREQ;
                        }
                } else if (!strcasecmp(v->name, "callevents")) {
                                global_qualifyfreq = DEFAULT_QUALIFYFREQ;
                        }
                } else if (!strcasecmp(v->name, "callevents")) {
-                       global_callevents = ast_true(v->value);
+                       sip_cfg.callevents = ast_true(v->value);
                } else if (!strcasecmp(v->name, "authfailureevents")) {
                        global_authfailureevents = ast_true(v->value);
                } else if (!strcasecmp(v->name, "maxcallbitrate")) {
                } else if (!strcasecmp(v->name, "authfailureevents")) {
                        global_authfailureevents = ast_true(v->value);
                } else if (!strcasecmp(v->name, "maxcallbitrate")) {
@@ -22627,7 +22634,7 @@ static int reload_config(enum channelreloadreason reason)
                        if (default_maxcallbitrate < 0)
                                default_maxcallbitrate = DEFAULT_MAX_CALL_BITRATE;
                } else if (!strcasecmp(v->name, "matchexterniplocally")) {
                        if (default_maxcallbitrate < 0)
                                default_maxcallbitrate = DEFAULT_MAX_CALL_BITRATE;
                } else if (!strcasecmp(v->name, "matchexterniplocally")) {
-                       global_matchexterniplocally = ast_true(v->value);
+                       sip_cfg.matchexterniplocally = ast_true(v->value);
                } else if (!strcasecmp(v->name, "session-timers")) {
                        int i = (int) str2stmode(v->value); 
                        if (i < 0) {
                } else if (!strcasecmp(v->name, "session-timers")) {
                        int i = (int) str2stmode(v->value); 
                        if (i < 0) {
@@ -22661,9 +22668,9 @@ static int reload_config(enum channelreloadreason reason)
                }
        }
 
                }
        }
 
-       if (!allow_external_domains && AST_LIST_EMPTY(&domain_list)) {
+       if (!sip_cfg.allow_external_domains && AST_LIST_EMPTY(&domain_list)) {
                ast_log(LOG_WARNING, "To disallow external domains, you need to configure local SIP domains.\n");
                ast_log(LOG_WARNING, "To disallow external domains, you need to configure local SIP domains.\n");
-               allow_external_domains = 1;
+               sip_cfg.allow_external_domains = 1;
        }
        /* If not configured, set default transports */
        if (default_transports == 0) {
        }
        /* If not configured, set default transports */
        if (default_transports == 0) {
@@ -23110,7 +23117,7 @@ static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struc
                return -1;
 
        /* Disable early RTP bridge  */
                return -1;
 
        /* Disable early RTP bridge  */
-       if (chan->_state != AST_STATE_UP && !global_directrtpsetup)     /* We are in early state */
+       if (chan->_state != AST_STATE_UP && !sip_cfg.directrtpsetup)    /* We are in early state */
                return 0;
 
        sip_pvt_lock(p);
                return 0;
 
        sip_pvt_lock(p);