/**** SPOP stream flags (32 bit), in spop_strm->flags ****/
#define SPOP_SF_NONE 0x00000000
-// #define SPOP_SF_ACK_RCVD 0x00000001 /* ACK freme received */
+#define SPOP_SF_ACK_RCVD 0x00000001 /* ACK freme received */
//#define SPOP_SF_ES_SENT 0x00000002 /* end-of-stream sent */
//#define SPOP_SF_EP_SENT 0x00000004 /* end-of-param sent */
//#define SPOP_SF_DISCON_SENT 0x00000008 /* disconnect sent */
/* prologue */
_(0);
/* flags */
- _(SPOP_SF_BLK_MBUSY, _(SPOP_SF_BLK_MROOM, _(SPOP_SF_NOTIFIED)));
+ _(SPOP_SF_ACK_RCVD, _(SPOP_SF_BLK_MBUSY, _(SPOP_SF_BLK_MROOM, _(SPOP_SF_NOTIFIED))));
/* epilogue */
_(~0U);
return buf;
*/
static inline void spop_strm_propagate_term_flags(struct spop_conn *spop_conn, struct spop_strm *spop_strm)
{
+ if (spop_strm->flags & SPOP_SF_ACK_RCVD) {
+ se_fl_set(spop_strm->sd, SE_FL_EOI);
+ }
if (spop_conn_read0_pending(spop_conn) || spop_strm->state == SPOP_SS_CLOSED) {
se_fl_set(spop_strm->sd, SE_FL_EOS);
- if (spop_conn->errcode)
+ if (!se_fl_test(spop_strm->sd, SE_FL_EOI))
se_fl_set(spop_strm->sd, SE_FL_ERROR);
}
if (se_fl_test(spop_strm->sd, SE_FL_ERR_PENDING))
}
if (spop_conn->state == SPOP_CS_CLOSED || (spop_conn->flags & (SPOP_CF_ERR_PENDING|SPOP_CF_ERROR))) {
- if (spop_conn->state == SPOP_CS_CLOSED || (spop_conn->flags & SPOP_CF_ERROR))
- se_fl_set(spop_strm->sd, SE_FL_EOS);
se_fl_set_error(spop_strm->sd);
+ spop_strm_propagate_term_flags(spop_conn, spop_strm);
if (!spop_strm->sd->abort_info.info) {
spop_strm->sd->abort_info.info = (SE_ABRT_SRC_MUX_SPOP << SE_ABRT_SRC_SHIFT);
spop_strm->sd->abort_info.code = spop_conn->errcode;
spop_strm_close(spop_strm);
end:
+ spop_strm->flags |= SPOP_SF_ACK_RCVD;
TRACE_PROTO("SPOP AGENT ACK frame rcvd", SPOP_EV_RX_FRAME|SPOP_EV_RX_ACK, spop_conn->conn, spop_strm, 0, (size_t[]){sent});
spop_conn->state = SPOP_CS_FRAME_H;
TRACE_LEAVE(SPOP_EV_RX_FRAME|SPOP_EV_RX_ACK, spop_conn->conn, spop_strm);
(b_data(&spop_strm->rxbuf) ||
spop_conn_read0_pending(spop_conn) ||
spop_strm->state == SPOP_SS_CLOSED ||
+ (spop_strm->flags & SPOP_SF_ACK_RCVD) ||
se_fl_test(spop_strm->sd, SE_FL_ERROR | SE_FL_ERR_PENDING | SE_FL_EOS))) {
/* we may have to signal the upper layers */
TRACE_DEVEL("notifying stream before switching SID", SPOP_EV_RX_FRAME|SPOP_EV_STRM_WAKE, spop_conn->conn, spop_strm);
(b_data(&spop_strm->rxbuf) ||
spop_conn_read0_pending(spop_conn) ||
spop_strm->state == SPOP_SS_CLOSED ||
+ (spop_strm->flags & SPOP_SF_ACK_RCVD) ||
se_fl_test(spop_strm->sd, SE_FL_ERROR | SE_FL_ERR_PENDING | SE_FL_EOS))) {
/* we may have to signal the upper layers */
TRACE_DEVEL("notifying stream before switching SID", SPOP_EV_RX_FRAME|SPOP_EV_STRM_WAKE, spop_conn->conn, spop_strm);