From: Christopher Faulet Date: Mon, 8 Apr 2019 09:22:47 +0000 (+0200) Subject: MEDIUM: muxes: Add an optional input buffer during mux initialization X-Git-Tag: v2.0-dev3~292 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=51f73eb11a24d1a45479b81104033b084aaee050;p=thirdparty%2Fhaproxy.git MEDIUM: muxes: Add an optional input buffer during mux initialization The mux's callback init() now take a pointer to a buffer as extra argument. It must be used by the multiplexer as its input buffer. This buffer is always NULL when a multiplexer is initialized with a fresh connection. But if a mux upgrade is performed, it may be filled with existing data. Note that, for now, mux upgrades are not supported. But this commit is mandatory to do so. --- diff --git a/include/proto/connection.h b/include/proto/connection.h index dba8dea1e1..3a98b349f2 100644 --- a/include/proto/connection.h +++ b/include/proto/connection.h @@ -836,7 +836,7 @@ static inline int conn_install_mux(struct connection *conn, const struct mux_ops conn->mux = mux; conn->ctx = ctx; - ret = mux->init ? mux->init(conn, prx, sess) : 0; + ret = mux->init ? mux->init(conn, prx, sess, &BUF_NULL) : 0; if (ret < 0) { conn->mux = NULL; conn->ctx = NULL; diff --git a/include/types/connection.h b/include/types/connection.h index 1a1409b023..af27d0cd10 100644 --- a/include/types/connection.h +++ b/include/types/connection.h @@ -329,7 +329,7 @@ struct xprt_ops { * layer is not ready yet. */ struct mux_ops { - int (*init)(struct connection *conn, struct proxy *prx, struct session *sess); /* early initialization */ + int (*init)(struct connection *conn, struct proxy *prx, struct session *sess, struct buffer *input); /* early initialization */ int (*wake)(struct connection *conn); /* mux-layer callback to report activity, mandatory */ size_t (*rcv_buf)(struct conn_stream *cs, struct buffer *buf, size_t count, int flags); /* Called from the upper layer to get data */ size_t (*snd_buf)(struct conn_stream *cs, struct buffer *buf, size_t count, int flags); /* Called from the upper layer to send data */ diff --git a/src/mux_h1.c b/src/mux_h1.c index a40ef3f4ae..50afbc20f4 100644 --- a/src/mux_h1.c +++ b/src/mux_h1.c @@ -356,11 +356,15 @@ static const struct cs_info *h1_get_cs_info(struct conn_stream *cs) } /* - * Initialize the mux once it's attached. It is expected that conn->ctx - * points to the existing conn_stream (for outgoing connections) or NULL (for - * incoming ones). Returns < 0 on error. + * Initialize the mux once it's attached. It is expected that conn->ctx points + * to the existing conn_stream (for outgoing connections or for incoming onces + * during a mux upgrade) or NULL (for incoming ones during the connexion + * establishment). is always used as Input buffer and may contain + * data. It is the caller responsibility to not reuse it anymore. Returns < 0 on + * error. */ -static int h1_init(struct connection *conn, struct proxy *proxy, struct session *sess) +static int h1_init(struct connection *conn, struct proxy *proxy, struct session *sess, + struct buffer *input) { struct h1c *h1c; struct task *t = NULL; @@ -372,10 +376,10 @@ static int h1_init(struct connection *conn, struct proxy *proxy, struct session h1c->px = proxy; h1c->flags = H1C_F_NONE; - h1c->ibuf = BUF_NULL; + h1c->ibuf = *input; h1c->obuf = BUF_NULL; h1c->h1s = NULL; - h1c->task = NULL; + h1c->task = NULL; LIST_INIT(&h1c->buf_wait.list); h1c->wait_event.task = tasklet_new(); diff --git a/src/mux_h2.c b/src/mux_h2.c index 5448ea820a..e440424813 100644 --- a/src/mux_h2.c +++ b/src/mux_h2.c @@ -472,10 +472,12 @@ static int h2_avail_streams(struct connection *conn) /* Initialize the mux once it's attached. For outgoing connections, the context * is already initialized before installing the mux, so we detect incoming - * connections from the fact that the context is still NULL. Returns < 0 on - * error. + * connections from the fact that the context is still NULL (even during mux + * upgrades). is always used as Input buffer and may contain data. It is + * the caller responsibility to not reuse it anymore. Returns < 0 on error. */ -static int h2_init(struct connection *conn, struct proxy *prx, struct session *sess) +static int h2_init(struct connection *conn, struct proxy *prx, struct session *sess, + struct buffer *input) { struct h2c *h2c; struct task *t = NULL; @@ -533,7 +535,7 @@ static int h2_init(struct connection *conn, struct proxy *prx, struct session *s h2c->nb_reserved = 0; h2c->stream_cnt = 0; - h2c->dbuf = BUF_NULL; + h2c->dbuf = *input; h2c->dsi = -1; h2c->msi = -1; diff --git a/src/mux_pt.c b/src/mux_pt.c index 4f53920c41..2086d5fd0a 100644 --- a/src/mux_pt.c +++ b/src/mux_pt.c @@ -62,7 +62,8 @@ static struct task *mux_pt_io_cb(struct task *t, void *tctx, unsigned short stat * incoming ones, in which case one will be allocated and a new stream will be * instanciated). Returns < 0 on error. */ -static int mux_pt_init(struct connection *conn, struct proxy *prx, struct session *sess) +static int mux_pt_init(struct connection *conn, struct proxy *prx, struct session *sess, + struct buffer *input) { struct conn_stream *cs = conn->ctx; struct mux_pt_ctx *ctx = pool_alloc(pool_head_pt_ctx);