chan_sip: Allow a sip peer to accept both AVP and AVPF calls
authorKevin Harwell <kharwell@digium.com>
Fri, 25 Oct 2013 16:09:05 +0000 (16:09 +0000)
committerKevin Harwell <kharwell@digium.com>
Fri, 25 Oct 2013 16:09:05 +0000 (16:09 +0000)
Adapts the behaviour of avpf to only impact the format of outgoing calls. For
inbound calls, both AVP and AVPF calls will be accepted regardless of the value
of avpf in the configuration.

(closes issue ASTERISK-22005)
Reported by: Torrey Searle
Patches:
     optional_avpf_trunk.patch uploaded by tsearle (license 5334)
........

Merged revisions 401884 from http://svn.asterisk.org/svn/asterisk/branches/11
........

Merged revisions 401885 from http://svn.asterisk.org/svn/asterisk/branches/12

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@401886 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index 9a4d284..791d693 100644 (file)
@@ -10242,11 +10242,26 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
                                }
 
                                if ((!strcmp(protocol, "RTP/SAVPF") || !strcmp(protocol, "UDP/TLS/RTP/SAVPF")) && !ast_test_flag(&p->flags[2], SIP_PAGE3_USE_AVPF)) {
-                                       ast_log(LOG_WARNING, "Received SAVPF profle in audio offer but AVPF is not enabled: %s\n", m);
-                                       continue;
+                                       if (req->method != SIP_RESPONSE) {
+                                               ast_log(LOG_NOTICE, "Received SAVPF profle in audio offer but AVPF is not enabled, enabling: %s\n", m);
+                                               secure_audio = 1;
+                                               ast_set_flag(&p->flags[2], SIP_PAGE3_USE_AVPF);
+                                       }
+                                       else {
+
+                                               ast_log(LOG_WARNING, "Received SAVPF profle in audio answer but AVPF is not enabled: %s\n", m);
+                                               continue;
+                                       }
                                } else if ((!strcmp(protocol, "RTP/SAVP") || !strcmp(protocol, "UDP/TLS/RTP/SAVP")) && ast_test_flag(&p->flags[2], SIP_PAGE3_USE_AVPF)) {
-                                       ast_log(LOG_WARNING, "Received SAVP profile in audio offer but AVPF is enabled: %s\n", m);
-                                       continue;
+                                       if (req->method != SIP_RESPONSE) {
+                                               ast_log(LOG_NOTICE, "Received SAVP profle in audio offer but AVPF is enabled, disabling: %s\n", m);
+                                               secure_audio = 1;
+                                               ast_clear_flag(&p->flags[2], SIP_PAGE3_USE_AVPF);
+                                       }
+                                       else {
+                                               ast_log(LOG_WARNING, "Received SAVP profile in audio offer but AVPF is enabled: %s\n", m);
+                                               continue;
+                                       }
                                } else if (!strcmp(protocol, "UDP/TLS/RTP/SAVP") || !strcmp(protocol, "UDP/TLS/RTP/SAVPF")) {
                                        secure_audio = 1;
 
@@ -10257,11 +10272,23 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
                                } else if (!strcmp(protocol, "RTP/SAVP") || !strcmp(protocol, "RTP/SAVPF")) {
                                        secure_audio = 1;
                                } else if (!strcmp(protocol, "RTP/AVPF") && !ast_test_flag(&p->flags[2], SIP_PAGE3_USE_AVPF)) {
-                                       ast_log(LOG_WARNING, "Received AVPF profile in audio offer but AVPF is not enabled: %s\n", m);
-                                       continue;
+                                       if (req->method != SIP_RESPONSE) {
+                                               ast_log(LOG_NOTICE, "Received AVPF profile in audio offer but AVPF is not enabled, enabling: %s\n", m);
+                                               ast_set_flag(&p->flags[2], SIP_PAGE3_USE_AVPF);
+                                       }
+                                       else {
+                                               ast_log(LOG_WARNING, "Received AVP profile in audio answer but AVPF is enabled: %s\n", m);
+                                               continue;
+                                       }
                                } else if (!strcmp(protocol, "RTP/AVP") && ast_test_flag(&p->flags[2], SIP_PAGE3_USE_AVPF)) {
-                                       ast_log(LOG_WARNING, "Received AVP profile in audio offer but AVPF is enabled: %s\n", m);
-                                       continue;
+                                       if (req->method != SIP_RESPONSE) {
+                                               ast_log(LOG_NOTICE, "Received AVP profile in audio answer but AVPF is enabled, disabling: %s\n", m);
+                                               ast_clear_flag(&p->flags[2], SIP_PAGE3_USE_AVPF);
+                                       }
+                                       else {
+                                               ast_log(LOG_WARNING, "Received AVP profile in audio answer but AVPF is enabled: %s\n", m);
+                                               continue;
+                                       }
                                } else if ((!strcmp(protocol, "UDP/TLS/RTP/SAVP") || !strcmp(protocol, "UDP/TLS/RTP/SAVPF")) &&
                                           (!(dtls = ast_rtp_instance_get_dtls(p->rtp)) || !dtls->active(p->rtp))) {
                                        ast_log(LOG_WARNING, "Received UDP/TLS in audio offer but DTLS is not enabled: %s\n", m);