diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2019-05-27 17:39:45 +0200 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2019-05-31 14:25:57 +0000 |
commit | ceac078d7763edc56eb9bdcdcadddcbd539f943a (patch) | |
tree | aca326dfbfce49ca42980253ec19024178e4e4e2 | |
parent | cd87c5f9636b2732f98ac137796ffce49ba4015a (diff) |
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
-rw-r--r-- | gtp/gtp.c | 18 |
1 files changed, 15 insertions, 3 deletions
@@ -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; } |