MUX_CTL_REVERSE_CONN, /* Notify about an active reverse connection accepted. */
MUX_CTL_SUBS_RECV, /* Notify the mux it must wait for read events again */
MUX_CTL_GET_GLITCHES, /* returns number of glitches on the connection */
+ MUX_CTL_GET_NBSTRM, /* Return the current number of streams on the connection */
+ MUX_CTL_GET_MAXSTRM, /* Return the max number of streams supported by the connection */
};
/* sctl command used by mux->sctl() */
static int fcgi_ctl(struct connection *conn, enum mux_ctl_type mux_ctl, void *output)
{
+ struct fcgi_conn *fconn = conn->ctx;
int ret = 0;
+
switch (mux_ctl) {
case MUX_CTL_STATUS:
if (!(conn->flags & CO_FL_WAIT_XPRT))
return ret;
case MUX_CTL_EXIT_STATUS:
return MUX_ES_UNKNOWN;
+ case MUX_CTL_GET_NBSTRM:
+ return fconn->nb_streams;
+ case MUX_CTL_GET_MAXSTRM:
+ return fconn->streams_limit;
default:
return -1;
}
if (!(h1c->wait_event.events & SUB_RETRY_RECV))
h1c->conn->xprt->subscribe(h1c->conn, h1c->conn->xprt_ctx, SUB_RETRY_RECV, &h1c->wait_event);
return 0;
+ case MUX_CTL_GET_NBSTRM:
+ return h1_used_streams(conn);
+ case MUX_CTL_GET_MAXSTRM:
+ return 1;
default:
return -1;
}
case MUX_CTL_GET_GLITCHES:
return h2c->glitches;
+ case MUX_CTL_GET_NBSTRM:
+ return h2c->nb_streams;
+
+ case MUX_CTL_GET_MAXSTRM:
+ return h2c->streams_limit;
+
default:
return -1;
}
static int mux_pt_ctl(struct connection *conn, enum mux_ctl_type mux_ctl, void *output)
{
int ret = 0;
+
switch (mux_ctl) {
case MUX_CTL_STATUS:
if (!(conn->flags & CO_FL_WAIT_XPRT))
return ret;
case MUX_CTL_EXIT_STATUS:
return MUX_ES_UNKNOWN;
+ case MUX_CTL_GET_NBSTRM:
+ return mux_pt_used_streams(conn);
+ case MUX_CTL_GET_MAXSTRM:
+ return 1;
default:
return -1;
}
case MUX_CTL_EXIT_STATUS:
return MUX_ES_UNKNOWN;
+ case MUX_CTL_GET_NBSTRM: {
+ struct qcs *qcs;
+ unsigned int nb_strm = qcc->nb_sc;
+
+ list_for_each_entry(qcs, &qcc->opening_list, el_opening)
+ nb_strm++;
+ return nb_strm;
+ }
+
+ case MUX_CTL_GET_MAXSTRM:
+ return qcc->lfctl.ms_bidi_init;
+
default:
return -1;
}