From 70ac6a274cff5bcbcc3096eacf94f0ca0f4f65ae Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 13 Jul 2012 14:31:11 +0000 Subject: [PATCH] take 0-byte packets into consideration when updating peer info for NAT'd streams --- daemon/call.c | 54 +++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/daemon/call.c b/daemon/call.c index 8e0aad462..895b1c5cc 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -193,42 +193,40 @@ static int stream_packet(struct streamrelay *r, char *b, int l, struct sockaddr_ return 0; } - if (!pe->confirmed && pe->filled && r->idx == 0) { - if (l < 2) - goto skip; - - if (c->lookup_done && m->poller->now > (c->lookup_done + 3)) { - if (!pe->codec) { - cc = b[1]; - cc &= 0x7f; - if (cc < G_N_ELEMENTS(rtp_codecs)) - pe->codec = rtp_codecs[cc] ? : "unknown"; - else - pe->codec = "unknown"; - } + if (pe->confirmed || !pe->filled || r->idx != 0) + goto forward; - mylog(LOG_DEBUG, LOG_PREFIX_C "Confirmed peer information for port %u - %s:%u", - LOG_PARAMS_C(c), r->localport, addr, ntohs(fsin->sin6_port)); + if (!c->lookup_done || m->poller->now <= c->lookup_done + 3) + goto peerinfo; - pe->confirmed = 1; - } + mylog(LOG_DEBUG, LOG_PREFIX_C "Confirmed peer information for port %u - %s:%u", + LOG_PARAMS_C(c), r->localport, addr, ntohs(fsin->sin6_port)); - p2 = &p->up->rtps[p->idx ^ 1]; - p->peer.ip46 = fsin->sin6_addr; - p->peer.port = ntohs(fsin->sin6_port); - p2->peer.ip46 = p->peer.ip46; - p2->peer.port = p->peer.port + ((int) (p2->idx * 2) - 1); + pe->confirmed = 1; +peerinfo: + if (!pe->codec && l >= 2) { + cc = b[1]; + cc &= 0x7f; + if (cc < G_N_ELEMENTS(rtp_codecs)) + pe->codec = rtp_codecs[cc] ? : "unknown"; + else + pe->codec = "unknown"; + } + p2 = &p->up->rtps[p->idx ^ 1]; + p->peer.ip46 = fsin->sin6_addr; + p->peer.port = ntohs(fsin->sin6_port); + p2->peer.ip46 = p->peer.ip46; + p2->peer.port = p->peer.port + ((int) (p2->idx * 2) - 1); - if (pe->confirmed && pe2->confirmed && pe2->filled) - kernelize(cs); + if (pe->confirmed && pe2->confirmed && pe2->filled) + kernelize(cs); - if (redis_update) - redis_update(c); - } + if (redis_update) + redis_update(c); -skip: +forward: if (IN6_IS_ADDR_UNSPECIFIED(&r->peer.ip46) || !r->peer.port || !r->fd_family) goto drop;