|
|
|
@ -806,15 +806,27 @@ static const struct ast_channel_tech iax2_tech = {
|
|
|
|
|
static int send_ping(void *data)
|
|
|
|
|
{
|
|
|
|
|
int callno = (long)data;
|
|
|
|
|
int res = 0;
|
|
|
|
|
|
|
|
|
|
/* Ping only if it's real, not if it's bridged */
|
|
|
|
|
if (iaxs[callno]) {
|
|
|
|
|
|
|
|
|
|
ast_mutex_lock(&iaxsl[callno]);
|
|
|
|
|
|
|
|
|
|
while (iaxs[callno]) {
|
|
|
|
|
res = 1;
|
|
|
|
|
if (!iaxs[callno]->peercallno) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
#ifdef BRIDGE_OPTIMIZATION
|
|
|
|
|
if (!iaxs[callno]->bridgecallno)
|
|
|
|
|
#endif
|
|
|
|
|
send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_PING, 0, NULL, 0, -1);
|
|
|
|
|
return 1;
|
|
|
|
|
} else
|
|
|
|
|
return 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ast_mutex_unlock(&iaxsl[callno]);
|
|
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static int get_encrypt_methods(const char *s)
|
|
|
|
@ -832,15 +844,27 @@ static int get_encrypt_methods(const char *s)
|
|
|
|
|
static int send_lagrq(void *data)
|
|
|
|
|
{
|
|
|
|
|
int callno = (long)data;
|
|
|
|
|
int res = 0;
|
|
|
|
|
|
|
|
|
|
/* Ping only if it's real not if it's bridged */
|
|
|
|
|
if (iaxs[callno]) {
|
|
|
|
|
|
|
|
|
|
ast_mutex_lock(&iaxsl[callno]);
|
|
|
|
|
|
|
|
|
|
while (iaxs[callno]) {
|
|
|
|
|
res = 1;
|
|
|
|
|
if (!iaxs[callno]->peercallno) {
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
#ifdef BRIDGE_OPTIMIZATION
|
|
|
|
|
if (!iaxs[callno]->bridgecallno)
|
|
|
|
|
#endif
|
|
|
|
|
send_command(iaxs[callno], AST_FRAME_IAX, IAX_COMMAND_LAGRQ, 0, NULL, 0, -1);
|
|
|
|
|
return 1;
|
|
|
|
|
} else
|
|
|
|
|
return 0;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ast_mutex_unlock(&iaxsl[callno]);
|
|
|
|
|
|
|
|
|
|
return res;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static unsigned char compress_subclass(int subclass)
|
|
|
|
@ -6814,9 +6838,27 @@ static int socket_read(int *id, int fd, short events, void *cbdata)
|
|
|
|
|
f.subclass = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!fr->callno)
|
|
|
|
|
fr->callno = find_callno(ntohs(mh->callno) & ~IAX_FLAG_FULL, dcallno, &sin, new, 1, fd,
|
|
|
|
|
(ntohs(mh->callno) & IAX_FLAG_FULL) && f.frametype == AST_FRAME_IAX && f.subclass == IAX_COMMAND_ACK);
|
|
|
|
|
if (!fr->callno) {
|
|
|
|
|
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, 1, fd, check_dcallno);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (fr->callno > 0)
|
|
|
|
|
ast_mutex_lock(&iaxsl[fr->callno]);
|
|
|
|
|