MINOR: h2: create the h2s struct and the associated pool
This describes an HTTP/2 stream with its relation to the connection
and to the conn_stream on the other side.
For now we also allocate request and response state for HTTP/1 because
the internal HTTP representation is HTTP/1 at the moment. Later this
should evolve towards a version-agnostic representation and this H1
message state will disappear.
It's important to consider that the streams are necessarily polarized
depending on h2c : if the connection is incoming, streams initiated by
the connection receive requests and send responses. Otherwise it's the
other way around. Such information is known during the connection
instanciation by h2c_frt_init() and will normally be reflected in the
stream ID (odd=demux from client, even=demux from server). The initial
H2_CS_PREFACE state will also depend on the direction. The current h2c
state machine doesn't allow for outgoing connections as it uses a single
state for both (rx state only). It should be the demux state only.
diff --git a/src/mux_h2.c b/src/mux_h2.c
index 7a2c588..ba3b6af 100644
--- a/src/mux_h2.c
+++ b/src/mux_h2.c
@@ -21,6 +21,8 @@
/* the h2c connection pool */
static struct pool_head *pool2_h2c;
+/* the h2s stream pool */
+static struct pool_head *pool2_h2s;
/* Connection flags (32 bit), in h2c->flags */
#define H2_CF_NONE 0x00000000
@@ -77,6 +79,41 @@
struct list fctl_list; /* list of streams blocked by connection's fctl */
};
+/* H2 stream state, in h2s->st */
+enum h2_ss {
+ H2_SS_IDLE = 0, // idle
+ H2_SS_RLOC, // reserved(local)
+ H2_SS_RREM, // reserved(remote)
+ H2_SS_OPEN, // open
+ H2_SS_HREM, // half-closed(remote)
+ H2_SS_HLOC, // half-closed(local)
+ H2_SS_CLOSED, // closed
+ H2_SS_ENTRIES // must be last
+} __attribute__((packed));
+
+/* HTTP/2 stream flags (32 bit), in h2s->flags */
+#define H2_SF_NONE 0x00000000
+#define H2_SF_ES_RCVD 0x00000001
+#define H2_SF_ES_SENT 0x00000002
+
+#define H2_SF_RST_RCVD 0x00000004 // received RST_STREAM
+#define H2_SF_RST_SENT 0x00000008 // sent RST_STREAM
+
+/* H2 stream descriptor, describing the stream as it appears in the H2C, and as
+ * it is being processed in the internal HTTP representation (H1 for now).
+ */
+struct h2s {
+ struct conn_stream *cs;
+ struct h2c *h2c;
+ struct h1m req, res; /* request and response parser state for H1 */
+ struct eb32_node by_id; /* place in h2c's streams_by_id */
+ struct list list; /* position in active/blocked lists if blocked>0 */
+ int32_t id; /* stream ID */
+ uint32_t flags; /* H2_SF_* */
+ int mws; /* mux window size for this stream */
+ enum h2_err errcode; /* H2 err code (H2_ERR_*) */
+ enum h2_ss st;
+};
/* a few settings from the global section */
static int h2_settings_header_table_size = 4096; /* initial value */
@@ -278,6 +315,7 @@
static void __h2_deinit(void)
{
+ pool_destroy2(pool2_h2s);
pool_destroy2(pool2_h2c);
}
@@ -288,4 +326,5 @@
cfg_register_keywords(&cfg_kws);
hap_register_post_deinit(__h2_deinit);
pool2_h2c = create_pool("h2c", sizeof(struct h2c), MEM_F_SHARED);
+ pool2_h2s = create_pool("h2s", sizeof(struct h2s), MEM_F_SHARED);
}