REORG: mux-h2: extract flags and enums into mux_h2-t.h
Originally in 1.8 we wanted to have an independent mux that could possibly
be disabled and would not impose dependencies on the outside. Everything
would fit into a single C file and that was fine.
Nowadays muxes are unavoidable, and not being able to easily inspect them
from outside is sometimes a bit of a pain. In particular, the flags utility
still cannot be used to decode their flags.
As a first step towards this, this patch moves the flags and enums to
mux_h2-t.h, as well as the two state decoding inline functions. It also
dropped the H2_SS_*_BIT defines that nobody uses. The mux_h2.c file remains
the only one to include that for now.
diff --git a/src/mux_h2.c b/src/mux_h2.c
index 6ee3615..b0fb036 100644
--- a/src/mux_h2.c
+++ b/src/mux_h2.c
@@ -24,6 +24,7 @@
#include <haproxy/htx.h>
#include <haproxy/istbuf.h>
#include <haproxy/log.h>
+#include <haproxy/mux_h2-t.h>
#include <haproxy/net_helper.h>
#include <haproxy/session-t.h>
#include <haproxy/stats.h>
@@ -38,64 +39,8 @@
static const struct h2s *h2_refused_stream;
static const struct h2s *h2_idle_stream;
-/* Connection flags (32 bit), in h2c->flags */
-#define H2_CF_NONE 0x00000000
-/* Flags indicating why writing to the mux is blocked. */
-#define H2_CF_MUX_MALLOC 0x00000001 // mux blocked on lack of connection's mux buffer
-#define H2_CF_MUX_MFULL 0x00000002 // mux blocked on connection's mux buffer full
-#define H2_CF_MUX_BLOCK_ANY 0x00000003 // aggregate of the mux flags above
-
-/* Flags indicating why writing to the demux is blocked.
- * The first two ones directly affect the ability for the mux to receive data
- * from the connection. The other ones affect the mux's ability to demux
- * received data.
- */
-#define H2_CF_DEM_DALLOC 0x00000004 // demux blocked on lack of connection's demux buffer
-#define H2_CF_DEM_DFULL 0x00000008 // demux blocked on connection's demux buffer full
-
-#define H2_CF_DEM_MBUSY 0x00000010 // demux blocked on connection's mux side busy
-#define H2_CF_DEM_MROOM 0x00000020 // demux blocked on lack of room in mux buffer
-#define H2_CF_DEM_SALLOC 0x00000040 // demux blocked on lack of stream's request buffer
-#define H2_CF_DEM_SFULL 0x00000080 // demux blocked on stream request buffer full
-#define H2_CF_DEM_TOOMANY 0x00000100 // demux blocked waiting for some stream connectors to leave
-#define H2_CF_DEM_BLOCK_ANY 0x000001F0 // aggregate of the demux flags above except DALLOC/DFULL
- // (SHORT_READ is also excluded)
-
-#define H2_CF_DEM_SHORT_READ 0x00000200 // demux blocked on incomplete frame
-#define H2_CF_DEM_IN_PROGRESS 0x00000400 // demux in progress (dsi,dfl,dft are valid)
-
-/* other flags */
-#define H2_CF_GOAWAY_SENT 0x00001000 // a GOAWAY frame was successfully sent
-#define H2_CF_GOAWAY_FAILED 0x00002000 // a GOAWAY frame failed to be sent
-#define H2_CF_WAIT_FOR_HS 0x00004000 // We did check that at least a stream was waiting for handshake
-#define H2_CF_IS_BACK 0x00008000 // this is an outgoing connection
-#define H2_CF_WINDOW_OPENED 0x00010000 // demux increased window already advertised
-#define H2_CF_RCVD_SHUT 0x00020000 // a recv() attempt already failed on a shutdown
-#define H2_CF_END_REACHED 0x00040000 // pending data too short with RCVD_SHUT present
-
-#define H2_CF_RCVD_RFC8441 0x00100000 // settings from RFC8441 has been received indicating support for Extended CONNECT
-#define H2_CF_SHTS_UPDATED 0x00200000 // SETTINGS_HEADER_TABLE_SIZE updated
-#define H2_CF_DTSU_EMITTED 0x00400000 // HPACK Dynamic Table Size Update opcode emitted
-
-/* H2 connection state, in h2c->st0 */
-enum h2_cs {
- H2_CS_PREFACE, // init done, waiting for connection preface
- H2_CS_SETTINGS1, // preface OK, waiting for first settings frame
- H2_CS_FRAME_H, // first settings frame ok, waiting for frame header
- H2_CS_FRAME_P, // frame header OK, waiting for frame payload
- H2_CS_FRAME_A, // frame payload OK, trying to send ACK frame
- H2_CS_FRAME_E, // frame payload OK, trying to send RST frame
- H2_CS_ERROR, // send GOAWAY(errcode) and close the connection ASAP
- H2_CS_ERROR2, // GOAWAY(errcode) sent, close the connection ASAP
- H2_CS_ENTRIES // must be last
-} __attribute__((packed));
-
-
-/* 32 buffers: one for the ring's root, rest for the mbuf itself */
-#define H2C_MBUF_CNT 32
-
-/* H2 connection descriptor */
+/**** H2 connection descriptor ****/
struct h2c {
struct connection *conn;
@@ -151,64 +96,6 @@
struct wait_event wait_event; /* To be used if we're waiting for I/Os */
};
-/* 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_ERROR, // an error needs to be sent using RST_STREAM
- H2_SS_CLOSED, // closed
- H2_SS_ENTRIES // must be last
-} __attribute__((packed));
-
-#define H2_SS_MASK(state) (1UL << (state))
-#define H2_SS_IDLE_BIT (1UL << H2_SS_IDLE)
-#define H2_SS_RLOC_BIT (1UL << H2_SS_RLOC)
-#define H2_SS_RREM_BIT (1UL << H2_SS_RREM)
-#define H2_SS_OPEN_BIT (1UL << H2_SS_OPEN)
-#define H2_SS_HREM_BIT (1UL << H2_SS_HREM)
-#define H2_SS_HLOC_BIT (1UL << H2_SS_HLOC)
-#define H2_SS_ERROR_BIT (1UL << H2_SS_ERROR)
-#define H2_SS_CLOSED_BIT (1UL << H2_SS_CLOSED)
-
-/* 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
-
-/* stream flags indicating the reason the stream is blocked */
-#define H2_SF_BLK_MBUSY 0x00000010 // blocked waiting for mux access (transient)
-#define H2_SF_BLK_MROOM 0x00000020 // blocked waiting for room in the mux (must be in send list)
-#define H2_SF_BLK_MFCTL 0x00000040 // blocked due to mux fctl (must be in fctl list)
-#define H2_SF_BLK_SFCTL 0x00000080 // blocked due to stream fctl (must be in blocked list)
-#define H2_SF_BLK_ANY 0x000000F0 // any of the reasons above
-
-/* stream flags indicating how data is supposed to be sent */
-#define H2_SF_DATA_CLEN 0x00000100 // data sent using content-length
-#define H2_SF_BODYLESS_RESP 0x00000200 /* Bodyless response message */
-#define H2_SF_BODY_TUNNEL 0x00000400 // Attempt to establish a Tunnelled stream (the result depends on the status code)
-
-
-#define H2_SF_NOTIFIED 0x00000800 // a paused stream was notified to try to send again
-#define H2_SF_HEADERS_SENT 0x00001000 // a HEADERS frame was sent for this stream
-#define H2_SF_OUTGOING_DATA 0x00002000 // set whenever we've seen outgoing data
-
-#define H2_SF_HEADERS_RCVD 0x00004000 // a HEADERS frame was received for this stream
-
-#define H2_SF_WANT_SHUTR 0x00008000 // a stream couldn't shutr() (mux full/busy)
-#define H2_SF_WANT_SHUTW 0x00010000 // a stream couldn't shutw() (mux full/busy)
-
-#define H2_SF_EXT_CONNECT_SENT 0x00040000 // rfc 8441 an Extended CONNECT has been sent
-#define H2_SF_EXT_CONNECT_RCVD 0x00080000 // rfc 8441 an Extended CONNECT has been received and parsed
-
-#define H2_SF_TUNNEL_ABRT 0x00100000 // A tunnel attempt was aborted
-#define H2_SF_MORE_HTX_DATA 0x00200000 // more data expected from HTX
/* H2 stream descriptor, describing the stream as it appears in the H2C, and as
* it is being processed in the internal HTTP representation (HTX).
@@ -582,38 +469,6 @@
static struct h2s *h2c_bck_stream_new(struct h2c *h2c, struct stconn *sc, struct session *sess);
static void h2s_alert(struct h2s *h2s);
-/* returns a h2c state as an abbreviated 3-letter string, or "???" if unknown */
-static inline const char *h2c_st_to_str(enum h2_cs st)
-{
- switch (st) {
- case H2_CS_PREFACE: return "PRF";
- case H2_CS_SETTINGS1: return "STG";
- case H2_CS_FRAME_H: return "FRH";
- case H2_CS_FRAME_P: return "FRP";
- case H2_CS_FRAME_A: return "FRA";
- case H2_CS_FRAME_E: return "FRE";
- case H2_CS_ERROR: return "ERR";
- case H2_CS_ERROR2: return "ER2";
- default: return "???";
- }
-}
-
-/* returns a h2s state as an abbreviated 3-letter string, or "???" if unknown */
-static inline const char *h2s_st_to_str(enum h2_ss st)
-{
- switch (st) {
- case H2_SS_IDLE: return "IDL"; // idle
- case H2_SS_RLOC: return "RSL"; // reserved local
- case H2_SS_RREM: return "RSR"; // reserved remote
- case H2_SS_OPEN: return "OPN"; // open
- case H2_SS_HREM: return "HCR"; // half-closed remote
- case H2_SS_HLOC: return "HCL"; // half-closed local
- case H2_SS_ERROR : return "ERR"; // error
- case H2_SS_CLOSED: return "CLO"; // closed
- default: return "???";
- }
-}
-
/* returns the stconn associated to the H2 stream */
static forceinline struct stconn *h2s_sc(const struct h2s *h2s)
{