Merge "build: Add download capability for external packages"
authorzuul <zuul@gerrit.asterisk.org>
Wed, 7 Sep 2016 13:19:40 +0000 (08:19 -0500)
committerGerrit Code Review <gerrit2@gerrit.digium.api>
Wed, 7 Sep 2016 13:19:40 +0000 (08:19 -0500)
27 files changed:
CHANGES
channels/chan_sip.c
configs/samples/alsa.conf.sample
configs/samples/ccss.conf.sample
configs/samples/chan_dahdi.conf.sample
configs/samples/console.conf.sample
configs/samples/mgcp.conf.sample
configs/samples/minivm.conf.sample
configs/samples/misdn.conf.sample
configs/samples/oss.conf.sample
configs/samples/queues.conf.sample
configs/samples/res_snmp.conf.sample
configs/samples/sip.conf.sample
configs/samples/skinny.conf.sample
configs/samples/unistim.conf.sample
configs/samples/vpb.conf.sample
contrib/scripts/sip_to_pjsip/sip_to_pjsip.py
include/asterisk/named_locks.h
include/asterisk/sorcery.h
main/named_locks.c
main/sorcery.c
res/ari/resource_channels.c
res/res_pjsip/config_global.c
res/res_pjsip/location.c
res/res_pjsip/pjsip_configuration.c
res/res_pjsip_registrar.c
rest-api/api-docs/channels.json

diff --git a/CHANGES b/CHANGES
index 7ca6b08..39e70ce 100644 (file)
--- a/CHANGES
+++ b/CHANGES
 --- Functionality changes from Asterisk 14 to Asterisk 15 --------------------
 ------------------------------------------------------------------------------
 
+chan_sip
+------------------
+ * If an offer is received with optional SRTP (a media stream with RTP/AVP but
+   which contains a crypto line) chan_sip will now accept it and enable SRTP.
+   If you would like to do optional SRTP on outbound you will need to create
+   a dialplan that dials with it enabled initially and if it fails fall back to
+   without.
 
 ------------------------------------------------------------------------------
 --- Functionality changes from Asterisk 14.0.0 to Asterisk 14.1.0 ----------
index 6250731..1d70e89 100644 (file)
@@ -1479,7 +1479,8 @@ static int handle_response_register(struct sip_pvt *p, int resp, const char *res
 static void handle_response(struct sip_pvt *p, int resp, const char *rest, struct sip_request *req, uint32_t seqno);
 
 /*------ SRTP Support -------- */
-static int process_crypto(struct sip_pvt *p, struct ast_rtp_instance *rtp, struct ast_sdp_srtp **srtp, const char *a);
+static int process_crypto(struct sip_pvt *p, struct ast_rtp_instance *rtp, struct ast_sdp_srtp **srtp,
+               const char *a);
 
 /*------ T38 Support --------- */
 static int transmit_response_with_t38_sdp(struct sip_pvt *p, char *msg, struct sip_request *req, int retrans);
@@ -10612,6 +10613,10 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
                                        } else if (!processed_crypto && process_crypto(p, p->rtp, &p->srtp, value)) {
                                                processed_crypto = TRUE;
                                                processed = TRUE;
+                                               if (secure_audio == FALSE) {
+                                                       ast_log(AST_LOG_NOTICE, "Processed audio crypto attribute without SAVP specified; accepting anyway\n");
+                                                       secure_audio = TRUE;
+                                               }
                                        } else if (process_sdp_a_audio(value, p, &newaudiortp, &last_rtpmap_codec)) {
                                                processed = TRUE;
                                        }
@@ -10629,6 +10634,10 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
                                        } else if (!processed_crypto && process_crypto(p, p->vrtp, &p->vsrtp, value)) {
                                                processed_crypto = TRUE;
                                                processed = TRUE;
+                                               if (secure_video == FALSE) {
+                                                       ast_log(AST_LOG_NOTICE, "Processed video crypto attribute without SAVP specified; accepting anyway\n");
+                                                       secure_video = TRUE;
+                                               }
                                        } else if (process_sdp_a_video(value, p, &newvideortp, &last_rtpmap_codec)) {
                                                processed = TRUE;
                                        }
@@ -33750,7 +33759,8 @@ static void sip_send_all_mwi_subscriptions(void)
        ao2_iterator_destroy(&iter);
 }
 
