diff --git a/dev/flags/flags.c b/dev/flags/flags.c index ede3510ed..a8eb81b56 100644 --- a/dev/flags/flags.c +++ b/dev/flags/flags.c @@ -66,61 +66,14 @@ void show_conn_flags(unsigned int f) void show_sd_flags(unsigned int f) { - printf("sd->flags = "); - if (!f) { - printf("0\n"); - return; - } - - SHOW_FLAG(f, SE_FL_APPLET_NEED_CONN); - SHOW_FLAG(f, SE_FL_HAVE_NO_DATA); - SHOW_FLAG(f, SE_FL_WONT_CONSUME); - SHOW_FLAG(f, SE_FL_WAIT_DATA); - SHOW_FLAG(f, SE_FL_KILL_CONN); - SHOW_FLAG(f, SE_FL_WAIT_FOR_HS); - SHOW_FLAG(f, SE_FL_WANT_ROOM); - SHOW_FLAG(f, SE_FL_RCV_MORE); - SHOW_FLAG(f, SE_FL_MAY_SPLICE); - SHOW_FLAG(f, SE_FL_ERR_PENDING); - SHOW_FLAG(f, SE_FL_ERROR); - SHOW_FLAG(f, SE_FL_EOS); - SHOW_FLAG(f, SE_FL_EOI); - SHOW_FLAG(f, SE_FL_WEBSOCKET); - SHOW_FLAG(f, SE_FL_NOT_FIRST); - SHOW_FLAG(f, SE_FL_SHWS); - SHOW_FLAG(f, SE_FL_SHWN); - SHOW_FLAG(f, SE_FL_SHRR); - SHOW_FLAG(f, SE_FL_SHRD); - SHOW_FLAG(f, SE_FL_ORPHAN); - SHOW_FLAG(f, SE_FL_DETACHED); - SHOW_FLAG(f, SE_FL_T_APPLET); - SHOW_FLAG(f, SE_FL_T_MUX); - - if (f) { - printf("EXTRA(0x%08x)", f); - } - putchar('\n'); + se_show_flags(tmpbuf, sizeof(tmpbuf), " | ", f); + printf("sd->flags = %s\n", tmpbuf); } + void show_sc_flags(unsigned int f) { - printf("sc->flags = "); - if (!f) { - printf("0\n"); - return; - } - SHOW_FLAG(f, SC_FL_NEED_ROOM); - SHOW_FLAG(f, SC_FL_NEED_BUFF); - SHOW_FLAG(f, SC_FL_WONT_READ); - SHOW_FLAG(f, SC_FL_INDEP_STR); - SHOW_FLAG(f, SC_FL_DONT_WAKE); - SHOW_FLAG(f, SC_FL_NOHALF); - SHOW_FLAG(f, SC_FL_NOLINGER); - SHOW_FLAG(f, SC_FL_ISBACK); - - if (f) { - printf("EXTRA(0x%08x)", f); - } - putchar('\n'); + sc_show_flags(tmpbuf, sizeof(tmpbuf), " | ", f); + printf("sc->flags = %s\n", tmpbuf); } void show_strm_et(unsigned int f) diff --git a/include/haproxy/stconn-t.h b/include/haproxy/stconn-t.h index 89f1009c9..61996f804 100644 --- a/include/haproxy/stconn-t.h +++ b/include/haproxy/stconn-t.h @@ -24,8 +24,11 @@ #include #include +#include -/* Stream Endpoint Flags */ +/* Stream Endpoint Flags. + * Please also update the se_show_flags() function below in case of changes. + */ enum se_flags { SE_FL_NONE = 0x00000000, /* For initialization purposes */ @@ -81,7 +84,32 @@ enum se_flags { SE_FL_APPLET_NEED_CONN = 0x40000000, /* applet is waiting for the other side to (fail to) connect */ }; -/* stconn flags */ +/* This function is used to report flags in debugging tools. Please reflect + * below any single-bit flag addition above in the same order via the + * __APPEND_FLAG macro. The new end of the buffer is returned. + */ +static forceinline char *se_show_flags(char *buf, size_t len, const char *delim, uint flg) +{ +#define _(f, ...) __APPEND_FLAG(buf, len, delim, flg, f, #f, __VA_ARGS__) + /* prologue */ + _(0); + /* flags */ + _(SE_FL_T_MUX, _(SE_FL_T_APPLET, _(SE_FL_DETACHED, _(SE_FL_ORPHAN, + _(SE_FL_SHRD, _(SE_FL_SHRR, _(SE_FL_SHWN, _(SE_FL_SHWS, + _(SE_FL_NOT_FIRST, _(SE_FL_WEBSOCKET, _(SE_FL_EOI, _(SE_FL_EOS, + _(SE_FL_ERROR, _(SE_FL_ERR_PENDING, _(SE_FL_MAY_SPLICE, + _(SE_FL_RCV_MORE, _(SE_FL_WANT_ROOM, _(SE_FL_WAIT_FOR_HS, + _(SE_FL_KILL_CONN, _(SE_FL_WAIT_DATA, _(SE_FL_WONT_CONSUME, + _(SE_FL_HAVE_NO_DATA, _(SE_FL_APPLET_NEED_CONN))))))))))))))))))))))); + /* epilogue */ + _(~0U); + return buf; +#undef _ +} + +/* stconn flags. + * Please also update the sc_show_flags() function below in case of changes. + */ enum sc_flags { SC_FL_NONE = 0x00000000, /* Just for initialization purposes */ SC_FL_ISBACK = 0x00000001, /* Set for SC on back-side */ @@ -99,6 +127,25 @@ enum sc_flags { SC_FL_NEED_ROOM = 0x00000200, /* SC needs more room in the rx buffer to store incoming data */ }; +/* This function is used to report flags in debugging tools. Please reflect + * below any single-bit flag addition above in the same order via the + * __APPEND_FLAG macro. The new end of the buffer is returned. + */ +static forceinline char *sc_show_flags(char *buf, size_t len, const char *delim, uint flg) +{ +#define _(f, ...) __APPEND_FLAG(buf, len, delim, flg, f, #f, __VA_ARGS__) + /* prologue */ + _(0); + /* flags */ + _(SC_FL_ISBACK, _(SC_FL_NOLINGER, _(SC_FL_NOHALF, + _(SC_FL_DONT_WAKE, _(SC_FL_INDEP_STR, _(SC_FL_WONT_READ, + _(SC_FL_NEED_BUFF, _(SC_FL_NEED_ROOM)))))))); + /* epilogue */ + _(~0U); + return buf; +#undef _ +} + /* A conn stream must have its own errors independently of the buffer's, so that * applications can rely on what the buffer reports while the conn stream is * performing some retries (eg: connection error). Some states are transient and