diff options
author | David Vossel <dvossel@digium.com> | 2010-08-25 15:56:05 +0000 |
---|---|---|
committer | David Vossel <dvossel@digium.com> | 2010-08-25 15:56:05 +0000 |
commit | 848135748f1104647c79a0d23e50c39f0d2cda08 (patch) | |
tree | 9b08b98116244c4c8db5b95db99e62020be4fe97 | |
parent | 2e4c877542e40fe9912e7240aa25a7379d0cd942 (diff) |
Merged revisions 283559 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8
................
r283559 | dvossel | 2010-08-25 10:54:11 -0500 (Wed, 25 Aug 2010) | 16 lines
Merged revisions 283558 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.6.2
........
r283558 | dvossel | 2010-08-25 10:52:54 -0500 (Wed, 25 Aug 2010) | 10 lines
Asterisk will not advertise session timers are supported when 'session-timers=refuse' is used.
Asterisk now dynamically builds the "Supported" header depending
on what is enabled/disabled in sip.conf. Session timers used
to always be advertised as being supported even when they were disabled
in the configuration. This caused problems with some end points.
(issue #17005)
........
................
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@283560 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | channels/chan_sip.c | 26 | ||||
-rw-r--r-- | channels/sip/include/sip.h | 8 |
2 files changed, 20 insertions, 14 deletions
diff --git a/channels/chan_sip.c b/channels/chan_sip.c index a056e522f..9019b056b 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -9014,6 +9014,20 @@ static int process_sdp_a_image(const char *a, struct sip_pvt *p) return found; } +/*! \brief Add "Supported" header to sip message. Since some options may + * be disabled in the config, the sip_pvt must be inspected to determine what + * is supported for this dialog. */ +static int add_supported_header(struct sip_pvt *pvt, struct sip_request *req) +{ + int res; + if (st_get_mode(pvt) != SESSION_TIMER_MODE_REFUSE) { + res = add_header(req, "Supported", "replaces, timer"); + } else { + res = add_header(req, "Supported", "replaces"); + } + return res; +} + /*! \brief Add header to SIP message */ static int add_header(struct sip_request *req, const char *var, const char *value) { @@ -9455,7 +9469,7 @@ static int respprep(struct sip_request *resp, struct sip_pvt *p, const char *msg if (!ast_strlen_zero(global_useragent)) add_header(resp, "Server", global_useragent); add_header(resp, "Allow", ALLOWED_METHODS); - add_header(resp, "Supported", SUPPORTED_EXTENSIONS); + add_supported_header(p, resp); /* If this is an invite, add Session-Timers related headers if the feature is active for this session */ if (p->method == SIP_INVITE && p->stimer && p->stimer->st_active == TRUE && p->stimer->st_active_peer_ua == TRUE) { @@ -10935,7 +10949,7 @@ static int transmit_reinvite_with_sdp(struct sip_pvt *p, int t38version, int old reqprep(&req, p, ast_test_flag(&p->flags[0], SIP_REINVITE_UPDATE) ? SIP_UPDATE : SIP_INVITE, 0, 1); add_header(&req, "Allow", ALLOWED_METHODS); - add_header(&req, "Supported", SUPPORTED_EXTENSIONS); + add_supported_header(p, &req); if (sipdebug) { if (oldsdp == TRUE) add_header(&req, "X-asterisk-Info", "SIP re-invite (Session-Timers)"); @@ -11331,7 +11345,7 @@ static int transmit_invite(struct sip_pvt *p, int sipmethod, int sdp, int init, } add_header(&req, "Allow", ALLOWED_METHODS); - add_header(&req, "Supported", SUPPORTED_EXTENSIONS); + add_supported_header(p, &req); if (p->options && p->options->addsipheaders && p->owner) { struct ast_channel *chan = p->owner; /* The owner channel */ @@ -11886,7 +11900,7 @@ static int transmit_notify_with_sipfrag(struct sip_pvt *p, int cseq, char *messa add_header(&req, "Subscription-state", terminate ? "terminated;reason=noresource" : "active"); add_header(&req, "Content-Type", "message/sipfrag;version=2.0"); add_header(&req, "Allow", ALLOWED_METHODS); - add_header(&req, "Supported", SUPPORTED_EXTENSIONS); + add_supported_header(p, &req); snprintf(tmp, sizeof(tmp), "SIP/2.0 %s\r\n", message); add_content(&req, tmp); @@ -11995,7 +12009,7 @@ static void update_connectedline(struct sip_pvt *p, const void *data, size_t dat reqprep(&req, p, ast_test_flag(&p->flags[0], SIP_REINVITE_UPDATE) ? SIP_UPDATE : SIP_INVITE, 0, 1); add_header(&req, "Allow", ALLOWED_METHODS); - add_header(&req, "Supported", SUPPORTED_EXTENSIONS); + add_supported_header(p, &req); add_rpid(&req, p); add_sdp(&req, p, FALSE, TRUE, FALSE); @@ -12485,7 +12499,7 @@ static int transmit_refer(struct sip_pvt *p, const char *dest) add_header(&req, "Refer-To", referto); add_header(&req, "Allow", ALLOWED_METHODS); - add_header(&req, "Supported", SUPPORTED_EXTENSIONS); + add_supported_header(p, &req); if (!ast_strlen_zero(p->our_contact)) { add_header(&req, "Referred-By", p->our_contact); } diff --git a/channels/sip/include/sip.h b/channels/sip/include/sip.h index 11996f690..9fa37a4d4 100644 --- a/channels/sip/include/sip.h +++ b/channels/sip/include/sip.h @@ -154,14 +154,6 @@ */ #define ALLOWED_METHODS "INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH" -/*! \brief SIP Extensions we support - * \note This should be generated based on the previous array - * in combination with settings. - * - * \todo We should not have "timer" if it's disabled in the configuration file. - */ -#define SUPPORTED_EXTENSIONS "replaces, timer" - /*! \brief Standard SIP unsecure port for UDP and TCP from RFC 3261. DO NOT CHANGE THIS */ #define STANDARD_SIP_PORT 5060 /*! \brief Standard SIP TLS port from RFC 3261. DO NOT CHANGE THIS */ |