gtp: Take queue_resp into account to schedule retrans timer

Before this patch they were not taken into account, which means some
resp messages could stay more time than required enqueued.

Change-Id: Iebf405b2310a34785f3b363cc2a9f415281f6030
This commit is contained in:
Pau Espin 2019-05-27 17:39:45 +02:00 committed by Harald Welte
parent cd87c5f963
commit ceac078d77
1 changed files with 15 additions and 3 deletions

View File

@ -590,22 +590,34 @@ int gtp_retrans(struct gsn_t *gsn)
int gtp_retranstimeout(struct gsn_t *gsn, struct timeval *timeout)
{
time_t now, later;
time_t now, later, diff;
struct qmsg_t *qmsg;
timeout->tv_usec = 0;
if (queue_getfirst(gsn->queue_req, &qmsg)) {
timeout->tv_sec = 10;
timeout->tv_usec = 0;
} else {
now = time(NULL);
later = qmsg->timeout;
timeout->tv_sec = later - now;
timeout->tv_usec = 0;
if (timeout->tv_sec < 0)
timeout->tv_sec = 0; /* No negative allowed */
if (timeout->tv_sec > 10)
timeout->tv_sec = 10; /* Max sleep for 10 sec */
}
if (queue_getfirst(gsn->queue_resp, &qmsg)) {
/* already set by queue_req, do nothing */
} else { /* trigger faster if earlier timeout exists in queue_resp */
now = time(NULL);
later = qmsg->timeout;
diff = later - now;
if (diff < 0)
diff = 0;
if (diff < timeout->tv_sec)
timeout->tv_sec = diff;
}
return 0;
}