qc_release_frm(qc, frm);
}
- if (stream_acked && qc->mux_state == QC_MUX_READY) {
- struct qcc *qcc = qc->qcc;
-
- if (qcc->subs && qcc->subs->events & SUB_RETRY_SEND) {
- tasklet_wakeup(qcc->subs->tasklet);
- qcc->subs->events &= ~SUB_RETRY_SEND;
- if (!qcc->subs->events)
- qcc->subs = NULL;
+ if (stream_acked) {
+ if (qc->subs && qc->subs->events & SUB_RETRY_SEND) {
+ tasklet_wakeup(qc->subs->tasklet);
+ qc->subs->events &= ~SUB_RETRY_SEND;
+ if (!qc->subs->events)
+ qc->subs = NULL;
}
}
leave:
if (qc->path->in_flight) {
pktns = quic_pto_pktns(qc, qc->state >= QUIC_HS_ST_COMPLETE, NULL);
- if (qc->mux_state == QC_MUX_READY && qc->qcc->subs &&
- qc->qcc->subs->events & SUB_RETRY_SEND) {
- struct qcc *qcc = qc->qcc;
-
+ if (qc->subs && qc->subs->events & SUB_RETRY_SEND) {
pktns->tx.pto_probe = QUIC_MAX_NB_PTO_DGRAMS;
- tasklet_wakeup(qcc->subs->tasklet);
- qcc->subs->events &= ~SUB_RETRY_SEND;
- if (!qcc->subs->events)
- qcc->subs = NULL;
+ tasklet_wakeup(qc->subs->tasklet);
+ qc->subs->events &= ~SUB_RETRY_SEND;
+ if (!qc->subs->events)
+ qc->subs = NULL;
}
else {
qc->flags |= QUIC_FL_CONN_RETRANS_NEEDED;
*/
qc->tid = quic_get_cid_tid(qc->scid.data, l->bind_conf);
qc->wait_event.tasklet->tid = qc->tid;
+ qc->subs = NULL;
if (qc_conn_alloc_ssl_ctx(qc) ||
!quic_conn_init_timer(qc) ||
static int quic_conn_subscribe(struct connection *conn, void *xprt_ctx, int event_type, struct wait_event *es)
{
struct quic_conn *qc = conn->handle.qc;
- struct qcc *qcc = qc->qcc;
TRACE_ENTER(QUIC_EV_CONN_SUB, qc);
BUG_ON(event_type & ~(SUB_RETRY_SEND|SUB_RETRY_RECV));
- BUG_ON(qcc->subs && qcc->subs != es);
+ BUG_ON(qc->subs && qc->subs != es);
es->events |= event_type;
- qcc->subs = es;
+ qc->subs = es;
+
+ /* TODO implement a check_events to detect if subscriber should be
+ * woken up immediately ?
+ */
if (event_type & SUB_RETRY_RECV)
- TRACE_DEVEL("subscribe(recv)", QUIC_EV_CONN_XPRTRECV, qc, qcc);
+ TRACE_DEVEL("subscribe(recv)", QUIC_EV_CONN_XPRTRECV, qc);
if (event_type & SUB_RETRY_SEND)
- TRACE_DEVEL("subscribe(send)", QUIC_EV_CONN_XPRTSEND, qc, qcc);
+ TRACE_DEVEL("subscribe(send)", QUIC_EV_CONN_XPRTSEND, qc);
TRACE_LEAVE(QUIC_EV_CONN_SUB, qc);
*/
static int quic_conn_unsubscribe(struct connection *conn, void *xprt_ctx, int event_type, struct wait_event *es)
{
- int ret;
struct quic_conn *qc = conn->handle.qc;
- struct qcc *qcc = qc->qcc;
TRACE_ENTER(QUIC_EV_CONN_SUB, qc);
if (event_type & SUB_RETRY_RECV)
- TRACE_DEVEL("unsubscribe(recv)", QUIC_EV_CONN_XPRTRECV, qc, qcc);
+ TRACE_DEVEL("unsubscribe(recv)", QUIC_EV_CONN_XPRTRECV, qc);
if (event_type & SUB_RETRY_SEND)
- TRACE_DEVEL("unsubscribe(send)", QUIC_EV_CONN_XPRTSEND, qc, qcc);
+ TRACE_DEVEL("unsubscribe(send)", QUIC_EV_CONN_XPRTSEND, qc);
+
+ es->events &= ~event_type;
+ if (!es->events)
+ qc->subs = NULL;
- ret = conn_unsubscribe(conn, xprt_ctx, event_type, es);
+ /* TODO implement ignore_events similar to conn_unsubscribe() ? */
TRACE_LEAVE(QUIC_EV_CONN_SUB, qc);
- return ret;
+ return 0;
}
/* Store in <xprt_ctx> the context attached to <conn>.