/* This bit is set for unidirectional streams */
#define QCS_ID_DIR_BIT 0x2
+/* Maximum bidirectional stream ID that a client can opened. */
+#define QCS_ID_MAX_STRM_CL_BIDI (QUIC_VARINT_8_BYTE_MAX - 3)
+
static inline enum qcs_type qcs_id_type(uint64_t id)
{
return id & QCS_ID_TYPE_MASK;
{
struct server *srv = __objt_server(conn->target);
struct qcc *qcc = conn->ctx;
- int max_fctl, max_reuse = 0;
+ int ret, max_reuse = 0;
- max_fctl = qcc_fctl_avail_streams(qcc, 1);
+ ret = qcc_fctl_avail_streams(qcc, 1);
if (srv->max_reuse >= 0) {
max_reuse = qcc->tot_sc <= srv->max_reuse ?
srv->max_reuse - qcc->tot_sc + 1: 0;
- return MIN(max_fctl, max_reuse);
- }
- else {
- return max_fctl;
+ ret = MIN(ret, max_reuse);
}
+
+ /* Ensure we do not exceed the maximum usable stream ID. */
+ if (unlikely(ret > QCS_ID_MAX_STRM_CL_BIDI - qcc->next_bidi_l))
+ ret = QCS_ID_MAX_STRM_CL_BIDI - qcc->next_bidi_l;
+
+ return ret;
}
/* Returns the number of streams currently attached into <conn> connection.