int (*decode_qcs)(struct qcs *qcs, int fin, void *ctx);
size_t (*snd_buf)(struct conn_stream *cs, struct buffer *buf, size_t count, int flags);
int (*finalize)(void *ctx);
+ int (*is_active)(const struct qcc *qcc, void *ctx);
void (*release)(void *ctx);
};
pool_free(pool_head_h3, h3);
}
+/* Check if the H3 connection can still be considered as active.
+ *
+ * Return true if active else false.
+ */
+static int h3_is_active(const struct qcc *qcc, void *ctx)
+{
+ if (qcc->strms[QCS_CLT_BIDI].nb_streams)
+ return 1;
+
+ return 0;
+}
+
/* HTTP/3 application layer operations */
const struct qcc_app_ops h3_ops = {
.init = h3_init,
.decode_qcs = h3_decode_qcs,
.snd_buf = h3_snd_buf,
.finalize = h3_finalize,
+ .is_active = h3_is_active,
.release = h3_release,
};
return total;
}
+static int hq_is_active(const struct qcc *qcc, void *ctx)
+{
+ if (!eb_is_empty(&qcc->streams_by_id))
+ return 1;
+
+ return 0;
+}
+
const struct qcc_app_ops hq_interop_ops = {
.decode_qcs = hq_interop_decode_qcs,
.snd_buf = hq_interop_snd_buf,
+ .is_active = hq_is_active,
};
static inline int qcc_is_dead(const struct qcc *qcc)
{
- if (!qcc->strms[QCS_CLT_BIDI].nb_streams && !qcc->task)
+ if (qcc->app_ops && qcc->app_ops->is_active &&
+ qcc->app_ops->is_active(qcc, qcc->ctx))
+ return 0;
+
+ if (!qcc->task)
return 1;
return 0;