stun.c: Fix ast_stun_request() erratic timeout.

If ast_stun_request() receives packets other than a STUN response then we
could conceivably never exit if we continue to receive packets with less
than three seconds between them.

* Fix poll timeout to keep track of the time when we sent the STUN
request.  We will now send a STUN request every three seconds regardless
of how many other packets we receive while waiting for a response until we
have completed three STUN request transmission cycles.

Change-Id: Ib606cb08585e06eb50877f67b8d3bd385a85c266
pull/8/head
Richard Mudgett 8 years ago
parent 5bf425840e
commit 3408561eb7

@ -413,6 +413,7 @@ int ast_stun_request(int s, struct sockaddr_in *dst,
/* send request, possibly wait for reply */ /* send request, possibly wait for reply */
struct sockaddr_in src; struct sockaddr_in src;
socklen_t srclen; socklen_t srclen;
struct timeval start;
/* Send STUN message. */ /* Send STUN message. */
res = stun_send(s, dst, req); res = stun_send(s, dst, req);
@ -426,12 +427,20 @@ int ast_stun_request(int s, struct sockaddr_in *dst,
break; break;
} }
start = ast_tvnow();
try_again: try_again:
/* Wait for response. */ /* Wait for response. */
{ {
struct pollfd pfds = { .fd = s, .events = POLLIN }; struct pollfd pfds = { .fd = s, .events = POLLIN };
int ms;
res = ast_poll(&pfds, 1, 3000); ms = ast_remaining_ms(start, 3000);
if (ms <= 0) {
/* No response, timeout */
res = 1;
continue;
}
res = ast_poll(&pfds, 1, ms);
if (res < 0) { if (res < 0) {
/* Error */ /* Error */
continue; continue;

Loading…
Cancel
Save