diff --git a/channels/chan_sip.c b/channels/chan_sip.c index cb9bb6f568f9b84b5b4997fe76f5575f96f19cde..819f44d4ce275594ba9a48f695904a1e79af37a9 100755 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -407,8 +407,13 @@ static int create_addr(struct sip_pvt *r, char *peer) r->insecure = p->insecure; r->canreinvite = p->canreinvite; r->maxtime = p->maxms; - if (p->dtmfmode) + if (p->dtmfmode) { r->dtmfmode = p->dtmfmode; + if (r->dtmfmode & SIP_DTMF_RFC2833) + r->nonCodecCapability |= AST_RTP_DTMF; + else + r->nonCodecCapability &= ~AST_RTP_DTMF; + } strncpy(r->context, p->context,sizeof(r->context)-1); if ((p->addr.sin_addr.s_addr || p->defaddr.sin_addr.s_addr) && (!p->maxms || ((p->lastms > 0) && (p->lastms <= p->maxms)))) { @@ -1184,6 +1189,8 @@ static struct sip_pvt *sip_alloc(char *callid, struct sockaddr_in *sin, int useg /* Assume reinvite OK */ p->canreinvite = 1; p->dtmfmode = globaldtmfmode; + if (p->dtmfmode & SIP_DTMF_RFC2833) + p->nonCodecCapability |= AST_RTP_DTMF; /* Add to list */ ast_pthread_mutex_lock(&iflock); p->next = iflist; @@ -2625,6 +2632,7 @@ static int check_via(struct sip_pvt *p, struct sip_request *req) static int check_user(struct sip_pvt *p, struct sip_request *req, char *cmd, char *uri) { struct sip_user *user; + struct sip_peer *peer; char *of, from[256] = "", *c; int res = 0; char *t; @@ -2665,14 +2673,46 @@ static int check_user(struct sip_pvt *p, struct sip_request *req, char *cmd, cha strncpy(p->accountcode, user->accountcode, sizeof(p->accountcode) -1); p->canreinvite = user->canreinvite; p->amaflags = user->amaflags; - if (user->dtmfmode) + if (user->dtmfmode) { p->dtmfmode = user->dtmfmode; + if (p->dtmfmode & SIP_DTMF_RFC2833) + p->nonCodecCapability |= AST_RTP_DTMF; + else + p->nonCodecCapability &= ~AST_RTP_DTMF; + } } break; } user = user->next; } ast_pthread_mutex_unlock(&userl.lock); + if (!user) { + /* If we didn't find a user match, check for peers */ + ast_pthread_mutex_lock(&peerl.lock); + peer = peerl.peers; + while(peer) { + if (!memcmp(&peer->addr, &p->recv, sizeof(peer->addr))) { + /* Take the peer */ + p->nat = peer->nat; + if (p->rtp) { + ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n", p->nat); + ast_rtp_setnat(p->rtp, p->nat); + } + p->canreinvite = peer->canreinvite; + strncpy(p->username, peer->name, sizeof(p->username) - 1); + if (peer->dtmfmode) { + p->dtmfmode = peer->dtmfmode; + if (p->dtmfmode & SIP_DTMF_RFC2833) + p->nonCodecCapability |= AST_RTP_DTMF; + else + p->nonCodecCapability &= ~AST_RTP_DTMF; + } + break; + } + peer = peer->next; + } + ast_pthread_mutex_unlock(&peerl.lock); + } return res; } @@ -3431,7 +3471,7 @@ static int handle_request(struct sip_pvt *p, struct sip_request *req, struct soc } } - if (strcmp(cmd, "SIP/2.0")) + if (strcmp(cmd, "SIP/2.0") && (seqno >= p->icseq)) /* Next should follow monotonically increasing */ p->icseq = seqno + 1;