aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-05-30 13:01:05 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2008-05-30 13:01:05 +0000
commitf3e6a796a33ba194eaca27c3491f4bc80d14a569 (patch)
tree6599d445875a56a1651579894e3f9efb10cb46f2 /channels
parentb70b1e8aacb4ea9d0c7ee06b6d9ab1b130fa565b (diff)
Merged revisions 119239 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r119239 | russell | 2008-05-30 07:59:11 -0500 (Fri, 30 May 2008) | 23 lines Merged revisions 119238 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ................ r119238 | russell | 2008-05-30 07:55:36 -0500 (Fri, 30 May 2008) | 15 lines Merged revisions 119237 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.2 ........ r119237 | russell | 2008-05-30 07:49:39 -0500 (Fri, 30 May 2008) | 7 lines - Instead of only enforcing destination call number checking on an ACK, check all full frames except for PING and LAGRQ, which may be sent by older versions too quickly to contain the destination call number. (As suggested by Tim Panton on the asterisk-dev list) - Merge changes from team/russell/iax2-frame-race, which prevents PING and LAGRQ from being sent before the destination call number is known. ........ ................ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.0@119240 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_iax2.c44
1 files changed, 37 insertions, 7 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index 3474ec98f..0ae575635 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -1133,12 +1133,19 @@ static int send_ping(const void *data);
static void __send_ping(const void *data)
{
- int callno = (long)data;
+ int callno = (long) data;
+
ast_mutex_lock(&iaxsl[callno]);
- if (iaxs[callno] && iaxs[callno]->pingid != -1) {
+
+ while (iaxs[callno] && iaxs[callno]->pingid != -1) {
+ if (!iaxs[callno]->peercallno) {
+ break;
+ }
send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_PING, 0, NULL, 0, -1);
iaxs[callno]->pingid = iax2_sched_add(sched, ping_time * 1000, send_ping, data);
+ break;
}
+
ast_mutex_unlock(&iaxsl[callno]);
}
@@ -1167,13 +1174,19 @@ static int send_lagrq(const void *data);
static void __send_lagrq(const void *data)
{
- int callno = (long)data;
- /* Ping only if it's real not if it's bridged */
+ int callno = (long) data;
+
ast_mutex_lock(&iaxsl[callno]);
- if (iaxs[callno] && iaxs[callno]->lagid > -1) {
+
+ while (iaxs[callno] && iaxs[callno]->lagid > -1) {
+ if (!iaxs[callno]->peercallno) {
+ break;
+ }
send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_LAGRQ, 0, NULL, 0, -1);
iaxs[callno]->lagid = iax2_sched_add(sched, lagrq_time * 1000, send_lagrq, data);
+ break;
}
+
ast_mutex_unlock(&iaxsl[callno]);
}
@@ -7936,8 +7949,25 @@ static int socket_process(struct iax2_thread *thread)
}
if (!fr->callno) {
- fr->callno = find_callno(ntohs(mh->callno) & ~IAX_FLAG_FULL, dcallno, &sin, new, fd,
- (ntohs(mh->callno) & IAX_FLAG_FULL) && f.frametype == AST_FRAME_IAX && f.subclass == IAX_COMMAND_ACK);
+ int check_dcallno = 0;
+
+ /*
+ * We enforce accurate destination call numbers for all full frames except
+ * LAGRQ and PING commands. This is because older versions of Asterisk
+ * schedule these commands to get sent very quickly, and they will sometimes
+ * be sent before they receive the first frame from the other side. When
+ * that happens, it doesn't contain the destination call number. However,
+ * not checking it for these frames is safe.
+ *
+ * Discussed in the following thread:
+ * http://lists.digium.com/pipermail/asterisk-dev/2008-May/033217.html
+ */
+
+ if (ntohs(mh->callno) & IAX_FLAG_FULL) {
+ check_dcallno = f.frametype == AST_FRAME_IAX ? (f.subclass != IAX_COMMAND_PING && f.subclass != IAX_COMMAND_LAGRQ) : 1;
+ }
+
+ fr->callno = find_callno(ntohs(mh->callno) & ~IAX_FLAG_FULL, dcallno, &sin, new, fd, check_dcallno);
}
if (fr->callno > 0)