Compare commits

...

23 Commits

Author SHA1 Message Date
Asterisk Autobuilder
df35f748ef Importing release summary for 10.1.3 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.3@356571 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-02-23 23:37:04 +00:00
Matthew Jordan
9d63a27b7a Merge 355733, 356476 for 10.1.3
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.3@356569 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-02-23 23:31:02 +00:00
Matthew Jordan
b0022437ae Create tag for 10.1.3
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.3@356567 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-02-23 22:45:01 +00:00
Asterisk Autobuilder
35a612c868 Importing release summary for 10.1.2 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.2@354654 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-02-09 19:30:00 +00:00
Matthew Jordan
638257e6b3 Committing 354496, 354543, 354548 for 10.1.2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.2@354642 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-02-09 19:13:16 +00:00
Matthew Jordan
0ac98cb7c0 Create tag for 10.1.2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.2@354578 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-02-09 17:26:55 +00:00
Asterisk Autobuilder
2baf74df58 Importing release summary for 10.1.1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.1@354215 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-02-06 21:50:38 +00:00
Jason Parker
aa36e5f198 Remove old summary files.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.1@354214 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-02-06 21:47:04 +00:00
Jason Parker
3c2a9bc967 Update .version and ChangeLog. Merge fixes.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.1@354211 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-02-06 21:40:48 +00:00
Jason Parker
35c6193ce8 Create tag for Asterisk 10.1.1
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.1@354206 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-02-06 21:25:59 +00:00
Asterisk Autobuilder
aa9a0bd7ef Importing release summary for 10.1.0 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.0@352974 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-01-27 19:23:55 +00:00
Asterisk Autobuilder
726db5c21a Update .version and ChangeLog for 10.1.0
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.0@352958 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-01-27 18:57:18 +00:00
Asterisk Autobuilder
481640a587 Created tag for 10.1.0
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.0@352953 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-01-27 16:51:30 +00:00
Asterisk Autobuilder
67d4994dec Importing release summary for 10.1.0-rc2 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.0-rc2@352347 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-01-24 18:51:49 +00:00
Asterisk Autobuilder
fe5270a92f Updated with test results
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.0-rc2@352346 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-01-24 18:51:00 +00:00
Matthew Jordan
907ae33024 Merged 349732, 350553, 352228, 352015, 351505, 351289, 351308
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.0-rc2@352290 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-01-24 16:38:46 +00:00
Matthew Jordan
a2f6f5de34 Create 10.1.0-rc2
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.0-rc2@352285 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2012-01-24 14:45:42 +00:00
Asterisk Autobuilder
cb517c90de Updated release date
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.0-rc1@349402 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-12-30 15:25:10 +00:00
Asterisk Autobuilder
9137f7408b Updated ChangeLog with test results
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.0-rc1@349401 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-12-30 14:58:22 +00:00
Asterisk Autobuilder
91e047df57 Use autotagged externals
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.0-rc1@349399 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-12-29 19:41:47 +00:00
Asterisk Autobuilder
83665af6bc Importing release summary for 10.1.0-rc1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.0-rc1@349398 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-12-29 19:41:37 +00:00
Asterisk Autobuilder
9b7c240428 Importing files for 10.1.0-rc1 release.
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.0-rc1@349397 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-12-29 19:41:31 +00:00
Asterisk Autobuilder
3b1f3d20dc Creating tag for the release of asterisk-10.1.0-rc1
git-svn-id: https://origsvn.digium.com/svn/asterisk/tags/10.1.0-rc1@349396 65c4cc65-6c06-0410-ace0-fbb531ad65f3
2011-12-29 19:38:09 +00:00
14 changed files with 21201 additions and 168 deletions

3
.lastclean Normal file
View File

@@ -0,0 +1,3 @@
39

1
.version Normal file
View File

@@ -0,0 +1 @@
10.1.3

15
CHANGES
View File

@@ -8,6 +8,21 @@
===
==============================================================================
------------------------------------------------------------------------------
--- Functionality changes since Asterisk 10.0.0 ------------------------------
------------------------------------------------------------------------------
RTP changes
-------------
* A new option, 'probation' has been added to rtp.conf
RTP in strictrtp mode can now require more than 1 packet to exit learning
mode with a new source (and by default requires 4). The probation option
allows the user to change the required number of packets in sequence to any
desired value. Use a value of 1 to essentially restore the old behavior.
Also, with strictrtp on, Asterisk will now drop all packets until learning
mode has successfully exited. These changes are based on how pjmedia handles
media sources and source changes.
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 1.8 to Asterisk 10 -------------------
------------------------------------------------------------------------------

20447
ChangeLog Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -150,6 +150,7 @@ static int parkandannounce_exec(struct ast_channel *chan, const char *data)
}
/* Save the CallerID because the masquerade turns chan into a ZOMBIE. */
ast_party_id_init(&caller_id);
ast_channel_lock(chan);
ast_party_id_copy(&caller_id, &chan->caller.id);
ast_channel_unlock(chan);

View File