-static int process_crypto(struct sip_pvt *p, struct ast_rtp_instance *rtp, struct ast_sdp_srtp **srtp, const char *a)
+static int process_crypto(struct sip_pvt *p, struct ast_rtp_instance *rtp, struct ast_sdp_srtp **srtp,
+               const char *a)
 {
        struct ast_rtp_engine_dtls *dtls;
 
index ced5b44..23aac4e 100644 (file)
@@ -46,7 +46,7 @@ extension=s
 ; systems where there will be no return audio path, such as overhead pagers.
 ;noaudiocapture=true
 
-;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
+; ----------------------------- JITTER BUFFER CONFIGURATION --------------------------
 ; jbenable = yes              ; Enables the use of a jitterbuffer on the receiving side of an
                               ; ALSA channel. Defaults to "no". An enabled jitterbuffer will
                               ; be used only if the sending side can create and the receiving
@@ -74,5 +74,5 @@ extension=s
                               ; network normally has low jitter, but occasionally has spikes.
 
 ; jblog = no                  ; Enables jitterbuffer frame logging. Defaults to "no".
-;-----------------------------------------------------------------------------------
+; ----------------------------------------------------------------------------------
 
index 21b0b06..7b3fe7d 100644 (file)
@@ -64,9 +64,9 @@
 ;           PLEASE READ THIS!!!
 ;===========================================
 ;
-;---------------------------------------------------------------------
+; --------------------------------------------------------------------
 ;                                Timers
-;---------------------------------------------------------------------
+; --------------------------------------------------------------------
 ;There are three configurable timers for all types of CC: the
 ;cc_offer_timer, the ccbs_available_timer, and the ccnr_available_timer.
 ;In addition, when using a generic agent, there is a fourth timer,
@@ -98,9 +98,9 @@
 ; only affects operation when using a generic agent.
 ;
 ;cc_recall_timer = 20
-;---------------------------------------------------------------------
+; --------------------------------------------------------------------
 ;                                Policies
-;---------------------------------------------------------------------
+; --------------------------------------------------------------------
 ; Policy settings tell Asterisk how to behave and what sort of
 ; resources to allocate in order to facilitate CC. There are two
 ; settings to control the actions Asterisk will take.
 ;cc_monitor_policy=never
 ;
 ;
-;---------------------------------------------------------------------
+; --------------------------------------------------------------------
 ;                              Limits
-;---------------------------------------------------------------------
+; --------------------------------------------------------------------
 ;
 ; The use of CC requires Asterisk to potentially use more memory than
 ; some administrators would like. As such, it is a good idea to limit
 ;
 ;cc_max_monitors = 5
 ;
-;---------------------------------------------------------------------
+; --------------------------------------------------------------------
 ;                            Other
-;---------------------------------------------------------------------
+; --------------------------------------------------------------------
 ;
 ; When using a generic CC agent, the caller who requested CC will be
 ; called back when a called party becomes available. When the caller
index a0c729c..e70a2a1 100644 (file)
@@ -1220,7 +1220,7 @@ pickupgroup=1
 ;
 ;jitterbuffers=4
 ;
-;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
+; ----------------------------- JITTER BUFFER CONFIGURATION --------------------------
 ; jbenable = yes              ; Enables the use of a jitterbuffer on the receiving side of a
                               ; DAHDI channel. Defaults to "no". An enabled jitterbuffer will
                               ; be used only if the sending side can create and the receiving
@@ -1248,7 +1248,7 @@ pickupgroup=1
                               ; network normally has low jitter, but occasionally has spikes.
 
 ; jblog = no                  ; Enables jitterbuffer frame logging. Defaults to "no".
-;-----------------------------------------------------------------------------------
+; ----------------------------------------------------------------------------------
 ;
 ; You can define your own custom ring cadences here.  You can define up to 8
 ; pairs.  If the silence is negative, it indicates where the caller ID spill is
index 606254e..aad306e 100644 (file)
@@ -44,7 +44,7 @@
 ;
 ;mohinterpret=default
 
-;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
+; ----------------------------- JITTER BUFFER CONFIGURATION --------------------------
 ; jbenable = yes              ; Enables the use of a jitterbuffer on the receiving side of an
                               ; Console channel. Defaults to "no". An enabled jitterbuffer will
                               ; be used only if the sending side can create and the receiving
@@ -72,7 +72,7 @@
                               ; network normally has low jitter, but occasionally has spikes.
 
 ; jblog = no                  ; Enables jitterbuffer frame logging. Defaults to "no".
-;-----------------------------------------------------------------------------------
+; ----------------------------------------------------------------------------------
 
 
 ;
index 7c725bc..f4bc0db 100644 (file)
 ;cos=3                 ; Sets 802.1p priority for signaling packets.
 ;cos_audio=5           ; Sets 802.1p priority for RTP audio packets.
 
-;---------------------- DIGIT TIMEOUTS ----------------------------
+; --------------------- DIGIT TIMEOUTS ----------------------------
 firstdigittimeout = 30000 ; default 16000 = 16s
 gendigittimeout = 10000   ; default  8000 = 8s 
 matchdigittimeout = 5000  ; defaults 3000 = 3s
 
-;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
+; ----------------------------- JITTER BUFFER CONFIGURATION --------------------------
 ; jbenable = yes              ; Enables the use of a jitterbuffer on the receiving side of a
                               ; MGCP channel. Defaults to "no". An enabled jitterbuffer will
                               ; be used only if the sending side can create and the receiving
@@ -48,7 +48,7 @@ matchdigittimeout = 5000  ; defaults 3000 = 3s
                               ; network normally has low jitter, but occasionally has spikes.
 
 ; jblog = no                  ; Enables jitterbuffer frame logging. Defaults to "no".
-;-----------------------------------------------------------------------------------
+; ----------------------------------------------------------------------------------
 
 ;[dlinkgw]
 ;host = 192.168.0.64
index 55a39c8..2df3449 100644 (file)
@@ -12,7 +12,7 @@
 ; this configuration file or realtime. The idea is to build voicemail as building blocks so that
 ; a complete and adaptive voicemail system can be built in the dialplan
 ;
-;------------------------------ Variables to use in subject, from and message body ------------------
+; ----------------------------- Variables to use in subject, from and message body ------------------
 ; Change the from, body and/or subject, variables:
 ;     MVM_NAME, MVM_DUR, MVM_MSGNUM, VM_MAILBOX, MVM_CALLERID, MVM_CIDNUM,
 ;     MVM_CIDNAME, MVM_DATE
@@ -24,7 +24,7 @@
 ; Note: The emailbody config row can only be up to 512 characters due to a
 ;       limitation in the Asterisk configuration subsystem.
 ;      To create longer mails, use the templatefile option when creating the template
-;----------------------------------------------------------------------------------------------------
+; ---------------------------------------------------------------------------------------------------
 
 [general]
 ; Default format for storing and sending voicemail
@@ -64,7 +64,7 @@ silencethreshold=128
 ; This is used both for e-mail and pager messages
 ;mailcmd=/usr/sbin/sendmail -t
 ;
-;--------------Default e-mail message template (used if no templates are used) ------
+; -------------Default e-mail message template (used if no templates are used) ------
 ;fromstring=The Asterisk PBX
 ;
 
@@ -82,7 +82,7 @@ emaildateformat=%A, %B %d, %Y at %r
 ; 24h date format
 ;emaildateformat=%A, %d %B %Y at %H:%M:%S
 ;
-;--------------Default pager message template (used if no templates are used) ------
+; -------------Default pager message template (used if no templates are used) ------
 ; You can also change the Pager From: string, the pager body and/or subject.
 ; The above defined variables also can be used here
 ;pagerfromstring=The Asterisk PBX
@@ -90,7 +90,7 @@ emaildateformat=%A, %B %d, %Y at %r
 ;pagerbody=New ${MVM_DUR} long msg in box ${MVM_MAILBOX}\nfrom ${MVM_CALLERID}, on ${MVM_DATE}
 ;
 ;
-;--------------Timezone definitions (used in voicemail accounts) -------------------
+; -------------Timezone definitions (used in voicemail accounts) -------------------
 ;
 ; Users may be located in different timezones, or may have different
 ; message announcements for their introductory message when they enter
@@ -133,7 +133,7 @@ central=America/Chicago|'vm-received' Q 'digits/at' IMp
 central24=America/Chicago|'vm-received' q 'digits/at' H N 'hours'
 military=Zulu|'vm-received' q 'digits/at' H N 'hours' 'phonetic/z_p'
 
-;----------------------- Message body templates---------------------
+; ---------------------- Message body templates---------------------
 ; [template-name]      ; "template-" is a verbatim marker
 ; fromaddress = Your Friendly Asterisk Server
 ; fromemail = asteriskvm@digium.com
@@ -187,7 +187,7 @@ dateformat=%A, %B %d, %Y at %r
 ;subject = Dear old chap, you've got an electronic communique
 ;charset=ascii
 
-;----------------------- Mailbox accounts --------------------------
+; ---------------------- Mailbox accounts --------------------------
 ;Template for mailbox definition - all options
 ;
 ;      [username@domain]               ; Has to be unique within domain (MWM_USERNAME, MWM_DOMAIN)
index ac54dbc..ca27c03 100644 (file)
@@ -109,7 +109,7 @@ crypt_prefix=**
 ;
 crypt_keys=test,muh
 
-;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
+; ----------------------------- JITTER BUFFER CONFIGURATION --------------------------
 ; jbenable = yes              ; Enables the use of a jitterbuffer on the receiving side of a
                               ; SIP channel. Defaults to "no". An enabled jitterbuffer will
                               ; be used only if the sending side can create and the receiving
@@ -140,7 +140,7 @@ crypt_keys=test,muh
                               ; network normally has low jitter, but occasionally has spikes.
 
 ; jblog = no                  ; Enables jitterbuffer frame logging. Defaults to "no".
-;-----------------------------------------------------------------------------------
+; ----------------------------------------------------------------------------------
 
 ; users sections:
 ;
index c3781a2..ee16920 100644 (file)
@@ -46,7 +46,7 @@
     ; queuesize = 10           ; frames in device driver
     ; frags = 8                        ; argument to SETFRAGMENT
 
-    ;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
+    ; ----------------------------- JITTER BUFFER CONFIGURATION --------------------------
     ; jbenable = yes              ; Enables the use of a jitterbuffer on the receiving side of an
                                   ; OSS channel. Defaults to "no". An enabled jitterbuffer will
                                   ; be used only if the sending side can create and the receiving
@@ -74,7 +74,7 @@
                                   ; network normally has low jitter, but occasionally has spikes.
 
     ; jblog = no                  ; Enables jitterbuffer frame logging. Defaults to "no".
-    ;-----------------------------------------------------------------------------------
+    ; ----------------------------------------------------------------------------------
 
 ; below is an entry for a second console channel
 ; [card1]
index 85cf9e4..8a9c884 100644 (file)
@@ -129,7 +129,7 @@ monitor-type = MixMonitor
 ;
 ;penaltymemberslimit = 5
 ;
-;----------------------QUEUE TIMING OPTIONS------------------------------------
+; ---------------------QUEUE TIMING OPTIONS------------------------------------
 ; A Queue has two different "timeout" values associated with it. One is the
 ; timeout parameter configured in queues.conf. This timeout specifies the
 ; amount of time to try ringing a member's phone before considering the
@@ -181,7 +181,7 @@ monitor-type = MixMonitor
 ;retry = 5
 ;timeoutpriority = app|conf
 ;
-;-----------------------END QUEUE TIMING OPTIONS---------------------------------
+; ----------------------END QUEUE TIMING OPTIONS---------------------------------
 ; Weight of queue - when compared to other queues, higher weights get
 ; first shot at available channels when the same channel is included in
 ; more than one queue.
index a6e40c8..7f37349 100644 (file)
@@ -1,6 +1,6 @@
 ;
 ; Configuration file for res_snmp
-;---------------------------------
+; --------------------------------
 ;
 ; Res_snmp can run as a subagent or standalone SNMP agent. The standalone snmp
 ; agent is based on net-snmp and will read a configuration file called
index da176b4..916e2d6 100644 (file)
@@ -15,7 +15,7 @@
 ;              - context - Which set of services you offer various users
 ;
 ; SIP dial strings
-;-----------------------------------------------------------
+; ----------------------------------------------------------
 ; In the dialplan (extensions.conf) you can use several
 ; syntaxes for dialing SIP devices.
 ;        SIP/devicename
@@ -87,7 +87,7 @@
 ;   sip reload                   Reload configuration file
 ;   sip show settings            Show the current channel configuration
 ;
-;------- Naming devices ------------------------------------------------------
+; ------ Naming devices ------------------------------------------------------
 ;
 ; When naming devices, make sure you understand how Asterisk matches calls
 ; that come in.
 ;       not needed at all. Check below. In later releases, it's renamed
 ;       to "defaultuser" which is a better name, since it is used in
 ;       combination with the "defaultip" setting.
-;-----------------------------------------------------------------------------
+; ----------------------------------------------------------------------------
 
 ; ** Old configuration options **
 ; The "call-limit" configuation option is considered old is replaced
@@ -573,7 +573,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
                                ; are not purged during SIP reloads.
 
 ;
-;------------------------ TLS settings ------------------------------------------------------------
+; ----------------------- TLS settings ------------------------------------------------------------
 ;tlscertfile=</path/to/certificate.pem> ; Certificate chain (*.pem format only) to use for TLS connections
                                         ; The certificates must be sorted starting with the subject's certificate
                                         ; and followed by intermediate CA certificates if applicable. If the
@@ -622,7 +622,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
                            ; Your distribution might have changed that list
                            ; further.
 ;
-;--------------------------- SIP timers ----------------------------------------------------
+; -------------------------- SIP timers ----------------------------------------------------
 ; These timers are used primarily in INVITE transactions.
 ; The default for Timer T1 is 500 ms or the measured run-trip time between
 ; Asterisk and the device if you have qualify=yes for the device.
@@ -636,7 +636,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
                                 ; in this amount of time, the call will autocongest
                                 ; Defaults to 64*timert1
 
-;--------------------------- RTP timers ----------------------------------------------------
+; -------------------------- RTP timers ----------------------------------------------------
 ; These timers are currently used for both audio and video streams. The RTP timeouts
 ; are only applied to the audio channel.
 ; The settings are settable in the global section as well as per device
@@ -652,7 +652,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
 ;rtpkeepalive=<secs>            ; Send keepalives in the RTP stream to keep NAT open
                                 ; (default is off - zero)
 
-;--------------------------- SIP Session-Timers (RFC 4028)------------------------------------
+; -------------------------- SIP Session-Timers (RFC 4028)------------------------------------
 ; SIP Session-Timers provide an end-to-end keep-alive mechanism for active SIP sessions.
 ; This mechanism can detect and reclaim SIP channels that do not terminate through normal
 ; signaling procedures. Session-Timers can be configured globally or at a user/peer level.
@@ -681,7 +681,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
 ;session-minse=90
 ;session-refresher=uac
 ;
-;--------------------------- SIP DEBUGGING ---------------------------------------------------
+; -------------------------- SIP DEBUGGING ---------------------------------------------------
 ;sipdebug = yes                 ; Turn on SIP debugging by default, from
                                 ; the moment the channel loads this configuration.
                                 ; NOTE: You cannot use the CLI to turn it off. You'll
@@ -692,7 +692,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
                                 ; SIP history is output to the DEBUG logging channel
 
 
-;--------------------------- STATUS NOTIFICATIONS (SUBSCRIPTIONS) ----------------------------
+; -------------------------- STATUS NOTIFICATIONS (SUBSCRIPTIONS) ----------------------------
 ; You can subscribe to the status of extensions with a "hint" priority
 ; (See extensions.conf.sample for examples)
 ; chan_sip support two major formats for notifications: dialog-info and SIMPLE
@@ -741,7 +741,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
 ;callcounter = yes              ; Enable call counters on devices. This can be set per
                                 ; device too.
 
-;----------------------------------------- T.38 FAX SUPPORT ----------------------------------
+; ---------------------------------------- T.38 FAX SUPPORT ----------------------------------
 ;
 ; This setting is available in the [general] section as well as in device configurations.
 ; Setting this to yes enables T.38 FAX (UDPTL) on SIP calls; it defaults to off.
@@ -774,7 +774,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
 ; faxdetect = cng              ; Enables only CNG detection
 ; faxdetect = t38              ; Enables only T.38 detection
 ;
-;----------------------------------------- OUTBOUND SIP REGISTRATIONS  ------------------------
+; ---------------------------------------- OUTBOUND SIP REGISTRATIONS  ------------------------
 ; Asterisk can register as a SIP user agent to a SIP proxy (provider)
 ; Format for the register statement is:
 ;       register => [peer?][transport://]user[@domain][:secret[:authuser]]@host[:port][/extension][~expiry]
@@ -851,7 +851,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
                                 ; 401 responses and continue retrying according to normal
                                 ; retry rules.
 
-;----------------------------------------- OUTBOUND MWI SUBSCRIPTIONS -------------------------
+; ---------------------------------------- OUTBOUND MWI SUBSCRIPTIONS -------------------------
 ; Asterisk can subscribe to receive the MWI from another SIP server and store it locally for retrieval
 ; by other phones. At this time, you can only subscribe using UDP as the transport.
 ; Format for the mwi register statement is:
@@ -866,7 +866,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
 ; MWI received will be stored in the 1234 mailbox of the SIP_Remote context.
 ; It can be used by other phones by following the below:
 ; mailbox=1234@SIP_Remote
-;----------------------------------------- NAT SUPPORT ------------------------
+; ---------------------------------------- NAT SUPPORT ------------------------
 ;
 ; WARNING: SIP operation behind a NAT is tricky and you really need
 ; to read and understand well the following section.
@@ -1008,7 +1008,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
 ;
 ; icesupport = yes
 
-;----------------------------------- MEDIA HANDLING --------------------------------
+; ---------------------------------- MEDIA HANDLING --------------------------------
 ; By default, Asterisk tries to re-invite media streams to an optimal path. If there's
 ; no reason for Asterisk to stay in the media path, the media will be redirected.
 ; This does not really work well in the case where Asterisk is outside and the
@@ -1090,7 +1090,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
                                ; option may be specified at the global or peer scope.
 ;force_avp=yes                 ; Force 'RTP/AVP', 'RTP/AVPF', 'RTP/SAVP', and 'RTP/SAVPF' to be used for
                                ; media streams when appropriate, even if a DTLS stream is present.
-;----------------------------------------- REALTIME SUPPORT ------------------------
+; ---------------------------------------- REALTIME SUPPORT ------------------------
 ; For additional information on ARA, the Asterisk Realtime Architecture,
 ; please read https://wiki.asterisk.org/wiki/display/AST/Realtime+Database+Configuration
 ;
@@ -1128,7 +1128,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
                                 ; is still in memory (due to caching or other reasons), the
                                 ; information will not be removed from realtime storage
 
-;----------------------------------------- SIP DOMAIN SUPPORT ------------------------
+; ---------------------------------------- SIP DOMAIN SUPPORT ------------------------
 ; Incoming INVITE and REFER messages can be matched against a list of 'allowed'
 ; domains, each of which can direct the call to a specific context if desired.
 ; By default, all domains are accepted and sent to the default context or the
@@ -1167,13 +1167,13 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
                                 ; destinations which do not have a prior
                                 ; account relationship with your server.
 
-;------------------------------ Advice of Charge CONFIGURATION --------------------------
+; ----------------------------- Advice of Charge CONFIGURATION --------------------------
 ; snom_aoc_enabled = yes;     ; This options turns on and off support for sending AOC-D and
                               ; AOC-E to snom endpoints.  This option can be used both in the
                               ; peer and global scope.  The default for this option is off.
 
 
-;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
+; ----------------------------- JITTER BUFFER CONFIGURATION --------------------------
 ; jbenable = yes              ; Enables the use of a jitterbuffer on the receiving side of a
                               ; SIP channel. Defaults to "no". An enabled jitterbuffer will
                               ; be used only if the sending side can create and the receiving
@@ -1205,7 +1205,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
 
 ; jblog = no                  ; Enables jitterbuffer frame logging. Defaults to "no".
 
-;-----------------------------------------------------------------------------------
+; ----------------------------------------------------------------------------------
 
 [authentication]
 ; Global credentials for outbound calls, i.e. when a proxy challenges your
@@ -1224,7 +1224,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
 ; You may also add auth= statements to [peer] definitions
 ; Peer auth= override all other authentication settings if we match on realm
 
-;------------------------------------------------------------------------------
+; -----------------------------------------------------------------------------
 ; DEVICE CONFIGURATION
 ;
 ; SIP entities have a 'type' which determines their roles within Asterisk.
@@ -1351,7 +1351,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
 ;                                              ; from the peer's configuration.
 ;
 
-;------------------------------------------------------------------------------
+; -----------------------------------------------------------------------------
 ; DTLS-SRTP CONFIGURATION
 ;
 ; DTLS-SRTP support is available if the underlying RTP engine in use supports it.
@@ -1409,7 +1409,7 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
 ;port=80                          ; The port number we want to connect to on the remote side
                                   ; Also used as "defaultport" in combination with "defaultip" settings
 
-;--- sample definition for a provider
+; -- sample definition for a provider
 ;[provider1]
 ;type=peer
 ;host=sip.provider1.com
index be88dc2..2bf06fb 100644 (file)
@@ -54,7 +54,7 @@ keepalive=120
 ;cos_audio=5           ; Sets 802.1p priority for RTP audio packets.
 ;cos_video=4           ; Sets 802.1p priority for RTP video packets.
 
-;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
+; ----------------------------- JITTER BUFFER CONFIGURATION --------------------------
 ;jbenable = yes              ; Enables the use of a jitterbuffer on the receiving side of a
                              ; skinny channel. Defaults to "no". An enabled jitterbuffer will
                              ; be used only if the sending side can create and the receiving
@@ -79,10 +79,10 @@ keepalive=120
                              ; Defaults to fixed.
 
 ;jblog = no                  ; Enables jitterbuffer frame logging. Defaults to "no".
-;-----------------------------------------------------------------------------------
+; ----------------------------------------------------------------------------------
 
 [lines]
-;----------------------------------- LINES SECTION --------------------------------
+; ---------------------------------- LINES SECTION --------------------------------
 ; Options set under [lines] apply to all lines unless explicitly set for a particular
 ; device. The options that can be set under lines are specified in GENERAL LINE OPTIONS.
 ; These options can also be set for each individual device as well as those under SPECIFIC
@@ -95,15 +95,15 @@ keepalive=120
 ; Where options are common to both lines and devices, the results typically take that of
 ; the least permission. ie if a no is set for either line or device, the call will not be
 ; able to use that permission
-;-------------------------------- GENERAL LINE OPTIONS -----------------------------
+; ------------------------------- GENERAL LINE OPTIONS -----------------------------
 ;earlyrtp=1                  ; whether audio signalling should be provided by asterisk
 ;                            ; (earlyrtp=1) or device generated (earlyrtp=0). default=yes
 ;transfer=1                  ; whether the device is allowed to transfer. default=yes
 ;context=default             ; context to use for this line.
 ;callfwdtimeout=20000        ; ms before cfwd_noans occurs (default 20 secs)
-;------------------------------- SPECIFIC LINE OPTIONS -----------------------------
+; ------------------------------ SPECIFIC LINE OPTIONS -----------------------------
 ;setvar=                    ; allows for the setting of chanvars.
-;-----------------------------------------------------------------------------------
+; ----------------------------------------------------------------------------------
 
 ;[100]
 ;nat=yes
@@ -149,7 +149,7 @@ keepalive=120
 
 
 [devices]
-;---------------------------------- DEVICES SECTION -------------------------------
+; --------------------------------- DEVICES SECTION -------------------------------
 ; Options set under [devices] apply to all devices unless explicitly set for a particular
 ; device. The options that can be set under devices are specified in GENERAL DEVICE OPTIONS.
 ; These options can also be set for each individual device as well as those under SPECIFIC
@@ -162,16 +162,16 @@ keepalive=120
 ; Where options are common to both lines and devices, the results typically take that of
 ; the least permission. ie if a no is set for either line or device, the call will not be
 ; able to use that permission
-;------------------------------- GENERAL DEVICE OPTIONS ----------------------------
+; ------------------------------ GENERAL DEVICE OPTIONS ----------------------------
 ;earlyrtp=1                  ; whether audio signalling should be provided by asterisk
 ;                            ; (earlyrtp=1) or device generated (earlyrtp=0). default=yes
 ;transfer=1                  ; whether the device is allowed to transfer. default=yes
-;------------------------------ SPECIFIC DEVICE OPTIONS ----------------------------
+; ----------------------------- SPECIFIC DEVICE OPTIONS ----------------------------
 ;device="SEPxxxxxxxxxxxx     ; id of the device. Must be set.
 ;version=P002G204           ; firmware version to be loaded. If this version is different
 ;                            ; to the one on the device, the device will try to load this
 ;                            ; version from the tftp server. Set to device firmware version.
-;-----------------------------------------------------------------------------------
+; ----------------------------------------------------------------------------------
 
 ; Typical config for 12SP+
 ;[florian]
index c33426b..a096427 100644 (file)
@@ -17,7 +17,7 @@ port=5000                    ; UDP port
 ;autoprovisioning=no         ; Allow undeclared phones to register an extension. See README for important
                              ; informations. no (default), yes, tn.
 ;mohsuggest=default
-;------------------------------ JITTER BUFFER CONFIGURATION --------------------------
+; ----------------------------- JITTER BUFFER CONFIGURATION --------------------------
 ; jbenable = yes              ; Enables the use of a jitterbuffer on the receiving side of a
                               ; SIP channel. Defaults to "no". An enabled jitterbuffer will
                               ; be used only if the sending side can create and the receiving
@@ -41,7 +41,7 @@ port=5000                    ; UDP port
                               ; variable size, actually the new jb of IAX2). Defaults to fixed.
 
 ; jblog = no                  ; Enables jitterbuffer frame logging. Defaults to "no".
-;-----------------------------------------------------------------------------------
+; ----------------------------------------------------------------------------------
 
 
 ;[black]                     ; name of the device
index fecb3ec..bdc89df 100644 (file)
@@ -199,7 +199,7 @@ grunttimeout=3600
 ;
 mode=immediate
 
-;-------------------------------------------------------------------------
+; ------------------------------------------------------------------------
 ; Channel definitions
 ;
 ; Each channel inherits the settings specified above, unless the are
index 1a0d6a4..4da31cb 100755 (executable)
@@ -17,7 +17,7 @@ PREFIX = 'pjsip_'
 def section_by_type(section, pjsip, type):
     """Finds a section based upon the given type, adding it if not found."""
     def __find_dict(mdicts, key, val):
-        """Given a list of mult-dicts, return the multi-dict that contains
+        """Given a list of multi-dicts, return the multi-dict that contains
            the given key/value pair."""
 
         def found(d):
@@ -395,6 +395,7 @@ peer_map = [
     ['session-minse',      set_value('timers_min_se')],
     ['session-expires',    set_value('timers_sess_expires')],
     # identify_by ?
+    ['canreinvite',        set_direct_media],    # direct_media alias
     ['directmedia',        set_direct_media],    # direct_media
                                                  # direct_media_method
                                                  # directed_media_glare_mitigation
@@ -1020,7 +1021,7 @@ class Registration:
 
         if self.outbound_proxy:
             set_value('outboundproxy', self.outbound_proxy, section, pjsip,
-                      nmapped, 'registartion')
+                      nmapped, 'registration')
 
 
 def map_registrations(sip, pjsip, nmapped):
@@ -1181,7 +1182,7 @@ def cli_options():
     """
     global PREFIX
     usage = "usage: %prog [options] [input-file [output-file]]\n\n" \
-               "Converts the chan_sip configuration input-file to the chan_pjsip output-file.\n"\
+        "Converts the chan_sip configuration input-file to the chan_pjsip output-file.\n" \
         "The input-file defaults to 'sip.conf'.\n" \
         "The output-file defaults to 'pjsip.conf'."
     parser = optparse.OptionParser(usage=usage)
index 0fe07d9..1959841 100644 (file)
@@ -48,7 +48,7 @@
  * To use a named lock:
  *     Call ast_named_lock_get with the appropriate keyspace and key.
  *     Use the standard ao2 lock/unlock functions as needed.
- *     Call ast_named_lock_put when you're finished with it.
+ *     Call ao2_cleanup when you're finished with it.
  */
 
 /*!
@@ -66,9 +66,6 @@ struct ast_named_lock;
 struct ast_named_lock *__ast_named_lock_get(const char *filename, int lineno, const char *func,
        enum ast_named_lock_type lock_type, const char *keyspace, const char *key);
 
-int __ast_named_lock_put(const char *filename, int lineno, const char *func,
-       struct ast_named_lock *lock);
-
 /*!
  * \brief Geta named lock handle
  * \since 13.9.0
@@ -92,11 +89,8 @@ int __ast_named_lock_put(const char *filename, int lineno, const char *func,
  * \since 13.9.0
  *
  * \param lock The pointer to the ast_named_lock structure returned by ast_named_lock_get
- * \retval 0 Success
- * \retval -1 Failure
  */
-#define ast_named_lock_put(lock) \
-       __ast_named_lock_put(__FILE__, __LINE__, __PRETTY_FUNCTION__, lock)
+#define ast_named_lock_put(lock) ao2_cleanup(lock)
 
 /*!
  * @}
index 23219ec..8966338 100644 (file)
@@ -988,10 +988,30 @@ int ast_sorcery_changeset_create(const struct ast_variable *original, const stru
  *
  * \retval non-NULL success
  * \retval NULL failure
+ *
+ * \note The returned object does not support AO2 locking.
  */
 void *ast_sorcery_generic_alloc(size_t size, ao2_destructor_fn destructor);
 
 /*!
+ * \since 14.1.0
+ * \brief Allocate a generic sorcery capable object with locking.
+ *
+ * \details Sorcery objects may be replaced with new allocations during reloads.
+ * If locking is required on sorcery objects it must be shared between the old
+ * object and the new one.  lockobj can be any AO2 object with locking enabled,
+ * but in most cases named locks should be used to provide stable locking.
+ *
+ * \param size Size of the object
+ * \param destructor Optional destructor function
+ * \param lockobj An AO2 object that will provide locking.
+ *
+ * \retval non-NULL success
+ * \retval NULL failure
+ */
+void *ast_sorcery_lockable_alloc(size_t size, ao2_destructor_fn destructor, void *lockobj);
+
+/*!
  * \brief Allocate an object
  *
  * \param sorcery Pointer to a sorcery structure
index 5960483..c71f3b5 100644 (file)
@@ -35,13 +35,17 @@ ASTERISK_REGISTER_FILE()
 struct ao2_container *named_locks;
 #define NAMED_LOCKS_BUCKETS 101
 
-struct ast_named_lock {
+struct named_lock_proxy {
+       AO2_WEAKPROXY();
        char key[0];
 };
 
+struct ast_named_lock {
+};
+
 static int named_locks_hash(const void *obj, const int flags)
 {
-       const struct ast_named_lock *lock = obj;
+       const struct named_lock_proxy *lock = obj;
 
        switch (flags & OBJ_SEARCH_MASK) {
        case OBJ_SEARCH_KEY:
@@ -57,8 +61,8 @@ static int named_locks_hash(const void *obj, const int flags)
 
 static int named_locks_cmp(void *obj_left, void *obj_right, int flags)
 {
-       const struct ast_named_lock *object_left = obj_left;
-       const struct ast_named_lock *object_right = obj_right;
+       const struct named_lock_proxy *object_left = obj_left;
+       const struct named_lock_proxy *object_right = obj_right;
        const char *right_key = obj_right;
        int cmp;
 
@@ -98,45 +102,72 @@ int ast_named_locks_init(void)
        return 0;
 }
 
+static void named_lock_proxy_cb(void *weakproxy, void *data)
+{
+       ao2_unlink(named_locks, weakproxy);
+}
+
 struct ast_named_lock *__ast_named_lock_get(const char *filename, int lineno, const char *func,
        enum ast_named_lock_type lock_type, const char *keyspace, const char *key)
 {
+       struct named_lock_proxy *proxy = NULL;
        struct ast_named_lock *lock = NULL;
-       int concat_key_buff_len = strlen(keyspace) + strlen(key) + 2;
-       char *concat_key = ast_alloca(concat_key_buff_len);
+       int keylen = strlen(keyspace) + strlen(key) + 2;
+       char *concat_key = ast_alloca(keylen);
 
        sprintf(concat_key, "%s-%s", keyspace, key); /* Safe */
 
        ao2_lock(named_locks);
-       lock = ao2_find(named_locks, concat_key, OBJ_SEARCH_KEY | OBJ_NOLOCK);
-       if (lock) {
+       proxy = ao2_find(named_locks, concat_key, OBJ_SEARCH_KEY | OBJ_NOLOCK);
+       if (proxy) {
                ao2_unlock(named_locks);
-               ast_assert((ao2_options_get(lock) & AO2_ALLOC_OPT_LOCK_MASK) == lock_type);
-               return lock;
-       }
+               lock = __ao2_weakproxy_get_object(proxy, 0, __PRETTY_FUNCTION__, filename, lineno, func);
+
+               if (lock) {
+                       /* We have an existing lock and it's not being destroyed. */
+                       ao2_ref(proxy, -1);
+                       ast_assert((ao2_options_get(lock) & AO2_ALLOC_OPT_LOCK_MASK) == lock_type);
+
+                       return lock;
+               }
 
-       lock = ao2_alloc_options(sizeof(*lock) + concat_key_buff_len, NULL, lock_type);
-       if (lock) {
-               strcpy(lock->key, concat_key); /* Safe */
-               ao2_link_flags(named_locks, lock, OBJ_NOLOCK);
+               /* the old proxy is being destroyed, clean list before creating/adding new one */
+               ao2_lock(named_locks);
+               ao2_unlink_flags(named_locks, proxy, OBJ_NOLOCK);
+               ao2_ref(proxy, -1);
        }
-       ao2_unlock(named_locks);
 
-       return lock;
-}
+       proxy = ao2_t_weakproxy_alloc(sizeof(*proxy) + keylen, NULL, concat_key);
+       if (!proxy) {
+               goto failure_cleanup;
+       }
 
-int __ast_named_lock_put(const char *filename, int lineno, const char *func,
-       struct ast_named_lock *lock)
-{
+       lock = __ao2_alloc(sizeof(*lock) + keylen, NULL, lock_type, concat_key, filename, lineno, func);
        if (!lock) {
-               return -1;
+               goto failure_cleanup;
        }
 
-       ao2_lock(named_locks);
-       if (ao2_ref(lock, -1) == 2) {
-               ao2_unlink_flags(named_locks, lock, OBJ_NOLOCK);
+       /* We have exclusive access to proxy and lock, no need for locking here. */
+       if (ao2_weakproxy_set_object(proxy, lock, OBJ_NOLOCK)) {
+               goto failure_cleanup;
        }
+
+       if (ao2_weakproxy_subscribe(proxy, named_lock_proxy_cb, NULL, OBJ_NOLOCK)) {
+               goto failure_cleanup;
+       }
+
+       strcpy(proxy->key, concat_key); /* Safe */
+       ao2_link_flags(named_locks, proxy, OBJ_NOLOCK);
        ao2_unlock(named_locks);
+       ao2_t_ref(proxy, -1, "Release allocation reference");
 
-       return 0;
+       return lock;
+
+failure_cleanup:
+       ao2_unlock(named_locks);
+
+       ao2_cleanup(proxy);
+       ao2_cleanup(lock);
+
+       return NULL;
 }
index 55ee830..9f8c35c 100644 (file)
@@ -1736,9 +1736,26 @@ static void sorcery_object_destructor(void *object)
        ast_free(details->object->id);
 }
 
+void *ast_sorcery_lockable_alloc(size_t size, ao2_destructor_fn destructor, void *lockobj)
+{
+       void *object = ao2_alloc_with_lockobj(size + sizeof(struct ast_sorcery_object),
+               sorcery_object_destructor, lockobj, "");
+       struct ast_sorcery_object_details *details = object;
+
+       if (!object) {
+               return NULL;
+       }
+
+       details->object = object + size;
+       details->object->destructor = destructor;
+
+       return object;
+}
+
 void *ast_sorcery_generic_alloc(size_t size, ao2_destructor_fn destructor)
 {
-       void *object = ao2_alloc_options(size + sizeof(struct ast_sorcery_object), sorcery_object_destructor, AO2_ALLOC_OPT_LOCK_NOLOCK);
+       void *object = ao2_alloc_options(size + sizeof(struct ast_sorcery_object),
+               sorcery_object_destructor, AO2_ALLOC_OPT_LOCK_NOLOCK);
        struct ast_sorcery_object_details *details = object;
 
        if (!object) {
index 35b7572..8d32921 100644 (file)
@@ -886,6 +886,8 @@ void ast_ari_channels_hangup(struct ast_variable *headers,
                cause = AST_CAUSE_CONGESTION;
        } else if (!strcmp(args->reason, "no_answer")) {
                cause = AST_CAUSE_NOANSWER;
+       } else if(!strcmp(args->reason, "answered_elsewhere")) {
+               cause = AST_CAUSE_ANSWERED_ELSEWHERE;
        } else {
                ast_ari_response_error(
                        response, 400, "Invalid Reason",
index 1d0c11c..281630a 100644 (file)
@@ -76,21 +76,21 @@ struct global_config {
                /*! Realm to use in challenges before an endpoint is identified */
                AST_STRING_FIELD(default_realm);
        );
-       /* Value to put in Max-Forwards header */
+       /*! Value to put in Max-Forwards header */
        unsigned int max_forwards;
-       /* The interval at which to send keep alive messages to active connection-oriented transports */
+       /*! The interval at which to send keep alive messages to active connection-oriented transports */
        unsigned int keep_alive_interval;
-       /* The maximum time for all contacts to be qualified at startup */
+       /*! The maximum time for all contacts to be qualified at startup */
        unsigned int max_initial_qualify_time;
-       /* The interval at which to check for expired contacts */
+       /*! The interval at which to check for expired contacts */
        unsigned int contact_expiration_check_interval;
        /*! Nonzero to disable multi domain support */
        unsigned int disable_multi_domain;
-       /* The maximum number of unidentified requests per source IP address before a security event is logged */
+       /*! The maximum number of unidentified requests per source IP address before a security event is logged */
        unsigned int unidentified_request_count;
-       /* The period during which unidentified requests are accumulated */
+       /*! The period during which unidentified requests are accumulated */
        unsigned int unidentified_request_period;
-       /* Interval at which expired unidentifed requests will be pruned */
+       /*! Interval at which expired unidentifed requests will be pruned */
        unsigned int unidentified_request_prune_interval;
        struct {
                /*! Taskprocessor high water alert trigger level */
@@ -510,7 +510,8 @@ int ast_sip_initialize_sorcery_global(void)
        ast_sorcery_object_field_register(sorcery, "global", "contact_expiration_check_interval",
                __stringify(DEFAULT_CONTACT_EXPIRATION_CHECK_INTERVAL),
                OPT_UINT_T, 0, FLDSET(struct global_config, contact_expiration_check_interval));
-       ast_sorcery_object_field_register(sorcery, "global", "disable_multi_domain", "no",
+       ast_sorcery_object_field_register(sorcery, "global", "disable_multi_domain",
+               DEFAULT_DISABLE_MULTI_DOMAIN ? "yes" : "no",
                OPT_BOOL_T, 1, FLDSET(struct global_config, disable_multi_domain));
        ast_sorcery_object_field_register(sorcery, "global", "unidentified_request_count",
                __stringify(DEFAULT_UNIDENTIFIED_REQUEST_COUNT),
index 0ab69ec..5abfcab 100644 (file)
@@ -49,11 +49,22 @@ static void aor_destroy(void *obj)
 /*! \brief Allocator for AOR */
 static void *aor_alloc(const char *name)
 {
-       struct ast_sip_aor *aor = ast_sorcery_generic_alloc(sizeof(struct ast_sip_aor), aor_destroy);
+       void *lock;
+       struct ast_sip_aor *aor;
+
+       lock = ast_named_lock_get(AST_NAMED_LOCK_TYPE_MUTEX, "aor", name);
+       if (!lock) {
+               return NULL;
+       }
+
+       aor = ast_sorcery_lockable_alloc(sizeof(struct ast_sip_aor), aor_destroy, lock);
+       ao2_ref(lock, -1);
+
        if (!aor) {
                return NULL;
        }
        ast_string_field_init(aor, 128);
+
        return aor;
 }
 
@@ -206,17 +217,11 @@ struct ao2_container *ast_sip_location_retrieve_aor_contacts_nolock(const struct
 struct ao2_container *ast_sip_location_retrieve_aor_contacts(const struct ast_sip_aor *aor)
 {
        struct ao2_container *contacts;
-       struct ast_named_lock *lock;
 
-       lock = ast_named_lock_get(AST_NAMED_LOCK_TYPE_MUTEX, "aor", ast_sorcery_object_get_id(aor));
-       if (!lock) {
-               return NULL;
-       }
-
-       ao2_lock(lock);
+       /* ao2_lock / ao2_unlock do not actually write aor since it has an ao2 lockobj. */
+       ao2_lock((void*)aor);
        contacts = ast_sip_location_retrieve_aor_contacts_nolock(aor);
-       ao2_unlock(lock);
-       ast_named_lock_put(lock);
+       ao2_unlock((void*)aor);
 
        return contacts;
 }
@@ -369,19 +374,12 @@ int ast_sip_location_add_contact(struct ast_sip_aor *aor, const char *uri,
                struct ast_sip_endpoint *endpoint)
 {
        int res;
-       struct ast_named_lock *lock;
-
-       lock = ast_named_lock_get(AST_NAMED_LOCK_TYPE_MUTEX, "aor", ast_sorcery_object_get_id(aor));
-       if (!lock) {
-               return -1;
-       }
 
-       ao2_lock(lock);
+       ao2_lock(aor);
        res = ast_sip_location_add_contact_nolock(aor, uri, expiration_time, path_info, user_agent,
                via_addr, via_port, call_id,
                endpoint);
-       ao2_unlock(lock);
-       ast_named_lock_put(lock);
+       ao2_unlock(aor);
 
        return res;
 }
index 333be71..d8ae9e0 100644 (file)
@@ -603,6 +603,10 @@ static int ident_handler(const struct aco_option *opt, struct ast_variable *var,
                        endpoint->ident_method = 0;
                        return -1;
                }
+               if (endpoint->ident_method & method) {
+                       /* We are already indentifying by this method.  No need to do it again. */
+                       continue;
+               }
 
                endpoint->ident_method |= method;
                AST_VECTOR_APPEND(&endpoint->ident_method_order, method);
index f99a3b8..fd87ef7 100644 (file)
@@ -523,25 +523,17 @@ static int register_aor(pjsip_rx_data *rdata,
 {
        int res;
        struct ao2_container *contacts = NULL;
-       struct ast_named_lock *lock;
 
-       lock = ast_named_lock_get(AST_NAMED_LOCK_TYPE_MUTEX, "aor", aor_name);
-       if (!lock) {
-               return PJ_TRUE;
-       }
-
-       ao2_lock(lock);
+       ao2_lock(aor);
        contacts = ast_sip_location_retrieve_aor_contacts_nolock(aor);
        if (!contacts) {
-               ao2_unlock(lock);
-               ast_named_lock_put(lock);
+               ao2_unlock(aor);
                return PJ_TRUE;
        }
 
        res = register_aor_core(rdata, endpoint, aor, aor_name, contacts);
        ao2_cleanup(contacts);
-       ao2_unlock(lock);
-       ast_named_lock_put(lock);
+       ao2_unlock(aor);
 
        return res;
 }
@@ -563,6 +555,7 @@ static int match_aor(const char *aor_name, const char *id)
 static char *find_aor_name(const char *username, const char *domain, const char *aors)
 {
        char *configured_aors;
+       char *aors_buf;
        char *aor_name;
        char *id_domain;
        struct ast_sip_domain_alias *alias;
@@ -570,8 +563,10 @@ static char *find_aor_name(const char *username, const char *domain, const char
        id_domain = ast_alloca(strlen(username) + strlen(domain) + 2);
        sprintf(id_domain, "%s@%s", username, domain);
 
+       aors_buf = ast_strdupa(aors);
+
        /* Look for exact match on username@domain */
-       configured_aors = ast_strdupa(aors);
+       configured_aors = aors_buf;
        while ((aor_name = ast_strip(strsep(&configured_aors, ",")))) {
                if (match_aor(aor_name, id_domain)) {
                        return ast_strdup(aor_name);
@@ -586,7 +581,7 @@ static char *find_aor_name(const char *username, const char *domain, const char
                sprintf(id_domain, "%s@%s", username, alias->domain);
                ao2_cleanup(alias);
 
-               configured_aors = ast_strdupa(aors);
+               configured_aors = strcpy(aors_buf, aors);/* Safe */
                while ((aor_name = ast_strip(strsep(&configured_aors, ",")))) {
                        if (match_aor(aor_name, id_domain_alias)) {
                                return ast_strdup(aor_name);
@@ -594,8 +589,13 @@ static char *find_aor_name(const char *username, const char *domain, const char
                }
        }
 
+       if (ast_strlen_zero(username)) {
+               /* No username, no match */
+               return NULL;
+       }
+
        /* Look for exact match on username only */
-       configured_aors = ast_strdupa(aors);
+       configured_aors = strcpy(aors_buf, aors);/* Safe */
        while ((aor_name = ast_strip(strsep(&configured_aors, ",")))) {
                if (match_aor(aor_name, username)) {
                        return ast_strdup(aor_name);
index 75feeb1..ee18bfe 100644 (file)
                                                                        "normal",
                                                                        "busy",
                                                                        "congestion",
-                                                                       "no_answer"
+                                                                       "no_answer",
+                                                                       "answered_elsewhere"
                                                                ]
                                                        }
                                                }