summaryrefslogtreecommitdiff
path: root/main/stun.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2017-04-06 17:31:14 -0500
committerRichard Mudgett <rmudgett@digium.com>2017-04-11 13:03:57 -0500
commitf8219a2e12579b0cf0119756dec699f5a8c5640a (patch)
tree9eeb9ceef466459c463cd13acf87698c2372a4bd /main/stun.c
parent19b82a864415f57c72fa939f0909622761d3b358 (diff)
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
Diffstat (limited to 'main/stun.c')
-rw-r--r--main/stun.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/main/stun.c b/main/stun.c
index f5bdc9ad4..fe1afbab7 100644
--- a/main/stun.c
+++ b/main/stun.c
@@ -413,6 +413,7 @@ int ast_stun_request(int s, struct sockaddr_in *dst,
/* send request, possibly wait for reply */
struct sockaddr_in src;
socklen_t srclen;
+ struct timeval start;
/* Send STUN message. */
res = stun_send(s, dst, req);
@@ -426,12 +427,20 @@ int ast_stun_request(int s, struct sockaddr_in *dst,
break;
}
+ start = ast_tvnow();
try_again:
/* Wait for response. */
{
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) {
/* Error */
continue;