mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-03 19:16:46 +00:00
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
This commit is contained in:
11
main/stun.c
11
main/stun.c
@@ -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;
|
||||||
|
Reference in New Issue
Block a user