diff options
author | Olle Johansson <oej@edvina.net> | 2008-10-26 09:45:17 +0000 |
---|---|---|
committer | Olle Johansson <oej@edvina.net> | 2008-10-26 09:45:17 +0000 |
commit | 9137733e1124335c20b777520e2698611d932a48 (patch) | |
tree | 22a35bcf2b7063f5266411a5b42f05e7596fa63e /channels | |
parent | 31a9f1e6f0f3ea29fec3b1526ba57251c1f66c86 (diff) |
Moving more variables to the sip_cfg structure, as I have some future ideas for the usage of that structure.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@152019 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channels')
-rw-r--r-- | channels/chan_sip.c | 211 |
1 files changed, 109 insertions, 102 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 3c3658f2b..37b279804 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -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_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 */ @@ -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_MATCHEXTERNIPLOCALLY FALSE /*!< Match extern IP locally default setting */ #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 */ @@ -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 */ -/*! \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 @@ -830,25 +826,42 @@ static struct sip_settings sip_cfg; 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_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_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 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 */ @@ -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 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 */ @@ -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 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_regextenonqualify; /*!< Whether to add/remove regexten when qualifying peers */ 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 int global_matchexterniplocally; /*!< Match externip/externhost setting against localnet setting */ 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 (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; } @@ -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 && - (!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) { @@ -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)) { - 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 */ } @@ -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; - if (global_srvlookup) { + if (sip_cfg.srvlookup) { 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 */ - 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); @@ -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 */ - if (pedanticsipchecking) + if (sip_cfg.pedanticsipchecking) 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); - 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); } } @@ -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 */ - 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; @@ -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 */ - 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. @@ -6466,7 +6473,7 @@ static struct sip_pvt *find_call(struct sip_request *req, struct sockaddr_in *si } restartsearch: - if (!pedanticsipchecking) { + if (!sip_cfg.pedanticsipchecking) { 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); - if (global_callevents) + if (sip_cfg.callevents) 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); - 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" @@ -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; - if (compactheaders) + if (sip_cfg.compactheaders) 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; - 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); @@ -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); - 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); @@ -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; - if (pedanticsipchecking) { + if (sip_cfg.pedanticsipchecking) { 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)); - 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 */ @@ -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 */ - 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 */ @@ -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)); - if (pedanticsipchecking) + if (sip_cfg.pedanticsipchecking) 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) { @@ -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: - if (global_alwaysauthreject) { + if (sip_cfg.alwaysauthreject) { 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 (pedanticsipchecking) + if (sip_cfg.pedanticsipchecking) 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)) { - if (pedanticsipchecking) + if (sip_cfg.pedanticsipchecking) 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))) { - 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; } @@ -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 (pedanticsipchecking) { + if (sip_cfg.pedanticsipchecking) { 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); - if (pedanticsipchecking) + if (sip_cfg.pedanticsipchecking) 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 (pedanticsipchecking) + if (sip_cfg.pedanticsipchecking) 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)); } - 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>" ); @@ -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); - if (pedanticsipchecking) + if (sip_cfg.pedanticsipchecking) 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)); - 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)); @@ -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 */ - if (global_allowguest) { + if (sip_cfg.allowguest) { 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 */ @@ -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, " 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, " 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))); @@ -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, " 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, " 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, " 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, " 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))); @@ -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, " 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, " 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); @@ -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, " 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; @@ -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 (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); @@ -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); - if (is_reachable && global_regextenonqualify) + if (is_reachable && sip_cfg.regextenonqualify) 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 (pedanticsipchecking) + if (sip_cfg.pedanticsipchecking) 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 */ - 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); @@ -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); - 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, @@ -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 (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", @@ -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 (global_regextenonqualify) + if (sip_cfg.regextenonqualify) 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 */ - 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); @@ -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)); - 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; } @@ -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); - 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; @@ -22173,13 +22180,13 @@ static int reload_config(enum channelreloadreason reason) 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_regextenonqualify = DEFAULT_REGEXTENONQUALIFY; + sip_cfg.regextenonqualify = DEFAULT_REGEXTENONQUALIFY; 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()); @@ -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)); - compactheaders = DEFAULT_COMPACTHEADERS; + sip_cfg.compactheaders = DEFAULT_COMPACTHEADERS; 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_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_rtpkeepalive = 0; + global_rtpkeepalive = DEFAULT_RTPKEEPALIVE; 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; @@ -22232,14 +22239,14 @@ static int reload_config(enum channelreloadreason reason) /* 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_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)); @@ -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")) { - 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")) { @@ -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) - global_rtautoclear = i; + sip_cfg.rtautoclear = i; 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); - global_rtpkeepalive = 0; + global_rtpkeepalive = DEFAULT_RTPKEEPALIVE; } } 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")) { - 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")) { - 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")) { @@ -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")) { - 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")) { @@ -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")) { - 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")) { - global_srvlookup = ast_true(v->value); + sip_cfg.srvlookup = ast_true(v->value); } 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) @@ -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")) { - 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")) { @@ -22619,7 +22626,7 @@ static int reload_config(enum channelreloadreason reason) 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")) { @@ -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")) { - 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) { @@ -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"); - allow_external_domains = 1; + sip_cfg.allow_external_domains = 1; } /* 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 */ - 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); |