MINOR: conn_stream: add an rx buffer to the conn_stream

In order to reorganize the connection layers, recv() operations will
need to be retryable and to support partial transfers. This requires
an intermediary buffer to hold the data coming from the mux. After a
few attempts, it turns out that this buffer is best placed inside the
conn_stream itself. For now it's only set to buf_empty and it will be
up to the caller to allocate it if required.
diff --git a/include/proto/connection.h b/include/proto/connection.h
index 8344c95..ce7ef38 100644
--- a/include/proto/connection.h
+++ b/include/proto/connection.h
@@ -601,6 +601,7 @@
 	LIST_INIT(&cs->wait_list.list);
 	LIST_INIT(&cs->send_wait_list);
 	cs->conn = conn;
+	cs->rxbuf = BUF_NULL;
 }
 
 /* Initializes all required fields for a new connection. Note that it does the
@@ -661,11 +662,26 @@
 	return conn;
 }
 
-/* Releases a conn_stream previously allocated by cs_new() */
+/* Releases the conn_stream's rx buf if it exists. The buffer is automatically
+ * replaced with a pointer to the empty buffer.
+ */
+static inline void cs_drop_rxbuf(struct conn_stream *cs)
+{
+	if (b_size(&cs->rxbuf)) {
+		b_free(&cs->rxbuf);
+		offer_buffers(NULL, tasks_run_queue);
+	}
+}
+
+/* Releases a conn_stream previously allocated by cs_new(), as well as any
+ * buffer it would still hold.
+ */
 static inline void cs_free(struct conn_stream *cs)
 {
 	if (cs->wait_list.task)
 		tasklet_free(cs->wait_list.task);
+
+	cs_drop_rxbuf(cs);
 	pool_free(pool_head_connstream, cs);
 }
 
diff --git a/include/types/connection.h b/include/types/connection.h
index 16a82bb..3a66ed5 100644
--- a/include/types/connection.h
+++ b/include/types/connection.h
@@ -367,10 +367,12 @@
  */
 struct conn_stream {
 	enum obj_type obj_type;              /* differentiates connection from applet context */
+	/* 3 bytes hole here */
 	unsigned int flags;                  /* CS_FL_* */
 	struct connection *conn;             /* xprt-level connection */
 	struct wait_list wait_list;          /* We're in a wait list for send */
 	struct list send_wait_list;          /* list of tasks to wake when we're ready to send */
+	struct buffer rxbuf;                 /* receive buffer, always valid (buf_empty or real buffer) */
 	void *data;                          /* pointer to upper layer's entity (eg: stream interface) */
 	const struct data_cb *data_cb;       /* data layer callbacks. Must be set before xprt->init() */
 	void *ctx;                           /* mux-specific context */