MINOR: mux-quic: define is_active app-ops

Add a new app layer operation is_active. This can be used by the MUX to
check if the connection can be considered as active or not. This is used
inside qcc_is_dead as a first check.

For example on HTTP/3, if there is at least one bidir client stream
opened the connection is active. This explicitly ignore the uni streams
used for control and qpack as they can never be closed during the
connection lifetime.
This commit is contained in:
Amaury Denoyelle 2022-04-01 17:56:58 +02:00
parent 06890aaa91
commit 198d35f9c6
4 changed files with 28 additions and 1 deletions

View File

@ -117,6 +117,7 @@ struct qcc_app_ops {
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);
};

View File

@ -897,6 +897,18 @@ static void h3_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,
@ -904,5 +916,6 @@ const struct qcc_app_ops h3_ops = {
.decode_qcs = h3_decode_qcs,
.snd_buf = h3_snd_buf,
.finalize = h3_finalize,
.is_active = h3_is_active,
.release = h3_release,
};

View File

@ -166,7 +166,16 @@ static size_t hq_interop_snd_buf(struct conn_stream *cs, struct buffer *buf,
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,
};

View File

@ -462,7 +462,11 @@ static void qcs_destroy(struct qcs *qcs)
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;