|
|
|
@ -1474,13 +1474,13 @@ static struct iax_frame *iaxfrdup2(struct iax_frame *fr)
|
|
|
|
|
#define NEW_ALLOW 1
|
|
|
|
|
#define NEW_FORCE 2
|
|
|
|
|
|
|
|
|
|
static int match(struct sockaddr_in *sin, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int full_frame)
|
|
|
|
|
static int match(struct sockaddr_in *sin, unsigned short callno, unsigned short dcallno, const struct chan_iax2_pvt *cur, int check_dcallno)
|
|
|
|
|
{
|
|
|
|
|
if ((cur->addr.sin_addr.s_addr == sin->sin_addr.s_addr) &&
|
|
|
|
|
(cur->addr.sin_port == sin->sin_port)) {
|
|
|
|
|
/* This is the main host */
|
|
|
|
|
if ( (cur->peercallno == 0 || cur->peercallno == callno) &&
|
|
|
|
|
(full_frame ? dcallno == cur->callno : 1) ) {
|
|
|
|
|
(check_dcallno ? dcallno == cur->callno : 1) ) {
|
|
|
|
|
/* That's us. Be sure we keep track of the peer call number */
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
@ -1592,7 +1592,7 @@ static void remove_by_peercallno(struct chan_iax2_pvt *pvt)
|
|
|
|
|
/*
|
|
|
|
|
* \note Calling this function while holding another pvt lock can cause a deadlock.
|
|
|
|
|
*/
|
|
|
|
|
static int __find_callno(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int new, int sockfd, int return_locked, int full_frame)
|
|
|
|
|
static int __find_callno(unsigned short callno, unsigned short dcallno, struct sockaddr_in *sin, int new, int sockfd, int return_locked, int check_dcallno)
|
|
|
|
|
{
|
|
|
|
|
int res = 0;
|
|
|
|
|
int x;
|
|
|
|
@ -1606,7 +1606,7 @@ static int __find_callno(unsigned short callno, unsigned short dcallno, struct s
|
|
|
|
|
.callno = dcallno,
|
|
|
|
|
.peercallno = callno,
|
|
|
|
|
/* hack!! */
|
|
|
|
|
.frames_received = full_frame,
|
|
|
|
|
.frames_received = check_dcallno,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
memcpy(&tmp_pvt.addr, sin, sizeof(tmp_pvt.addr));
|
|
|
|
@ -1626,7 +1626,7 @@ static int __find_callno(unsigned short callno, unsigned short dcallno, struct s
|
|
|
|
|
ast_mutex_lock(&iaxsl[x]);
|
|
|
|
|
if (iaxs[x]) {
|
|
|
|
|
/* Look for an exact match */
|
|
|
|
|
if (match(sin, callno, dcallno, iaxs[x], full_frame)) {
|
|
|
|
|
if (match(sin, callno, dcallno, iaxs[x], check_dcallno)) {
|
|
|
|
|
res = x;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -1637,7 +1637,7 @@ static int __find_callno(unsigned short callno, unsigned short dcallno, struct s
|
|
|
|
|
ast_mutex_lock(&iaxsl[x]);
|
|
|
|
|
if (iaxs[x]) {
|
|
|
|
|
/* Look for an exact match */
|
|
|
|
|
if (match(sin, callno, dcallno, iaxs[x], full_frame)) {
|
|
|
|
|
if (match(sin, callno, dcallno, iaxs[x], check_dcallno)) {
|
|
|
|
|
res = x;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -7998,8 +7998,10 @@ static int socket_process(struct iax2_thread *thread)
|
|
|
|
|
f.subclass = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!fr->callno)
|
|
|
|
|
fr->callno = find_callno(ntohs(mh->callno) & ~IAX_FLAG_FULL, dcallno, &sin, new, fd, ntohs(mh->callno) & IAX_FLAG_FULL);
|
|
|
|
|
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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (fr->callno > 0)
|
|
|
|
|
ast_mutex_lock(&iaxsl[fr->callno]);
|
|
|
|
|