unsigned long long total; /* total data read */
int rex; /* expiration date for a read, in ticks */
int wex; /* expiration date for a write or connect, in ticks */
- int rto; /* read timeout, in ticks */
- int wto; /* write timeout, in ticks */
int analyse_exp; /* expiration date for current analysers (if set) */
};
unsigned int flags; /* SC_FL_* */
unsigned int hcto; /* half-closed timeout (0 = unset) */
+ unsigned int rto; /* read timeout, in ticks */
+ unsigned int wto; /* write timeout, in ticks */
struct wait_event wait_event; /* We're in a wait list */
struct sedesc *sedesc; /* points to the stream endpoint descriptor */
enum obj_type *app; /* points to the applicative point (stream or check) */
if (res || timeout < 1)
return cli_err(appctx, "Invalid timeout value.\n");
- s->req.rto = s->res.wto = 1 + MS_TO_TICKS(timeout*1000);
+ s->scf->rto = s->scf->wto = 1 + MS_TO_TICKS(timeout*1000);
task_wakeup(s->task, TASK_WOKEN_MSG); // recompute timeouts
return 1;
}
/* Now we can realign the response buffer */
c_realign_if_empty(&s->res);
- s->req.rto = strm_fe(s)->timeout.client;
- s->req.wto = TICK_ETERNITY;
+ s->scf->rto = strm_fe(s)->timeout.client;
+ s->scf->wto = strm_fe(s)->timeout.client;
- s->res.rto = TICK_ETERNITY;
- s->res.wto = strm_fe(s)->timeout.client;
+ s->scb->rto = TICK_ETERNITY;
+ s->scb->wto = TICK_ETERNITY;
s->req.rex = TICK_ETERNITY;
s->req.wex = TICK_ETERNITY;
/* for rto and rex to eternity to not expire on idle recv:
* We are using a syslog server.
*/
- s->res.rto = TICK_ETERNITY;
+ s->scb->rto = TICK_ETERNITY;
s->res.rex = TICK_ETERNITY;
ds->appctx = appctx;
s = appctx_strm(container_of(peer, struct hlua_csk_ctx, xref)->appctx);
s->sess->fe->timeout.connect = tmout;
- s->req.rto = tmout;
- s->req.wto = tmout;
- s->res.rto = tmout;
- s->res.wto = tmout;
+ s->scf->rto = s->scf->wto = tmout;
+ s->scb->rto = s->scb->wto = tmout;
s->req.rex = tick_add_ifset(now_ms, tmout);
s->req.wex = tick_add_ifset(now_ms, tmout);
s->res.rex = tick_add_ifset(now_ms, tmout);
channel_auto_close(req);
channel_erase(req);
- res->wex = tick_add_ifset(now_ms, res->wto);
+ res->wex = tick_add_ifset(now_ms, s->scf->wto);
channel_auto_read(res);
channel_auto_close(res);
channel_shutr_now(res);
channel_auto_close(req);
channel_htx_erase(req, htxbuf(&req->buf));
- res->wex = tick_add_ifset(now_ms, res->wto);
+ res->wex = tick_add_ifset(now_ms, s->scf->wto);
channel_auto_read(res);
channel_auto_close(res);
channel_shutr_now(res);
}
end:
- s->res.wex = tick_add_ifset(now_ms, s->res.wto);
+ s->res.wex = tick_add_ifset(now_ms, s->scf->wto);
/* At this staged, HTTP analysis is finished */
s->req.analysers &= AN_REQ_FLT_END;
s = appctx_strm(appctx);
s->target = target;
/* set the "timeout server" */
- s->req.wto = hc->timeout_server;
- s->res.rto = hc->timeout_server;
+ s->scb->rto = hc->timeout_server;
+ s->scb->wto = hc->timeout_server;
if (doresolve) {
/* in order to do the set-dst we need to put the address on the front */
*/
sc_oc(sc)->rex = TICK_ETERNITY;
/* rto should not change but it seems the case */
- sc_oc(sc)->rto = TICK_ETERNITY;
+ sc_opposite(sc)->rto = TICK_ETERNITY;
if (unlikely(sc_ic(sc)->flags & CF_SHUTW))
goto close;
*/
sc_oc(sc)->rex = TICK_ETERNITY;
/* rto should not change but it seems the case */
- sc_oc(sc)->rto = TICK_ETERNITY;
+ sc_opposite(sc)->rto = TICK_ETERNITY;
/* an error was detected */
if (unlikely(sc_ic(sc)->flags & CF_SHUTW))
/* for rto and rex to eternity to not expire on idle recv:
* We are using a syslog server.
*/
- s->res.rto = TICK_ETERNITY;
+ s->scb->rto = TICK_ETERNITY;
s->res.rex = TICK_ETERNITY;
sft->appctx = appctx;
sc->obj_type = OBJ_TYPE_SC;
sc->flags = SC_FL_NONE;
sc->state = SC_ST_INI;
- sc->hcto = TICK_ETERNITY;
+ sc->rto = sc->wto = sc->hcto = TICK_ETERNITY;
sc->app = NULL;
sc->app_ops = NULL;
sc->src = NULL;
oc->wex = TICK_ETERNITY;
if (tick_isset(sc->hcto)) {
- ic->rto = sc->hcto;
- ic->rex = tick_add(now_ms, ic->rto);
+ sc->rto = sc->hcto;
+ ic->rex = tick_add(now_ms, sc->rto);
}
switch (sc->state) {
*/
sc_ep_clr(sc, SE_FL_WAIT_DATA);
if (!tick_isset(oc->wex))
- oc->wex = tick_add_ifset(now_ms, oc->wto);
+ oc->wex = tick_add_ifset(now_ms, sc->wto);
if (!(sc->flags & SC_FL_DONT_WAKE))
task_wakeup(sc_strm_task(sc), TASK_WOKEN_IO);
oc->wex = TICK_ETERNITY;
if (tick_isset(sc->hcto)) {
- ic->rto = sc->hcto;
- ic->rex = tick_add(now_ms, ic->rto);
+ sc->rto = sc->hcto;
+ ic->rex = tick_add(now_ms, sc->rto);
}
switch (sc->state) {
*/
sc_ep_clr(sc, SE_FL_WAIT_DATA);
if (!tick_isset(oc->wex))
- oc->wex = tick_add_ifset(now_ms, oc->wto);
+ oc->wex = tick_add_ifset(now_ms, sc->wto);
}
if (likely(oc->flags & CF_WRITE_EVENT)) {
/* update timeout if we have written something */
if (!(oc->flags & CF_SHUTW) && !channel_is_empty(oc))
- oc->wex = tick_add_ifset(now_ms, oc->wto);
+ oc->wex = tick_add_ifset(now_ms, sc->wto);
if (tick_isset(ic->rex) && !(sc->flags & SC_FL_INDEP_STR)) {
/* Note: to prevent the client from expiring read timeouts
* of data which can full the socket buffers long before a
* write timeout is detected.
*/
- ic->rex = tick_add_ifset(now_ms, ic->rto);
+ ic->rex = tick_add_ifset(now_ms, sc->rto);
}
}
oc->wex = TICK_ETERNITY;
if (tick_isset(sc->hcto)) {
- ic->rto = sc->hcto;
- ic->rex = tick_add(now_ms, ic->rto);
+ sc->rto = sc->hcto;
+ ic->rex = tick_add(now_ms, sc->rto);
}
/* on shutw we always wake the applet up */
return;
if (!tick_isset(oc->wex))
- oc->wex = tick_add_ifset(now_ms, oc->wto);
+ oc->wex = tick_add_ifset(now_ms, sc->wto);
if (!channel_is_empty(oc)) {
/* (re)start sending */
if ((ic->flags & CF_EOI) || sc->flags & (SC_FL_WONT_READ|SC_FL_NEED_BUFF|SC_FL_NEED_ROOM))
ic->rex = TICK_ETERNITY;
else if (!tick_isset(ic->rex))
- ic->rex = tick_add_ifset(now_ms, ic->rto);
+ ic->rex = tick_add_ifset(now_ms, sc->rto);
sc_chk_rcv(sc);
}
*/
sc_ep_clr(sc, SE_FL_WAIT_DATA);
if (!tick_isset(oc->wex)) {
- oc->wex = tick_add_ifset(now_ms, oc->wto);
+ oc->wex = tick_add_ifset(now_ms, sc->wto);
if (tick_isset(ic->rex) && !(sc->flags & SC_FL_INDEP_STR)) {
/* Note: depending on the protocol, we don't know if we're waiting
* for incoming data or not. So in order to prevent the socket from
* except if it was already infinite or if we have explicitly setup
* independent streams.
*/
- ic->rex = tick_add_ifset(now_ms, ic->rto);
+ ic->rex = tick_add_ifset(now_ms, sc->rto);
}
}
}
if (sc_ep_test(sc, SE_FL_ERR_PENDING|SE_FL_ERROR) &&
!channel_is_empty(oc))
if (tick_isset(oc->wex))
- oc->wex = tick_add_ifset(now_ms, oc->wto);
+ oc->wex = tick_add_ifset(now_ms, sc->wto);
if (!(sc->flags & SC_FL_INDEP_STR))
if (tick_isset(ic->rex))
- ic->rex = tick_add_ifset(now_ms, ic->rto);
+ ic->rex = tick_add_ifset(now_ms, sc->rto);
}
if (oc->flags & CF_DONT_READ)
else if ((ic->flags & (CF_SHUTR|CF_READ_EVENT)) == CF_READ_EVENT) {
/* we must re-enable reading if sc_chk_snd() has freed some space */
if (tick_isset(ic->rex))
- ic->rex = tick_add_ifset(now_ms, ic->rto);
+ ic->rex = tick_add_ifset(now_ms, sc->rto);
}
/* wake the task up only when needed */
channel_auto_close(&s->req); /* let the producer forward close requests */
}
- s->req.rto = sess->fe->timeout.client;
- s->req.wto = TICK_ETERNITY;
+ s->scf->rto = sess->fe->timeout.client;
+ s->scf->wto = sess->fe->timeout.client;
s->req.rex = TICK_ETERNITY;
s->req.wex = TICK_ETERNITY;
s->req.analyse_exp = TICK_ETERNITY;
s->res.flags |= CF_NEVER_WAIT;
}
- s->res.wto = sess->fe->timeout.client;
- s->res.rto = TICK_ETERNITY;
+ s->scb->wto = TICK_ETERNITY;
+ s->scb->rto = TICK_ETERNITY;
s->res.rex = TICK_ETERNITY;
s->res.wex = TICK_ETERNITY;
s->res.analyse_exp = TICK_ETERNITY;
if (likely(msg && msg->data))
co_inject(oc, msg->area, msg->data);
- oc->wex = tick_add_ifset(now_ms, oc->wto);
+ oc->wex = tick_add_ifset(now_ms, s->scf->wto);
channel_auto_read(oc);
channel_auto_close(oc);
channel_shutr_now(oc);
{
switch (name) {
case ACT_TIMEOUT_SERVER:
- s->req.wto = timeout;
- s->res.rto = timeout;
+ s->scb->wto = timeout;
+ s->scb->rto = timeout;
return 1;
case ACT_TIMEOUT_TUNNEL:
* if already defined, it means that a set-timeout rule has
* been executed so do not overwrite them
*/
- if (!tick_isset(req->wto))
- req->wto = s->be->timeout.server;
- if (!tick_isset(rep->rto))
- rep->rto = s->be->timeout.server;
+ if (!tick_isset(s->scb->wto))
+ s->scb->wto = s->be->timeout.server;
+ if (!tick_isset(s->scb->rto))
+ s->scb->rto = s->be->timeout.server;
if (!tick_isset(s->tunnel_timeout))
s->tunnel_timeout = s->be->timeout.tunnel;
* the half-closed timeouts as well.
*/
if (!req->analysers && s->tunnel_timeout) {
- req->rto = req->wto = res->rto = res->wto =
+ scf->rto = scf->wto = scb->rto = scb->wto =
s->tunnel_timeout;
if ((req->flags & CF_SHUTR) && tick_isset(sess->fe->timeout.clientfin))
- res->wto = sess->fe->timeout.clientfin;
+ scf->wto = sess->fe->timeout.clientfin;
if ((req->flags & CF_SHUTW) && tick_isset(s->be->timeout.serverfin))
- res->rto = s->be->timeout.serverfin;
+ scb->rto = s->be->timeout.serverfin;
if ((res->flags & CF_SHUTR) && tick_isset(s->be->timeout.serverfin))
- req->wto = s->be->timeout.serverfin;
+ scb->wto = s->be->timeout.serverfin;
if ((res->flags & CF_SHUTW) && tick_isset(sess->fe->timeout.clientfin))
- req->rto = sess->fe->timeout.clientfin;
+ scf->rto = sess->fe->timeout.clientfin;
- req->rex = tick_add(now_ms, req->rto);
- req->wex = tick_add(now_ms, req->wto);
- res->rex = tick_add(now_ms, res->rto);
- res->wex = tick_add(now_ms, res->wto);
+ req->rex = tick_add(now_ms, scf->rto);
+ req->wex = tick_add(now_ms, scb->wto);
+ res->rex = tick_add(now_ms, scb->rto);
+ res->wex = tick_add(now_ms, scf->wto);
}
}
if (!smp->strm)
return 0;
- smp->data.u.sint = TICKS_TO_MS(smp->strm->res.rto);
+ smp->data.u.sint = TICKS_TO_MS(smp->strm->scb->rto);
return 1;
}