@@ -2397,9 +2397,8 @@ static struct call_queue *find_load_queue_rt_friendly(const char *queuename)
if (queue_vars) {
member_config = ast_load_realtime_multientry("queue_members", "interface LIKE", "%", "queue_name", queuename, SENTINEL);
if (!member_config) {
ast_log(LOG_ERROR, "no queue_members defined in your config (extconfig.conf).\n");
ast_variables_destroy(queue_vars);
return NULL;
ast_debug(1, "No queue_members defined in config extconfig.conf\n");
member_config = ast_config_new();
}
}
if (q) {

View File

@@ -0,0 +1,137 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /><title>Release Summary - asterisk-10.1.3</title></head>
<body>
<h1 align="center"><a name="top">Release Summary</a></h1>
<h3 align="center">asterisk-10.1.3</h3>
<h3 align="center">Date: 2012-02-23</h3>
<h3 align="center">&lt;asteriskteam@digium.com&gt;</h3>
<hr/>
<h2 align="center">Table of Contents</h2>
<ol>
<li><a href="#summary">Summary</a></li>
<li><a href="#contributors">Contributors</a></li>
<li><a href="#commits">Other Changes</a></li>
<li><a href="#diffstat">Diffstat</a></li>
</ol>
<hr/>
<a name="summary"><h2 align="center">Summary</h2></a>
<center><a href="#top">[Back to Top]</a></center><br/><p>This release includes only bug fixes. The changes included were made only to address problems that have been identified in this release series. Users should be able to safely upgrade to this version if this release series is already in use. Users considering upgrading from a previous release series are strongly encouraged to review the UPGRADE.txt document as well as the CHANGES document for information about upgrading to this release series.</p>
<p>The data in this summary reflects changes that have been made since the previous release, asterisk-10.1.2.</p>
<hr/>
<a name="contributors"><h2 align="center">Contributors</h2></a>
<center><a href="#top">[Back to Top]</a></center><br/><p>This table lists the people who have submitted code, those that have tested patches, as well as those that reported issues on the issue tracker that were resolved in this release. For coders, the number is how many of their patches (of any size) were committed into this release. For testers, the number is the number of times their name was listed as assisting with testing a patch. Finally, for reporters, the number is the number of issues that they reported that were closed by commits that went into this release.</p>
<table width="100%" border="0">
<tr>
<td width="33%"><h3>Coders</h3></td>
<td width="33%"><h3>Testers</h3></td>
<td width="33%"><h3>Reporters</h3></td>
</tr>
<tr valign="top">
<td>
13 seanbright<br/>
8 rmudgett<br/>
4 pabelanger<br/>
3 kmoore<br/>
3 mmichelson<br/>
2 file<br/>
2 qwell<br/>
2 twilson<br/>
1 alecdavis<br/>
1 may<br/>
1 mjordan<br/>
</td>
<td>
</td>
<td>
</td>
</tr>
</table>
<hr/>
<a name="commits"><h2 align="center">Commits Not Associated with an Issue</h2></a>
<center><a href="#top">[Back to Top]</a></center><br/><p>This is a list of all changes that went into this release that did not directly close an issue from the issue tracker. The commits may have been marked as being related to an issue. If that is the case, the issue numbers are listed here, as well.</p>
<table width="100%" border="1">
<tr><td><b>Revision</b></td><td><b>Author</b></td><td><b>Summary</b></td><td><b>Issues Referenced</b></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=354656">354656</a></td><td>kmoore</td><td>Make the config parser remove escaping backslashes</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-17121">ASTERISK-17121</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=354703">354703</a></td><td>kmoore</td><td>Fix parsing of SIP headers where compact and non-compact headers are mixed</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-17192">ASTERISK-17192</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=354750">354750</a></td><td>twilson</td><td>Note that CDRs are immutable once a bridge is torn down</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-16923">ASTERISK-16923</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=354836">354836</a></td><td>rmudgett</td><td>Fix AMI Redirect ExtraChannel not redirecting to the same exten and context.</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-16974">ASTERISK-16974</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=354890">354890</a></td><td>qwell</td><td>Fix a voicemail memory leak with heard/deleted messages.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=354938">354938</a></td><td>file</td><td>Don't try to play sound files that do not exist.</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-19188">ASTERISK-19188</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=354959">354959</a></td><td>rmudgett</td><td>Fix reconnecting to pgsql database after connection loss.</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-16982">ASTERISK-16982</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355010">355010</a></td><td>file</td><td>Only allow one 'dialplan reload' to execute at a time as otherwise they would share the same common local context list.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355057">355057</a></td><td>rmudgett</td><td>Fix occasional incorrectly delayed call-file execution.</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-19081">ASTERISK-19081</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355137">355137</a></td><td>may</td><td>call manager_event only if there is not null channel structure</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-19298">ASTERISK-19298</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355183">355183</a></td><td>seanbright</td><td>Clear the high order bit from the destination call number before sending.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355229">355229</a></td><td>qwell</td><td>Don't enable sqlite3 CDRs by default in sample configs.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355271">355271</a></td><td>mmichelson</td><td>Properly invert the return of a strncmp call.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355320">355320</a></td><td>rmudgett</td><td>Fix lock typo that should be unlock in cel_sqlite_custom reload.</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-19356">ASTERISK-19356</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355375">355375</a></td><td>rmudgett</td><td>Fix voicemail problems when using ogg/vorbis.</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-16926">ASTERISK-16926</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355449">355449</a></td><td>seanbright</td><td>Use TRUNK_CALL_START as originally intended.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355467">355467</a></td><td>seanbright</td><td>Only use maxtrunkcall and maxnontrunkcall in chan_iax2 if IAX_OLD_FIND is specified.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355530">355530</a></td><td>seanbright</td><td>When IAX2 debugging is enabled, make sure to log 'apathetic' messages too.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355575">355575</a></td><td>rmudgett</td><td>Fix AMI Monitor action without File header converting channel name into filename.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355620">355620</a></td><td>rmudgett</td><td>Fix compile problem when old version of libvorbisfile v1.1.2 is used.</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-19370">ASTERISK-19370</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355623">355623</a></td><td>seanbright</td><td>Revert a change to audio_audiohook_write_list that had no affect.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355733">355733</a></td><td>mmichelson</td><td>Fix regressions with regards to route-set creation on early dialogs.</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-19358">ASTERISK-19358</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355747">355747</a></td><td>seanbright</td><td>Pass the correct value to ast_timer_set_rate() for IAX2 trunking.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355794">355794</a></td><td>seanbright</td><td>Don't allow trunkfreq to be greater than 1000ms.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355851">355851</a></td><td>alecdavis</td><td>push 'outgoing' flag from sig_XXX up to chan_dahdi</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-19316">ASTERISK-19316</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355895">355895</a></td><td>pabelanger</td><td>Fix -Werror=unused-but-set-variable compiler error (gcc 4.6.2)</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355896">355896</a></td><td>pabelanger</td><td>Revert commit</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355902">355902</a></td><td>seanbright</td><td>Set the length of the ast_sockaddr, so that we can set it's port later.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355905">355905</a></td><td>seanbright</td><td>Add some boilerplate documentation for IAXVAR and IAXPEER.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355950">355950</a></td><td>seanbright</td><td>Change some debug messages from LOG_DEBUG to ast_debug.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355953">355953</a></td><td>seanbright</td><td>This was a LOG_NOTICE, so roll it back.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=355998">355998</a></td><td>seanbright</td><td>Remove spurious warning when 'qualifyfreqnotok' is set successfully.</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-17176">ASTERISK-17176</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=356074">356074</a></td><td>kmoore</td><td>Add missing newline to ccss state change notification</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=356108">356108</a></td><td>seanbright</td><td>Make 'iax2 show callnumber usage' output make sense when an IP is passed in.</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=356215">356215</a></td><td>mjordan</td><td>Fix potential buffer overrun and memory leak when executing "sip show peers"</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-19231">ASTERISK-19231</a>, <a href="https://issues.asterisk.org/jira/browse/ASTERISK-19361">ASTERISK-19361</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=356297">356297</a></td><td>twilson</td><td>Track module use count for res_calendar</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=356428">356428</a></td><td>pabelanger</td><td>Multiple revisions 356290,356335,356337</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=356431">356431</a></td><td>pabelanger</td><td>Fix -Werror=unused-but-set-variable compiler error (gcc 4.6.2)</td>
<td></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=356476">356476</a></td><td>mmichelson</td><td>Fix ACK routing for non-2xx responses.</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-19389">ASTERISK-19389</a></td></tr><tr><td><a href="http://svn.digium.com/view/asterisk/branches/10?view=revision&revision=356522">356522</a></td><td>rmudgett</td><td>Fix blind transfer parking issues if the dialed extension is not recognized as a parking extension.</td>
<td><a href="https://issues.asterisk.org/jira/browse/ASTERISK-19322">ASTERISK-19322</a></td></tr></table>
<hr/>
<a name="diffstat"><h2 align="center">Diffstat Results</h2></a>
<center><a href="#top">[Back to Top]</a></center><br/><p>This is a summary of the changes to the source code that went into this release that was generated using the diffstat utility.</p>
<pre>
addons/chan_ooh323.c | 7
apps/app_confbridge.c | 8
apps/app_rpt.c | 69 +----
apps/app_voicemail.c | 23 -
autoconf/ast_c_declare_check.m4 | 31 ++
cel/cel_sqlite3_custom.c | 2
channels/chan_dahdi.c | 10
channels/chan_iax2.c | 62 +++--
channels/chan_sip.c | 115 +++++----
channels/sig_analog.c | 16 -
channels/sig_analog.h | 1
channels/sig_pri.c | 16 -
channels/sig_pri.h | 1
channels/sig_ss7.c | 14 -
channels/sig_ss7.h | 1
configs/cdr_sqlite3_custom.conf.sample | 8
configs/extconfig.conf.sample | 4
configs/iax.conf.sample | 3
configure.ac | 5
formats/format_ogg_vorbis.c | 399 +++++++++++----------------------
funcs/func_cdr.c | 4
include/asterisk/autoconfig.h.in | 16 -
include/asterisk/calendar.h | 2
main/audiohook.c | 4
main/ccss.c | 2
main/config.c | 4
main/features.c | 81 +++---
main/loader.c | 4
main/manager.c | 7
pbx/pbx_config.c | 10
pbx/pbx_spool.c | 41 ++-
res/res_calendar.c | 2
res/res_config_pgsql.c | 66 +++++
res/res_monitor.c | 22 +
34 files changed, 567 insertions(+), 493 deletions(-)
</pre><br/>
<hr/>
</body>
</html>

257
asterisk-10.1.3-summary.txt Normal file
View File

@@ -0,0 +1,257 @@
Release Summary
asterisk-10.1.3
Date: 2012-02-23
<asteriskteam@digium.com>
----------------------------------------------------------------------
Table of Contents
1. Summary
2. Contributors
3. Other Changes
4. Diffstat
----------------------------------------------------------------------
Summary
[Back to Top]
This release includes only bug fixes. The changes included were made only
to address problems that have been identified in this release series.
Users should be able to safely upgrade to this version if this release
series is already in use. Users considering upgrading from a previous
release series are strongly encouraged to review the UPGRADE.txt document
as well as the CHANGES document for information about upgrading to this
release series.
The data in this summary reflects changes that have been made since the
previous release, asterisk-10.1.2.
----------------------------------------------------------------------
Contributors
[Back to Top]
This table lists the people who have submitted code, those that have
tested patches, as well as those that reported issues on the issue tracker
that were resolved in this release. For coders, the number is how many of
their patches (of any size) were committed into this release. For testers,
the number is the number of times their name was listed as assisting with
testing a patch. Finally, for reporters, the number is the number of
issues that they reported that were closed by commits that went into this
release.
Coders Testers Reporters
13 seanbright
8 rmudgett
4 pabelanger
3 kmoore
3 mmichelson
2 file
2 qwell
2 twilson
1 alecdavis
1 may
1 mjordan
----------------------------------------------------------------------
Commits Not Associated with an Issue
[Back to Top]
This is a list of all changes that went into this release that did not
directly close an issue from the issue tracker. The commits may have been
marked as being related to an issue. If that is the case, the issue
numbers are listed here, as well.
+------------------------------------------------------------------------+
|Revision|Author |Summary |Issues |
| | | |Referenced |
|--------+----------+------------------------------------+---------------|
|354656 |kmoore |Make the config parser remove |ASTERISK-17121 |
| | |escaping backslashes | |
|--------+----------+------------------------------------+---------------|
| | |Fix parsing of SIP headers where | |
|354703 |kmoore |compact and non-compact headers are |ASTERISK-17192 |
| | |mixed | |
|--------+----------+------------------------------------+---------------|
|354750 |twilson |Note that CDRs are immutable once a |ASTERISK-16923 |
| | |bridge is torn down | |
|--------+----------+------------------------------------+---------------|
| | |Fix AMI Redirect ExtraChannel not | |
|354836 |rmudgett |redirecting to the same exten and |ASTERISK-16974 |
| | |context. | |
|--------+----------+------------------------------------+---------------|
|354890 |qwell |Fix a voicemail memory leak with | |
| | |heard/deleted messages. | |
|--------+----------+------------------------------------+---------------|
|354938 |file |Don't try to play sound files that |ASTERISK-19188 |
| | |do not exist. | |
|--------+----------+------------------------------------+---------------|
|354959 |rmudgett |Fix reconnecting to pgsql database |ASTERISK-16982 |
| | |after connection loss. | |
|--------+----------+------------------------------------+---------------|
| | |Only allow one 'dialplan reload' to | |
|355010 |file |execute at a time as otherwise they | |
| | |would share the same common local | |
| | |context list. | |
|--------+----------+------------------------------------+---------------|
|355057 |rmudgett |Fix occasional incorrectly delayed |ASTERISK-19081 |
| | |call-file execution. | |
|--------+----------+------------------------------------+---------------|
|355137 |may |call manager_event only if there is |ASTERISK-19298 |
| | |not null channel structure | |
|--------+----------+------------------------------------+---------------|
| | |Clear the high order bit from the | |
|355183 |seanbright|destination call number before | |
| | |sending. | |
|--------+----------+------------------------------------+---------------|
|355229 |qwell |Don't enable sqlite3 CDRs by default| |
| | |in sample configs. | |
|--------+----------+------------------------------------+---------------|
|355271 |mmichelson|Properly invert the return of a | |
| | |strncmp call. | |
|--------+----------+------------------------------------+---------------|
|355320 |rmudgett |Fix lock typo that should be unlock |ASTERISK-19356 |
| | |in cel_sqlite_custom reload. | |
|--------+----------+------------------------------------+---------------|
|355375 |rmudgett |Fix voicemail problems when using |ASTERISK-16926 |
| | |ogg/vorbis. | |
|--------+----------+------------------------------------+---------------|
|355449 |seanbright|Use TRUNK_CALL_START as originally | |
| | |intended. | |
|--------+----------+------------------------------------+---------------|
| | |Only use maxtrunkcall and | |
|355467 |seanbright|maxnontrunkcall in chan_iax2 if | |
| | |IAX_OLD_FIND is specified. | |
|--------+----------+------------------------------------+---------------|
| | |When IAX2 debugging is enabled, make| |
|355530 |seanbright|sure to log 'apathetic' messages | |
| | |too. | |
|--------+----------+------------------------------------+---------------|
| | |Fix AMI Monitor action without File | |
|355575 |rmudgett |header converting channel name into | |
| | |filename. | |
|--------+----------+------------------------------------+---------------|
|355620 |rmudgett |Fix compile problem when old version|ASTERISK-19370 |
| | |of libvorbisfile v1.1.2 is used. | |
|--------+----------+------------------------------------+---------------|
| | |Revert a change to | |
|355623 |seanbright|audio_audiohook_write_list that had | |
| | |no affect. | |
|--------+----------+------------------------------------+---------------|
|355733 |mmichelson|Fix regressions with regards to |ASTERISK-19358 |
| | |route-set creation on early dialogs.| |
|--------+----------+------------------------------------+---------------|
| | |Pass the correct value to | |
|355747 |seanbright|ast_timer_set_rate() for IAX2 | |
| | |trunking. | |
|--------+----------+------------------------------------+---------------|
|355794 |seanbright|Don't allow trunkfreq to be greater | |
| | |than 1000ms. | |
|--------+----------+------------------------------------+---------------|
|355851 |alecdavis |push 'outgoing' flag from sig_XXX up|ASTERISK-19316 |
| | |to chan_dahdi | |
|--------+----------+------------------------------------+---------------|
|355895 |pabelanger|Fix -Werror=unused-but-set-variable | |
| | |compiler error (gcc 4.6.2) | |
|--------+----------+------------------------------------+---------------|
|355896 |pabelanger|Revert commit | |
|--------+----------+------------------------------------+---------------|
|355902 |seanbright|Set the length of the ast_sockaddr, | |
| | |so that we can set it's port later. | |
|--------+----------+------------------------------------+---------------|
|355905 |seanbright|Add some boilerplate documentation | |
| | |for IAXVAR and IAXPEER. | |
|--------+----------+------------------------------------+---------------|
|355950 |seanbright|Change some debug messages from | |
| | |LOG_DEBUG to ast_debug. | |
|--------+----------+------------------------------------+---------------|
|355953 |seanbright|This was a LOG_NOTICE, so roll it | |
| | |back. | |
|--------+----------+------------------------------------+---------------|
| | |Remove spurious warning when | |
|355998 |seanbright|'qualifyfreqnotok' is set |ASTERISK-17176 |
| | |successfully. | |
|--------+----------+------------------------------------+---------------|
|356074 |kmoore |Add missing newline to ccss state | |
| | |change notification | |
|--------+----------+------------------------------------+---------------|
| | |Make 'iax2 show callnumber usage' | |
|356108 |seanbright|output make sense when an IP is | |
| | |passed in. | |
|--------+----------+------------------------------------+---------------|
| | |Fix potential buffer overrun and |ASTERISK-19231,|
|356215 |mjordan |memory leak when executing "sip show|ASTERISK-19361 |
| | |peers" | |
|--------+----------+------------------------------------+---------------|
|356297 |twilson |Track module use count for | |
| | |res_calendar | |
|--------+----------+------------------------------------+---------------|
|356428 |pabelanger|Multiple revisions | |
| | |356290,356335,356337 | |
|--------+----------+------------------------------------+---------------|
|356431 |pabelanger|Fix -Werror=unused-but-set-variable | |
| | |compiler error (gcc 4.6.2) | |
|--------+----------+------------------------------------+---------------|
|356476 |mmichelson|Fix ACK routing for non-2xx |ASTERISK-19389 |
| | |responses. | |
|--------+----------+------------------------------------+---------------|
| | |Fix blind transfer parking issues if| |
|356522 |rmudgett |the dialed extension is not |ASTERISK-19322 |
| | |recognized as a parking extension. | |
+------------------------------------------------------------------------+
----------------------------------------------------------------------
Diffstat Results
[Back to Top]
This is a summary of the changes to the source code that went into this
release that was generated using the diffstat utility.
addons/chan_ooh323.c | 7
apps/app_confbridge.c | 8
apps/app_rpt.c | 69 +----
apps/app_voicemail.c | 23 -
autoconf/ast_c_declare_check.m4 | 31 ++
cel/cel_sqlite3_custom.c | 2
channels/chan_dahdi.c | 10
channels/chan_iax2.c | 62 +++--
channels/chan_sip.c | 115 +++++----
channels/sig_analog.c | 16 -
channels/sig_analog.h | 1
channels/sig_pri.c | 16 -
channels/sig_pri.h | 1
channels/sig_ss7.c | 14 -
channels/sig_ss7.h | 1
configs/cdr_sqlite3_custom.conf.sample | 8
configs/extconfig.conf.sample | 4
configs/iax.conf.sample | 3
configure.ac | 5
formats/format_ogg_vorbis.c | 399 +++++++++++----------------------
funcs/func_cdr.c | 4
include/asterisk/autoconfig.h.in | 16 -
include/asterisk/calendar.h | 2
main/audiohook.c | 4
main/ccss.c | 2
main/config.c | 4
main/features.c | 81 +++---
main/loader.c | 4
main/manager.c | 7
pbx/pbx_config.c | 10
pbx/pbx_spool.c | 41 ++-
res/res_calendar.c | 2
res/res_config_pgsql.c | 66 +++++
res/res_monitor.c | 22 +
34 files changed, 567 insertions(+), 493 deletions(-)
----------------------------------------------------------------------

View File

@@ -1,7 +1,7 @@
/*
* Asterisk -- An open source telephony toolkit.
*
* Copyright (C) 1999 - 2006, Digium, Inc.
* Copyright (C) 1999 - 2012, Digium, Inc.
*
* Mark Spencer <markster@digium.com>
*
@@ -373,6 +373,43 @@ static struct ast_channel_tech agent_tech = {
.set_base_channel = agent_set_base_channel,
};
/*!
* \brief Locks the owning channel for a LOCKED pvt while obeying locking order. The pvt
* must enter this function locked and will be returned locked, but this function will
* unlock the pvt for a short time, so it can't be used while expecting the pvt to remain
* static. If function returns a non NULL channel, it will need to be unlocked and
* unrefed once it is no longer needed.
*
* \param pvt Pointer to the LOCKED agent_pvt for which the owner is needed
* \ret locked channel which owns the pvt at the time of completion. NULL if not available.
*/
static struct ast_channel *agent_lock_owner(struct agent_pvt *pvt)
{
struct ast_channel *owner;
for (;;) {
if (!pvt->owner) { /* No owner. Nothing to do. */
return NULL;
}
/* If we don't ref the owner, it could be killed when we unlock the pvt. */
owner = ast_channel_ref(pvt->owner);
/* Locking order requires us to lock channel, then pvt. */
ast_mutex_unlock(&pvt->lock);
ast_channel_lock(owner);
ast_mutex_lock(&pvt->lock);
/* Check if owner changed during pvt unlock period */
if (owner != pvt->owner) { /* Channel changed. Unref and do another pass. */
ast_channel_unlock(owner);
owner = ast_channel_unref(owner);
} else { /* Channel stayed the same. Return it. */
return owner;
}
}
}
/*!
* Adds an agent to the global list of agents.
*
@@ -553,7 +590,11 @@ static struct ast_frame *agent_read(struct ast_channel *ast)
struct ast_frame *f = NULL;
static struct ast_frame answer_frame = { AST_FRAME_CONTROL, { AST_CONTROL_ANSWER } };
int cur_time = time(NULL);
struct ast_channel *owner;
ast_mutex_lock(&p->lock);
owner = agent_lock_owner(p);
CHECK_FORMATS(ast, p);
if (!p->start) {
p->start = cur_time;
@@ -583,13 +624,11 @@ static struct ast_frame *agent_read(struct ast_channel *ast)
int howlong = cur_time - p->start;
if (p->autologoff && (howlong >= p->autologoff)) {
ast_log(LOG_NOTICE, "Agent '%s' didn't answer/confirm within %d seconds (waited %d)\n", p->name, p->autologoff, howlong);
if (p->owner || p->chan) {
while (p->owner && ast_channel_trylock(p->owner)) {
DEADLOCK_AVOIDANCE(&p->lock);
}
if (p->owner) {
ast_softhangup(p->owner, AST_SOFTHANGUP_EXPLICIT);
ast_channel_unlock(p->owner);
if (owner || p->chan) {
if (owner) {
ast_softhangup(owner, AST_SOFTHANGUP_EXPLICIT);
ast_channel_unlock(owner);
owner = ast_channel_unref(owner);
}
while (p->chan && ast_channel_trylock(p->chan)) {
@@ -651,6 +690,11 @@ static struct ast_frame *agent_read(struct ast_channel *ast)
}
}
if (owner) {
ast_channel_unlock(owner);
owner = ast_channel_unref(owner);
}
CLEANUP(ast,p);
if (p->chan && !p->chan->_bridge) {
if (strcasecmp(p->chan->tech->type, "Local")) {
@@ -888,6 +932,14 @@ int agent_set_base_channel(struct ast_channel *chan, struct ast_channel *base)
static int agent_hangup(struct ast_channel *ast)
{
struct agent_pvt *p = ast->tech_pvt;
struct ast_channel *indicate_chan = NULL;
char *tmp_moh; /* moh buffer for indicating after unlocking p */
if (p->pending) {
AST_LIST_LOCK(&agents);
AST_LIST_REMOVE(&agents, p, list);
AST_LIST_UNLOCK(&agents);
}
ast_mutex_lock(&p->lock);
p->owner = NULL;
@@ -910,7 +962,7 @@ static int agent_hangup(struct ast_channel *ast)
if (p->start && (ast->_state != AST_STATE_UP)) {
p->start = 0;
} else
p->start = 0;
p->start = 0;
if (p->chan) {
p->chan->_bridge = NULL;
/* If they're dead, go ahead and hang up on the agent now */
@@ -919,15 +971,21 @@ static int agent_hangup(struct ast_channel *ast)
ast_softhangup(p->chan, AST_SOFTHANGUP_EXPLICIT);
ast_channel_unlock(p->chan);
} else if (p->loginstart) {
ast_channel_lock(p->chan);
ast_indicate_data(p->chan, AST_CONTROL_HOLD,
S_OR(p->moh, NULL),
!ast_strlen_zero(p->moh) ? strlen(p->moh) + 1 : 0);
ast_channel_unlock(p->chan);
indicate_chan = ast_channel_ref(p->chan);
tmp_moh = ast_strdupa(p->moh);
}
}
ast_mutex_unlock(&p->lock);
if (indicate_chan) {
ast_channel_lock(indicate_chan);
ast_indicate_data(indicate_chan, AST_CONTROL_HOLD,
S_OR(tmp_moh, NULL),
!ast_strlen_zero(tmp_moh) ? strlen(tmp_moh) + 1 : 0);
ast_channel_unlock(indicate_chan);
indicate_chan = ast_channel_unref(indicate_chan);
}
/* Only register a device state change if the agent is still logged in */
if (!p->loginstart) {
p->logincallerid[0] = '\0';
@@ -935,11 +993,6 @@ static int agent_hangup(struct ast_channel *ast)
ast_devstate_changed(AST_DEVICE_NOT_INUSE, "Agent/%s", p->agent);
}
if (p->pending) {
AST_LIST_LOCK(&agents);
AST_LIST_REMOVE(&agents, p, list);
AST_LIST_UNLOCK(&agents);
}
if (p->abouttograb) {
/* Let the "about to grab" thread know this isn't valid anymore, and let it
kill it later */
@@ -1492,6 +1545,8 @@ static force_inline int powerof(unsigned int d)
/*!
* Lists agents and their status to the Manager API.
* It is registered on load_module() and it gets called by the manager backend.
* This function locks both the pvt and the channel that owns it for a while, but
* does not keep these locks.
* \param s
* \param m
* \returns
@@ -1514,7 +1569,9 @@ static int action_agents(struct mansession *s, const struct message *m)
astman_send_ack(s, m, "Agents will follow");
AST_LIST_LOCK(&agents);
AST_LIST_TRAVERSE(&agents, p, list) {
ast_mutex_lock(&p->lock);
struct ast_channel *owner;
ast_mutex_lock(&p->lock);
owner = agent_lock_owner(p);
/* Status Values:
AGENT_LOGGEDOFF - Agent isn't logged in
@@ -1529,16 +1586,14 @@ static int action_agents(struct mansession *s, const struct message *m)
if (p->chan) {
loginChan = ast_strdupa(p->chan->name);
if (p->owner && p->owner->_bridge) {
if (owner && owner->_bridge) {
talkingto = S_COR(p->chan->caller.id.number.valid,
p->chan->caller.id.number.str, "n/a");
ast_channel_lock(p->owner);
if ((bridge = ast_bridged_channel(p->owner))) {
if ((bridge = ast_bridged_channel(owner))) {
talkingtoChan = ast_strdupa(bridge->name);
} else {
talkingtoChan = "n/a";
}
ast_channel_unlock(p->owner);
status = "AGENT_ONCALL";
} else {
talkingto = "n/a";
@@ -1552,6 +1607,11 @@ static int action_agents(struct mansession *s, const struct message *m)
status = "AGENT_LOGGEDOFF";
}
if (owner) {
ast_channel_unlock(owner);
owner = ast_channel_unref(owner);
}
astman_append(s, "Event: Agents\r\n"
"Agent: %s\r\n"
"Name: %s\r\n"
@@ -1583,14 +1643,14 @@ static int agent_logoff(const char *agent, int soft)
ret = 0;
if (p->owner || p->chan) {
if (!soft) {
struct ast_channel *owner;
ast_mutex_lock(&p->lock);
owner = agent_lock_owner(p);
while (p->owner && ast_channel_trylock(p->owner)) {
DEADLOCK_AVOIDANCE(&p->lock);
}
if (p->owner) {
ast_softhangup(p->owner, AST_SOFTHANGUP_EXPLICIT);
ast_channel_unlock(p->owner);
if (owner) {
ast_softhangup(owner, AST_SOFTHANGUP_EXPLICIT);
ast_channel_unlock(owner);
owner = ast_channel_unref(owner);
}
while (p->chan && ast_channel_trylock(p->chan)) {
@@ -1727,7 +1787,9 @@ static char *agents_show(struct ast_cli_entry *e, int cmd, struct ast_cli_args *
AST_LIST_LOCK(&agents);
AST_LIST_TRAVERSE(&agents, p, list) {
struct ast_channel *owner;
ast_mutex_lock(&p->lock);
owner = agent_lock_owner(p);
if (p->pending) {
if (p->group)
ast_cli(a->fd, "-- Pending call to group %d\n", powerof(p->group));
@@ -1740,10 +1802,11 @@ static char *agents_show(struct ast_cli_entry *e, int cmd, struct ast_cli_args *
username[0] = '\0';
if (p->chan) {
snprintf(location, sizeof(location), "logged in on %s", p->chan->name);
if (p->owner && ast_bridged_channel(p->owner))
if (owner && ast_bridged_channel(owner)) {
snprintf(talkingto, sizeof(talkingto), " talking to %s", ast_bridged_channel(p->owner)->name);
else
} else {
strcpy(talkingto, " is idle");
}
online_agents++;
} else {
strcpy(location, "not logged in");
@@ -1756,6 +1819,11 @@ static char *agents_show(struct ast_cli_entry *e, int cmd, struct ast_cli_args *
username, location, talkingto, music);
count_agents++;
}
if (owner) {
ast_channel_unlock(owner);
owner = ast_channel_unref(owner);
}
ast_mutex_unlock(&p->lock);
}
AST_LIST_UNLOCK(&agents);
@@ -1796,21 +1864,32 @@ static char *agents_show_online(struct ast_cli_entry *e, int cmd, struct ast_cli
AST_LIST_LOCK(&agents);
AST_LIST_TRAVERSE(&agents, p, list) {
struct ast_channel *owner;
agent_status = 0; /* reset it to offline */
ast_mutex_lock(&p->lock);
owner = agent_lock_owner(p);
if (!ast_strlen_zero(p->name))
snprintf(username, sizeof(username), "(%s) ", p->name);
else
username[0] = '\0';
if (p->chan) {
snprintf(location, sizeof(location), "logged in on %s", p->chan->name);
if (p->owner && ast_bridged_channel(p->owner))
snprintf(talkingto, sizeof(talkingto), " talking to %s", ast_bridged_channel(p->owner)->name);
else
if (owner && ast_bridged_channel(owner)) {
snprintf(talkingto, sizeof(talkingto), " talking to %s", ast_bridged_channel(owner)->name);
} else {
strcpy(talkingto, " is idle");
}
agent_status = 1;
online_agents++;
}
if (owner) {
ast_channel_unlock(owner);
owner = ast_channel_unref(owner);
}
if (!ast_strlen_zero(p->moh))
snprintf(music, sizeof(music), " (musiconhold is '%s')", p->moh);
if (agent_status)
@@ -2386,12 +2465,16 @@ static int agents_data_provider_get(const struct ast_data_search *search,
AST_LIST_LOCK(&agents);
AST_LIST_TRAVERSE(&agents, p, list) {
struct ast_channel *owner;
data_agent = ast_data_add_node(data_root, "agent");
if (!data_agent) {
continue;
}
ast_mutex_lock(&p->lock);
owner = agent_lock_owner(p);
if (!(p->pending)) {
ast_data_add_str(data_agent, "id", p->agent);
ast_data_add_structure(agent_pvt, data_agent, p);
@@ -2402,17 +2485,25 @@ static int agents_data_provider_get(const struct ast_data_search *search,
if (!data_channel) {
ast_mutex_unlock(&p->lock);
ast_data_remove_node(data_root, data_agent);
if (owner) {
ast_channel_unlock(owner);
owner = ast_channel_unref(owner);
}
continue;
}
ast_channel_data_add_structure(data_channel, p->chan, 0);
if (p->owner && ast_bridged_channel(p->owner)) {
if (owner && ast_bridged_channel(owner)) {
data_talkingto = ast_data_add_node(data_agent, "talkingto");
if (!data_talkingto) {
ast_mutex_unlock(&p->lock);
ast_data_remove_node(data_root, data_agent);
if (owner) {
ast_channel_unlock(owner);
owner = ast_channel_unref(owner);
}
continue;
}
ast_channel_data_add_structure(data_talkingto, ast_bridged_channel(p->owner), 0);
ast_channel_data_add_structure(data_talkingto, ast_bridged_channel(owner), 0);
}
} else {
ast_data_add_node(data_agent, "talkingto");
@@ -2420,6 +2511,12 @@ static int agents_data_provider_get(const struct ast_data_search *search,
}
ast_data_add_str(data_agent, "musiconhold", p->moh);
}
if (owner) {
ast_channel_unlock(owner);
owner = ast_channel_unref(owner);
}
ast_mutex_unlock(&p->lock);
/* if this agent doesn't match remove the added agent. */

View File

@@ -1283,7 +1283,7 @@ static int auto_congest(const void *arg);
static struct sip_pvt *find_call(struct sip_request *req, struct ast_sockaddr *addr, const int intended_method);
static void free_old_route(struct sip_route *route);
static void list_route(struct sip_route *route);
static void build_route(struct sip_pvt *p, struct sip_request *req, int backwards);
static void build_route(struct sip_pvt *p, struct sip_request *req, int backwards, int resp);
static enum check_auth_result register_verify(struct sip_pvt *p, struct ast_sockaddr *addr,
struct sip_request *req, const char *uri);
static struct sip_pvt *get_sip_pvt_byid_locked(const char *callid, const char *totag, const char *fromtag);
@@ -3882,6 +3882,7 @@ static int __sip_autodestruct(const void *data)
ast_channel_unref(owner);
} else if (p->refer && !p->alreadygone) {
ast_debug(3, "Finally hanging up channel after transfer: %s\n", p->callid);
stop_media_flows(p);
transmit_request_with_auth(p, SIP_BYE, 0, XMIT_RELIABLE, 1);
append_history(p, "ReferBYE", "Sending BYE on transferer call leg %s", p->callid);
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
@@ -8022,7 +8023,7 @@ static void forked_invite_init(struct sip_request *req, const char *new_theirtag
ast_string_field_set(p, our_contact, original->our_contact);
ast_string_field_set(p, fullcontact, original->fullcontact);
parse_ok_contact(p, req);
build_route(p, req, 1);
build_route(p, req, 1, 0);
transmit_request(p, SIP_ACK, p->ocseq, XMIT_UNRELIABLE, TRUE);
transmit_request(p, SIP_BYE, 0, XMIT_RELIABLE, TRUE);
@@ -9310,6 +9311,10 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
/* Ensure RTCP is enabled since it may be inactive
if we're coming back from a T.38 session */
ast_rtp_instance_set_prop(p->rtp, AST_RTP_PROPERTY_RTCP, 1);
/* Ensure audio RTCP reads are enabled */
if (p->owner) {
ast_channel_set_fd(p->owner, 1, ast_rtp_instance_fd(p->rtp, 1));
}
if (ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_AUTO) {
ast_clear_flag(&p->flags[0], SIP_DTMF);
@@ -9326,6 +9331,10 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req, int t38action
} else if (udptlportno > 0) {
if (debug)
ast_verbose("Got T.38 Re-invite without audio. Keeping RTP active during T.38 session.\n");
/* Prevent audio RTCP reads */
if (p->owner) {
ast_channel_set_fd(p->owner, 1, -1);
}
/* Silence RTCP while audio RTP is inactive */
ast_rtp_instance_set_prop(p->rtp, AST_RTP_PROPERTY_RTCP, 0);
} else {
@@ -10464,7 +10473,15 @@ static int reqprep(struct sip_request *req, struct sip_pvt *p, int sipmethod, in
snprintf(tmp, sizeof(tmp), "%d %s", seqno, sip_methods[sipmethod].text);
add_header(req, "Via", p->via);
if (p->route) {
/*
* Use the learned route set unless this is a CANCEL on an ACK for a non-2xx
* final response. For a CANCEL or ACK, we have to send to the same destination
* as the original INVITE.
*/
if (sipmethod == SIP_CANCEL ||
(sipmethod == SIP_ACK && (p->invitestate == INV_COMPLETED || p->invitestate == INV_CANCELLED))) {
set_destination(p, ast_strdupa(p->uri));
} else if (p->route) {
set_destination(p, p->route->hop);
add_route(req, is_strict ? p->route->next : p->route);
}
@@ -13699,15 +13716,15 @@ static int transmit_request(struct sip_pvt *p, int sipmethod, int seqno, enum xm
{
struct sip_request resp;
if (sipmethod == SIP_ACK) {
p->invitestate = INV_CONFIRMED;
}
reqprep(&resp, p, sipmethod, seqno, newbranch);
if (sipmethod == SIP_CANCEL && p->answered_elsewhere) {
add_header(&resp, "Reason", "SIP;cause=200;text=\"Call completed elsewhere\"");
}
if (sipmethod == SIP_ACK) {
p->invitestate = INV_CONFIRMED;
}
return send_request(p, &resp, reliable, seqno ? seqno : p->ocseq);
}
@@ -14276,8 +14293,9 @@ static void list_route(struct sip_route *route)
}
}
/*! \brief Build route list from Record-Route header */
static void build_route(struct sip_pvt *p, struct sip_request *req, int backwards)
/*! \brief Build route list from Record-Route header
\param resp the SIP response code or 0 for a request */
static void build_route(struct sip_pvt *p, struct sip_request *req, int backwards, int resp)
{
struct sip_route *thishop, *head, *tail;
int start = 0;
@@ -14295,8 +14313,11 @@ static void build_route(struct sip_pvt *p, struct sip_request *req, int backward
p->route = NULL;
}
/* We only want to create the route set the first time this is called */
p->route_persistent = 1;
/* We only want to create the route set the first time this is called except
it is called from a provisional response.*/
if ((resp < 100) || (resp > 199)) {
p->route_persistent = 1;
}
/* Build a tailq, then assign it to p->route when done.
* If backwards, we add entries from the head so they end up
@@ -19015,7 +19036,8 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
/* Need to check the media/type */
if (!strcasecmp(c, "application/dtmf-relay") ||
!strcasecmp(c, "application/vnd.nortelnetworks.digits")) {
!strcasecmp(c, "application/vnd.nortelnetworks.digits") ||
!strcasecmp(c, "application/dtmf")) {
unsigned int duration = 0;
if (!p->owner) { /* not a PBX call */
@@ -19024,44 +19046,55 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
return;
}
/* Try getting the "signal=" part */
if (ast_strlen_zero(c = get_body(req, "Signal", '=')) && ast_strlen_zero(c = get_body(req, "d", '='))) {
ast_log(LOG_WARNING, "Unable to retrieve DTMF signal from INFO message from %s\n", p->callid);
transmit_response(p, "200 OK", req); /* Should return error */
return;
/* If dtmf-relay or vnd.nortelnetworks.digits, parse the signal and duration;
* otherwise use the body as the signal */
if (strcasecmp(c, "application/dtmf")) {
const char *msg_body;
if ( ast_strlen_zero(msg_body = get_body(req, "Signal", '='))
&& ast_strlen_zero(msg_body = get_body(req, "d", '='))) {
ast_log(LOG_WARNING, "Unable to retrieve DTMF signal for INFO message on "
"call %s\n", p->callid);
transmit_response(p, "200 OK", req);
return;
}
ast_copy_string(buf, msg_body, sizeof(buf));
if (!ast_strlen_zero((msg_body = get_body(req, "Duration", '=')))) {
sscanf(msg_body, "%30u", &duration);
}
} else {
ast_copy_string(buf, c, sizeof(buf));
/* Type is application/dtmf, simply use what's in the message body */
get_msg_text(buf, sizeof(buf), req);
}
if (!ast_strlen_zero((c = get_body(req, "Duration", '=')))) {
duration = atoi(c);
}
if (!duration) {
duration = 100; /* 100 ms */
}
/* An empty message body requires us to send a 200 OK */
if (ast_strlen_zero(buf)) {
transmit_response(p, "200 OK", req);
return;
}
if ('0' <= buf[0] && buf[0] <= '9') {
event = buf[0] - '0';
} else if (buf[0] == '*') {
if (!duration) {
duration = 100; /* 100 ms */
}
if (buf[0] == '*') {
event = 10;
} else if (buf[0] == '#') {
event = 11;
} else if (buf[0] == '!') {
event = 16;
} else if ('A' <= buf[0] && buf[0] <= 'D') {
event = 12 + buf[0] - 'A';
} else if ('a' <= buf[0] && buf[0] <= 'd') {
event = 12 + buf[0] - 'a';
} else if (buf[0] == '!') {
event = 16;
} else {
/* Unknown digit */
event = 0;
} else if ((sscanf(buf, "%30u", &event) != 1) || event > 16) {
ast_log(AST_LOG_WARNING, "Unable to convert DTMF event signal code to a valid "
"value for INFO message on call %s\n", p->callid);
transmit_response(p, "200 OK", req);
return;
}
if (event == 16) {
/* send a FLASH event */
struct ast_frame f = { AST_FRAME_CONTROL, { AST_CONTROL_FLASH, } };
@@ -19078,56 +19111,8 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
f.subclass.integer = '*';
} else if (event == 11) {
f.subclass.integer = '#';
} else if (event < 16) {
f.subclass.integer = 'A' + (event - 12);
}
f.len = duration;
ast_queue_frame(p->owner, &f);
if (sipdebug) {
ast_verbose("* DTMF-relay event received: %c\n", (int) f.subclass.integer);
}
}
transmit_response(p, "200 OK", req);
return;
} else if (!strcasecmp(c, "application/dtmf")) {
/*! \todo Note: Doesn't read the duration of the DTMF. Should be fixed. */
unsigned int duration = 0;
if (!p->owner) { /* not a PBX call */
transmit_response(p, "481 Call leg/transaction does not exist", req);
sip_scheddestroy(p, DEFAULT_TRANS_TIMEOUT);
return;
}
get_msg_text(buf, sizeof(buf), req);
duration = 100; /* 100 ms */
if (ast_strlen_zero(buf)) {
transmit_response(p, "200 OK", req);
return;
}
event = atoi(buf);
if (event == 16) {
/* send a FLASH event */
struct ast_frame f = { AST_FRAME_CONTROL, { AST_CONTROL_FLASH }, };
ast_queue_frame(p->owner, &f);
if (sipdebug) {
ast_verbose("* DTMF-relay event received: FLASH\n");
}
} else {
/* send a DTMF event */
struct ast_frame f = { AST_FRAME_DTMF, };
if (event < 10) {
f.subclass.integer = '0' + event;
} else if (event == 10) {
f.subclass.integer = '*';
} else if (event == 11) {
f.subclass.integer = '#';
} else if (event < 16) {
f.subclass.integer = 'A' + (event - 12);
} else {
/* Unknown digit. */
f.subclass.integer = '0';
f.subclass.integer = 'A' + (event - 12);
}
f.len = duration;
ast_queue_frame(p->owner, &f);
@@ -19137,7 +19122,6 @@ static void handle_request_info(struct sip_pvt *p, struct sip_request *req)
}
transmit_response(p, "200 OK", req);
return;
} else if (!strcasecmp(c, "application/media_control+xml")) {
/* Eh, we'll just assume it's a fast picture update for now */
if (p->owner) {
@@ -20316,7 +20300,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
* */
parse_ok_contact(p, req);
if (!reinvite) {
build_route(p, req, 1);
build_route(p, req, 1, resp);
}
if (!req->ignore && p->owner) {
if (get_rpid(p, req)) {
@@ -20366,7 +20350,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
* */
parse_ok_contact(p, req);
if (!reinvite) {
build_route(p, req, 1);
build_route(p, req, 1, resp);
}
if (!req->ignore && p->owner) {
struct ast_party_redirecting redirecting;
@@ -20392,7 +20376,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
* */
parse_ok_contact(p, req);
if (!reinvite) {
build_route(p, req, 1);
build_route(p, req, 1, resp);
}
if (!req->ignore && p->owner) {
if (get_rpid(p, req)) {
@@ -20492,7 +20476,7 @@ static void handle_response_invite(struct sip_pvt *p, int resp, const char *rest
parse_ok_contact(p, req);
/* Save Record-Route for any later requests we make on this dialogue */
if (!reinvite)
build_route(p, req, 1);
build_route(p, req, 1, resp);
if(set_address_from_contact(p)) {
/* Bad contact - we don't know how to reach this device */
@@ -20714,15 +20698,22 @@ static void handle_response_notify(struct sip_pvt *p, int resp, const char *rest
case 200: /* Notify accepted */
/* They got the notify, this is the end */
if (p->owner) {
if (!p->refer) {
ast_log(LOG_WARNING, "Notify answer on an owned channel? - %s\n", p->owner->name);
ast_queue_hangup_with_cause(p->owner, AST_CAUSE_NORMAL_UNSPECIFIED);
if (p->refer) {
ast_log(LOG_NOTICE, "Got OK on REFER Notify message\n");
} else {
ast_debug(4, "Got OK on REFER Notify message\n");
ast_log(LOG_WARNING, "Notify answer on an owned channel? - %s\n", p->owner->name);
/*
* XXX There is discrepancy on whether a hangup should be queued
* or not. This code used to be duplicated in two places, and the more
* frequently hit area had this disabled, making it the de facto
* "correct" way to go.
*
* ast_queue_hangup_with_cause(p->owner, AST_CAUSE_NORMAL_UNSPECIFIED);
*/
}
} else {
if (p->subscribed == NONE) {
ast_debug(4, "Got 200 accepted on NOTIFY\n");
if (p->subscribed == NONE && !p->refer) {
ast_debug(4, "Got 200 accepted on NOTIFY %s\n", p->callid);
pvt_set_needdestroy(p, "received 200 response");
}
if (ast_test_flag(&p->flags[1], SIP_PAGE2_STATECHANGEQUEUE)) {
@@ -20747,6 +20738,9 @@ static void handle_response_notify(struct sip_pvt *p, int resp, const char *rest
pvt_set_needdestroy(p, "failed to authenticate NOTIFY");
}
break;
case 481: /* Call leg does not exist */
pvt_set_needdestroy(p, "Received 481 response for NOTIFY");
break;
}
}
@@ -21389,6 +21383,9 @@ static void handle_response(struct sip_pvt *p, int resp, const char *rest, struc
} else if (sipmethod == SIP_MESSAGE) {
/* More good gravy! */
handle_response_message(p, resp, rest, req, seqno);
} else if (sipmethod == SIP_NOTIFY) {
/* The gravy train continues to roll */
handle_response_notify(p, resp, rest, req, seqno);
} else if (ast_test_flag(&p->flags[0], SIP_OUTGOING)) {
switch(resp) {
case 100: /* 100 Trying */
@@ -21404,8 +21401,6 @@ static void handle_response(struct sip_pvt *p, int resp, const char *rest, struc
p->authtries = 0; /* Reset authentication counter */
if (sipmethod == SIP_INVITE) {
handle_response_invite(p, resp, rest, req, seqno);
} else if (sipmethod == SIP_NOTIFY) {
handle_response_notify(p, resp, rest, req, seqno);
} else if (sipmethod == SIP_REGISTER) {
handle_response_register(p, resp, rest, req, seqno);
} else if (sipmethod == SIP_SUBSCRIBE) {
@@ -21420,8 +21415,6 @@ static void handle_response(struct sip_pvt *p, int resp, const char *rest, struc
case 407: /* Proxy auth required */
if (sipmethod == SIP_INVITE)
handle_response_invite(p, resp, rest, req, seqno);
else if (sipmethod == SIP_NOTIFY)
handle_response_notify(p, resp, rest, req, seqno);
else if (sipmethod == SIP_SUBSCRIBE)
handle_response_subscribe(p, resp, rest, req, seqno);
else if (p->registry && sipmethod == SIP_REGISTER)
@@ -21496,8 +21489,6 @@ static void handle_response(struct sip_pvt *p, int resp, const char *rest, struc
handle_response_invite(p, resp, rest, req, seqno);
} else if (sipmethod == SIP_SUBSCRIBE) {
handle_response_subscribe(p, resp, rest, req, seqno);
} else if (sipmethod == SIP_NOTIFY) {
pvt_set_needdestroy(p, "received 481 response");
} else if (sipmethod == SIP_BYE) {
/* The other side has no transaction to bye,
just assume it's all right then */
@@ -21658,24 +21649,6 @@ static void handle_response(struct sip_pvt *p, int resp, const char *rest, struc
ast_debug(1, "Got 200 OK on CANCEL\n");
/* Wait for 487, then destroy */
} else if (sipmethod == SIP_NOTIFY) {
/* They got the notify, this is the end */
if (p->owner) {
if (p->refer) {
ast_debug(1, "Got 200 OK on NOTIFY for transfer\n");
} else
ast_log(LOG_WARNING, "Notify answer on an owned channel?\n");
/* ast_queue_hangup(p->owner); Disabled */
} else {
if (!p->subscribed && !p->refer) {
pvt_set_needdestroy(p, "transaction completed");
}
if (ast_test_flag(&p->flags[1], SIP_PAGE2_STATECHANGEQUEUE)) {
/* Ready to send the next state we have on queue */
ast_clear_flag(&p->flags[1], SIP_PAGE2_STATECHANGEQUEUE);
cb_extensionstate((char *)p->context, (char *)p->exten, p->laststate, (void *) p);
}
}
} else if (sipmethod == SIP_BYE) {
pvt_set_needdestroy(p, "transaction completed");
}
@@ -21697,8 +21670,6 @@ static void handle_response(struct sip_pvt *p, int resp, const char *rest, struc
handle_response_invite(p, resp, rest, req, seqno);
} else if (sipmethod == SIP_BYE) {
pvt_set_needdestroy(p, "received 481 response");
} else if (sipmethod == SIP_NOTIFY) {
pvt_set_needdestroy(p, "received 481 response");
} else if (sipdebug) {
ast_debug(1, "Remote host can't match request %s to call '%s'. Giving up\n", sip_methods[sipmethod].text, p->callid);
}
@@ -23090,7 +23061,7 @@ static int handle_request_invite(struct sip_pvt *p, struct sip_request *req, int
*recount = 1;
/* Save Record-Route for any later requests we make on this dialogue */
build_route(p, req, 0);
build_route(p, req, 0, 0);
if (c) {
ast_party_redirecting_init(&redirecting);
@@ -25055,7 +25026,7 @@ static int handle_request_subscribe(struct sip_pvt *p, struct sip_request *req,
if (sipdebug)
ast_debug(4, "Initializing initreq for method %s - callid %s\n", sip_methods[req->method].text, p->callid);
check_via(p, req);
build_route(p, req, 0);
build_route(p, req, 0, 0);
} else if (req->debug && req->ignore)
ast_verbose("Ignoring this SUBSCRIBE request\n");
@@ -30103,6 +30074,12 @@ static int setup_srtp(struct sip_srtp **srtp)
static int process_crypto(struct sip_pvt *p, struct ast_rtp_instance *rtp, struct sip_srtp **srtp, const char *a)
{
/* If no RTP instance exists for this media stream don't bother processing the crypto line */
if (!rtp) {
ast_debug(3, "Received offer with crypto line for media stream that is not enabled\n");
return FALSE;
}
if (strncasecmp(a, "crypto:", 7)) {
return FALSE;
}

View File

@@ -25,3 +25,10 @@ rtpend=20000
; do not come from the source of the RTP stream. This option is
; enabled by default.
; strictrtp=yes
;
; Number of packets containing consecutive sequence values needed
; to change the RTP source socket address. This option only comes
; into play while using strictrtp=yes. Consider changing this value
; if rtp packets are dropped from one or both ends after a call is
; connected. This option is set to 4 by default.
; probation=8

View File

@@ -4110,6 +4110,17 @@ int ast_bridge_call(struct ast_channel *chan, struct ast_channel *peer, struct a
if (!f || (f->frametype == AST_FRAME_CONTROL &&
(f->subclass.integer == AST_CONTROL_HANGUP || f->subclass.integer == AST_CONTROL_BUSY ||
f->subclass.integer == AST_CONTROL_CONGESTION))) {
/*
* If the bridge was broken for a hangup that isn't real, then
* then don't run the h extension, because the channel isn't
* really hung up. This should really only happen with AST_SOFTHANGUP_ASYNCGOTO,
* but it doesn't hurt to check AST_SOFTHANGUP_UNBRIDGE either.
*/
ast_channel_lock(chan);
if (chan->_softhangup & (AST_SOFTHANGUP_ASYNCGOTO | AST_SOFTHANGUP_UNBRIDGE)) {
ast_set_flag(chan, AST_FLAG_BRIDGE_HANGUP_DONT);
}
ast_channel_unlock(chan);
res = -1;
break;
}

View File

@@ -1012,6 +1012,7 @@ int ast_streamfile(struct ast_channel *chan, const char *filename, const char *p
struct ast_filestream *fs;
struct ast_filestream *vfs=NULL;
char fmt[256];
off_t pos;
int seekattempt;
int res;
@@ -1024,12 +1025,17 @@ int ast_streamfile(struct ast_channel *chan, const char *filename, const char *p
/* check to see if there is any data present (not a zero length file),
* done this way because there is no where for ast_openstream_full to
* return the file had no data. */
seekattempt = fseek(fs->f, -1, SEEK_END);
if (seekattempt && errno == EINVAL) {
/* Zero-length file, as opposed to a pipe */
return 0;
pos = ftello(fs->f);
seekattempt = fseeko(fs->f, -1, SEEK_END);
if (seekattempt) {
if (errno == EINVAL) {
/* Zero-length file, as opposed to a pipe */
return 0;
} else {
ast_seekstream(fs, 0, SEEK_SET);
}
} else {
ast_seekstream(fs, 0, SEEK_SET);
fseeko(fs->f, pos, SEEK_SET);
}
vfs = ast_openvstream(chan, filename, preflang);

View File

@@ -80,6 +80,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
#define ZFONE_PROFILE_ID 0x505a
#define DEFAULT_LEARNING_MIN_SEQUENTIAL 4
extern struct ast_srtp_res *res_srtp;
static int dtmftimeout = DEFAULT_DTMF_TIMEOUT;
@@ -96,7 +98,8 @@ static int rtcpdebugport; /*< Debug only RTCP packets from IP or IP+Port if por
#ifdef SO_NO_CHECK
static int nochecksums;
#endif
static int strictrtp;
static int strictrtp; /*< Only accept RTP frames from a defined source. If we receive an indication of a changing source, enter learning mode. */
static int learning_min_sequential; /*< Number of sequential RTP frames needed from a single source during learning mode to accept new source. */
enum strict_rtp_state {
STRICT_RTP_OPEN = 0, /*! No RTP packets should be dropped, all sources accepted */
@@ -176,6 +179,13 @@ struct ast_rtp {
struct ast_sockaddr strict_rtp_address; /*!< Remote address information for strict RTP purposes */
struct ast_sockaddr alt_rtp_address; /*!<Alternate remote address information */
/*
* Learning mode values based on pjmedia's probation mode. Many of these values are redundant to the above,
* but these are in place to keep learning mode sequence values sealed from their normal counterparts.
*/
uint16_t learning_max_seq; /*!< Highest sequence number heard */
int learning_probation; /*!< Sequential packets untill source is valid */
struct rtp_red *red;
};
@@ -460,6 +470,50 @@ static int create_new_socket(const char *type, int af)
return sock;
}
/*!
* \internal
* \brief Initializes sequence values and probation for learning mode.
* \note This is an adaptation of pjmedia's pjmedia_rtp_seq_init function.
*
* \param rtp pointer to rtp struct used with the received rtp packet.
* \param seq sequence number read from the rtp header
*/
static void rtp_learning_seq_init(struct ast_rtp *rtp, uint16_t seq)
{
rtp->learning_max_seq = seq - 1;
rtp->learning_probation = learning_min_sequential;
}
/*!
* \internal
* \brief Updates sequence information for learning mode and determines if probation/learning mode should remain in effect.
* \note This function was adapted from pjmedia's pjmedia_rtp_seq_update function.
*
* \param rtp pointer to rtp struct used with the received rtp packet.
* \param seq sequence number read from the rtp header
* \return boolean value indicating if probation mode is active at the end of the function
*/
static int rtp_learning_rtp_seq_update(struct ast_rtp *rtp, uint16_t seq)
{
int probation = 1;
ast_debug(1, "%p -- probation = %d, seq = %d\n", rtp, rtp->learning_probation, seq);
if (seq == rtp->learning_max_seq + 1) {
/* packet is in sequence */
rtp->learning_probation--;
rtp->learning_max_seq = seq;
if (rtp->learning_probation == 0) {
probation = 0;
}
} else {
rtp->learning_probation = learning_min_sequential - 1;
rtp->learning_max_seq = seq;
}
return probation;
}
static int ast_rtp_new(struct ast_rtp_instance *instance,
struct ast_sched_context *sched, struct ast_sockaddr *addr,
void *data)
@@ -476,6 +530,9 @@ static int ast_rtp_new(struct ast_rtp_instance *instance,
rtp->ssrc = ast_random();
rtp->seqno = ast_random() & 0xffff;
rtp->strict_rtp_state = (strictrtp ? STRICT_RTP_LEARN : STRICT_RTP_OPEN);
if (strictrtp) {
rtp_learning_seq_init(rtp, (uint16_t)rtp->seqno);
}
/* Create a new socket for us to listen on and use */
if ((rtp->s =
@@ -2082,7 +2139,17 @@ static struct ast_frame *ast_rtp_read(struct ast_rtp_instance *instance, int rtc
/* If strict RTP protection is enabled see if we need to learn the remote address or if we need to drop the packet */
if (rtp->strict_rtp_state == STRICT_RTP_LEARN) {
ast_debug(1, "%p -- start learning mode pass with addr = %s\n", rtp, ast_sockaddr_stringify(&addr));
/* For now, we always copy the address. */
ast_sockaddr_copy(&rtp->strict_rtp_address, &addr);
/* Send the rtp and the seqno from header to rtp_learning_rtp_seq_update to see whether we can exit or not*/
if (rtp_learning_rtp_seq_update(rtp, ntohl(rtpheader[0]))) {
ast_debug(1, "%p -- Condition for learning hasn't exited, so reject the frame.\n", rtp);
return &ast_null_frame;
}
ast_debug(1, "%p -- Probation Ended. Set strict_rtp_state to STRICT_RTP_CLOSED with address %s\n", rtp, ast_sockaddr_stringify(&addr));
rtp->strict_rtp_state = STRICT_RTP_CLOSED;
} else if (rtp->strict_rtp_state == STRICT_RTP_CLOSED) {
if (ast_sockaddr_cmp(&rtp->strict_rtp_address, &addr)) {
@@ -2497,6 +2564,7 @@ static void ast_rtp_remote_address_set(struct ast_rtp_instance *instance, struct
if (strictrtp) {
rtp->strict_rtp_state = STRICT_RTP_LEARN;
rtp_learning_seq_init(rtp, rtp->seqno);
}
return;
@@ -2884,6 +2952,7 @@ static int rtp_reload(int reload)
rtpend = DEFAULT_RTP_END;
dtmftimeout = DEFAULT_DTMF_TIMEOUT;
strictrtp = STRICT_RTP_CLOSED;
learning_min_sequential = DEFAULT_LEARNING_MIN_SEQUENTIAL;
if (cfg) {
if ((s = ast_variable_retrieve(cfg, "general", "rtpstart"))) {
rtpstart = atoi(s);
@@ -2927,6 +2996,12 @@ static int rtp_reload(int reload)
if ((s = ast_variable_retrieve(cfg, "general", "strictrtp"))) {
strictrtp = ast_true(s);
}
if ((s = ast_variable_retrieve(cfg, "general", "probation"))) {
if ((sscanf(s, "%d", &learning_min_sequential) <= 0) || learning_min_sequential <= 0) {
ast_log(LOG_WARNING, "Value for 'probation' could not be read, using default of '%d' instead\n",
DEFAULT_LEARNING_MIN_SEQUENTIAL);
}
}
ast_config_destroy(cfg);
}
if (rtpstart >= rtpend) {