diff options
author | Richard Mudgett <rmudgett@digium.com> | 2017-04-06 17:31:14 -0500 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2017-04-11 13:03:57 -0500 |
commit | f8219a2e12579b0cf0119756dec699f5a8c5640a (patch) | |
tree | 9eeb9ceef466459c463cd13acf87698c2372a4bd /main/stun.c | |
parent | 19b82a864415f57c72fa939f0909622761d3b358 (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.c | 11 |
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; |