put in proper fix for issue #7294 instead of the broken partial fix that was committed, and thereby also fix issue #7438

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.2@41716 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.2
Kevin P. Fleming 19 years ago
parent c42a8d9b99
commit abb4e3a3a4

@ -12931,21 +12931,25 @@ static struct ast_rtp *sip_get_vrtp_peer(struct ast_channel *chan)
static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, int codecs, int nat_active) static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp, int codecs, int nat_active)
{ {
struct sip_pvt *p; struct sip_pvt *p;
int changed = 0;
p = chan->tech_pvt; p = chan->tech_pvt;
if (!p) if (!p)
return -1; return -1;
ast_mutex_lock(&p->lock); ast_mutex_lock(&p->lock);
if (rtp) if (rtp)
ast_rtp_get_peer(rtp, &p->redirip); changed |= ast_rtp_get_peer(rtp, &p->redirip);
else else
memset(&p->redirip, 0, sizeof(p->redirip)); memset(&p->redirip, 0, sizeof(p->redirip));
if (vrtp) if (vrtp)
ast_rtp_get_peer(vrtp, &p->vredirip); changed |= ast_rtp_get_peer(vrtp, &p->vredirip);
else else
memset(&p->vredirip, 0, sizeof(p->vredirip)); memset(&p->vredirip, 0, sizeof(p->vredirip));
p->redircodecs = codecs; if (codecs && (p->redircodecs != codecs)) {
if (codecs && !ast_test_flag(p, SIP_GOTREFER)) { p->redircodecs = codecs;
changed = 1;
}
if (changed && !ast_test_flag(p, SIP_GOTREFER)) {
if (!p->pendinginvite) { if (!p->pendinginvite) {
if (option_debug > 2) { if (option_debug > 2) {
char iabuf[INET_ADDRSTRLEN]; char iabuf[INET_ADDRSTRLEN];

@ -96,7 +96,7 @@ struct ast_rtp *ast_rtp_new_with_bindaddr(struct sched_context *sched, struct io
void ast_rtp_set_peer(struct ast_rtp *rtp, struct sockaddr_in *them); void ast_rtp_set_peer(struct ast_rtp *rtp, struct sockaddr_in *them);
void ast_rtp_get_peer(struct ast_rtp *rtp, struct sockaddr_in *them); int ast_rtp_get_peer(struct ast_rtp *rtp, struct sockaddr_in *them);
void ast_rtp_get_us(struct ast_rtp *rtp, struct sockaddr_in *us); void ast_rtp_get_us(struct ast_rtp *rtp, struct sockaddr_in *us);

14
rtp.c

@ -1041,11 +1041,17 @@ void ast_rtp_set_peer(struct ast_rtp *rtp, struct sockaddr_in *them)
rtp->rxseqno = 0; rtp->rxseqno = 0;
} }
void ast_rtp_get_peer(struct ast_rtp *rtp, struct sockaddr_in *them) int ast_rtp_get_peer(struct ast_rtp *rtp, struct sockaddr_in *them)
{ {
them->sin_family = AF_INET; if ((them->sin_family != AF_INET) ||
them->sin_port = rtp->them.sin_port; (them->sin_port != rtp->them.sin_port) ||
them->sin_addr = rtp->them.sin_addr; (them->sin_addr.s_addr != rtp->them.sin_addr.s_addr)) {
them->sin_family = AF_INET;
them->sin_port = rtp->them.sin_port;
them->sin_addr = rtp->them.sin_addr;
return 1;
}
return 0;
} }
void ast_rtp_get_us(struct ast_rtp *rtp, struct sockaddr_in *us) void ast_rtp_get_us(struct ast_rtp *rtp, struct sockaddr_in *us)

Loading…
Cancel
Save