diff --git a/include/proto/stream_interface.h b/include/proto/stream_interface.h index 2f6a7a5be..64aa9af94 100644 --- a/include/proto/stream_interface.h +++ b/include/proto/stream_interface.h @@ -138,6 +138,20 @@ static inline void si_set_state(struct stream_interface *si, int state) si->state = si->prev_state = state; } +/* returns a bit for a stream-int state, to match against SI_SB_* */ +static inline enum si_state_bit si_state_bit(enum si_state state) +{ + BUG_ON(state < SI_ST_INI || state > SI_ST_CLO); + return 1U << state; +} + +/* returns true if matches one of the SI_SB_* bits in */ +static inline int si_state_in(enum si_state state, enum si_state_bit mask) +{ + BUG_ON(mask & ~SI_SB_ALL); + return !!(si_state_bit(state) & mask); +} + /* only detaches the endpoint from the SI, which means that it's set to * NULL and that ->ops is mapped to si_embedded_ops. The previous endpoint * is returned. diff --git a/include/types/stream_interface.h b/include/types/stream_interface.h index e11a6c903..86df1d269 100644 --- a/include/types/stream_interface.h +++ b/include/types/stream_interface.h @@ -43,6 +43,22 @@ enum si_state { SI_ST_CLO, /* stream intf closed, might not existing anymore. Buffers shut. */ } __attribute__((packed)); +/* state bits for use with lists of states */ +enum si_state_bit { + SI_SB_NONE = 0, + SI_SB_INI = 1U << SI_ST_INI, + SI_SB_REQ = 1U << SI_ST_REQ, + SI_SB_QUE = 1U << SI_ST_QUE, + SI_SB_TAR = 1U << SI_ST_TAR, + SI_SB_ASS = 1U << SI_ST_ASS, + SI_SB_CON = 1U << SI_ST_CON, + SI_SB_CER = 1U << SI_ST_CER, + SI_SB_EST = 1U << SI_ST_EST, + SI_SB_DIS = 1U << SI_ST_DIS, + SI_SB_CLO = 1U << SI_ST_CLO, + SI_SB_ALL = SI_SB_INI|SI_SB_REQ|SI_SB_QUE|SI_SB_TAR|SI_SB_ASS|SI_SB_CON|SI_SB_CER|SI_SB_EST|SI_SB_DIS|SI_SB_CLO, +}; + /* error types reported on the streams interface for more accurate reporting */ enum { SI_ET_NONE = 0x0000, /* no error yet, leave it to zero */