SIP preferred codec only feature
authorDavid Vossel <dvossel@digium.com>
Tue, 24 Mar 2009 20:01:29 +0000 (20:01 +0000)
committerDavid Vossel <dvossel@digium.com>
Tue, 24 Mar 2009 20:01:29 +0000 (20:01 +0000)
Added an option to respond to a SIP invite with only the single most preferred joint codec.  This limits the options of what codecs the other side can use.

(closes issue #12485)
Reported by: bamby
Review: http://reviewboard.digium.com/r/206/

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

CHANGES
channels/chan_sip.c
configs/sip.conf.sample

diff --git a/CHANGES b/CHANGES
index 404248b..91877d3 100644 (file)
--- a/CHANGES
+++ b/CHANGES
 --- Functionality changes from Asterisk 1.6.2 to Asterisk 1.6.3  -------------
 ------------------------------------------------------------------------------
 
+SIP Changes
+-----------
+ * Added preferred_codec_only option in sip.conf. This feature limits the joint
+   codecs sent in response to an INVITE to the single most preferred codec.
+
 Applications
 ------------
  * Added progress option to the app_dial D() option.  When progress DTMF is
index 0266070..c8a79b8 100644 (file)
@@ -1369,6 +1369,7 @@ struct sip_auth {
 /* Space for addition of other realtime flags in the future */
 #define SIP_PAGE2_STATECHANGEQUEUE     (1 << 9)        /*!< D: Unsent state pending change exists */
 
+#define SIP_PAGE2_PREFERRED_CODEC      (1 << 13)       /*!< GDP: Only respond with single most preferred joint codec */
 #define SIP_PAGE2_VIDEOSUPPORT         (1 << 14)       /*!< DP: Video supported if offered? */
 #define SIP_PAGE2_TEXTSUPPORT          (1 << 15)       /*!< GDP: Global text enable */
 #define SIP_PAGE2_ALLOWSUBSCRIBE       (1 << 16)       /*!< GP: Allow subscriptions from this peer? */
@@ -1398,7 +1399,7 @@ struct sip_auth {
        (SIP_PAGE2_ALLOWSUBSCRIBE | SIP_PAGE2_ALLOWOVERLAP | SIP_PAGE2_IGNORESDPVERSION | \
        SIP_PAGE2_VIDEOSUPPORT | SIP_PAGE2_T38SUPPORT | SIP_PAGE2_RFC2833_COMPENSATE | \
        SIP_PAGE2_BUGGY_MWI | SIP_PAGE2_TEXTSUPPORT | SIP_PAGE2_FAX_DETECT | \
-       SIP_PAGE2_UDPTL_DESTINATION | SIP_PAGE2_VIDEOSUPPORT_ALWAYS)
+       SIP_PAGE2_UDPTL_DESTINATION | SIP_PAGE2_VIDEOSUPPORT_ALWAYS | SIP_PAGE2_PREFERRED_CODEC)
 
 /*@}*/ 
 
@@ -8064,11 +8065,15 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
        p->peercapability = newpeercapability;                  /* The other sides capability in latest offer */
        p->jointnoncodeccapability = newnoncodeccapability;     /* DTMF capabilities */
 
+       if (ast_test_flag(&p->flags[1], SIP_PAGE2_PREFERRED_CODEC)) { /* respond with single most preferred joint codec, limiting the other side's choice */
+               p->jointcapability = ast_codec_choose(&p->prefs, p->jointcapability, 1);
+       }
+
        if (p->jointcapability & AST_FORMAT_T140RED) {
-               p->red = 1; 
+               p->red = 1;
                ast_rtp_red_init(p->trtp, 300, red_data_pt, 2);
        } else {
-               p->red = 0; 
+               p->red = 0;
        }
 
        ast_rtp_pt_copy(p->rtp, newaudiortp);
@@ -22697,6 +22702,8 @@ static struct sip_peer *build_peer(const char *name, struct ast_variable *v, str
                        int error =  ast_parse_allow_disallow(&peer->prefs, &peer->capability, v->value, FALSE);
                        if (error)
                                ast_log(LOG_WARNING, "Codec configuration errors found in line %d : %s = %s\n", v->lineno, v->name, v->value);
+               } else if (!strcasecmp(v->name, "preferred_codec_only")) {
+                       ast_set2_flag(&peer->flags[1], ast_true(v->value), SIP_PAGE2_PREFERRED_CODEC);
                } else if (!strcasecmp(v->name, "registertrying")) {
                        ast_set2_flag(&peer->flags[1], ast_true(v->value), SIP_PAGE2_REGISTERTRYING);
                } else if (!strcasecmp(v->name, "autoframing")) {
@@ -23432,6 +23439,8 @@ static int reload_config(enum channelreloadreason reason)
                        int error =  ast_parse_allow_disallow(&default_prefs, &global_capability, v->value, FALSE);
                        if (error)
                                ast_log(LOG_WARNING, "Codec configuration errors found in line %d : %s = %s\n", v->lineno, v->name, v->value);
+               } else if (!strcasecmp(v->name, "preferred_codec_only")) {
+                       ast_set2_flag(&global_flags[1], ast_true(v->value), SIP_PAGE2_PREFERRED_CODEC);
                } else if (!strcasecmp(v->name, "autoframing")) {
                        global_autoframing = ast_true(v->value);
                } else if (!strcasecmp(v->name, "allowexternaldomains")) {
index c7ae9c0..a67a209 100644 (file)
@@ -182,6 +182,11 @@ srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
 ;vmexten=voicemail              ; dialplan extension to reach mailbox sets the 
                                 ; Message-Account in the MWI notify message 
                                 ; defaults to "asterisk"
+
+;preferred_codec_only=yes       ; Respond to a SIP invite with the single most preferred codec
+                                ; rather than advertising all joint codec capabilities. This
+                                ; limits the other side's codec choice to exactly what we prefer.
+
 ;disallow=all                   ; First disallow all codecs
 ;allow=ulaw                     ; Allow codecs in order of preference
 ;allow=ilbc                     ; see doc/rtp-packetization for framing options