CLEANUP: connection: rename subscription events values and event field

The SUB_CAN_SEND/SUB_CAN_RECV enum values have been confusing a few
times, especially when checking them on reading. After some discussion,
it appears that calling them SUB_RETRY_SEND/SUB_RETRY_RECV more
accurately reflects their purpose since these events may only appear
after a first attempt to perform the I/O operation has failed or was
not completed.

In addition the wait_reason field in struct wait_event which carries
them makes one think that a single reason may happen at once while
it is in fact a set of events. Since the struct is called wait_event
it makes sense that this field is called "events" to indicate it's the
list of events we're subscribed to.

Last, the values for SUB_RETRY_RECV/SEND were swapped so that value
1 corresponds to recv and 2 to send, as is done almost everywhere else
in the code an in the shutdown() call.
diff --git a/include/proto/connection.h b/include/proto/connection.h
index 6be311c..05148bb 100644
--- a/include/proto/connection.h
+++ b/include/proto/connection.h
@@ -650,11 +650,11 @@
 static inline void conn_force_unsubscribe(struct connection *conn)
 {
 	if (conn->recv_wait) {
-		conn->recv_wait->wait_reason &= ~SUB_CAN_RECV;
+		conn->recv_wait->events &= ~SUB_RETRY_RECV;
 		conn->recv_wait = NULL;
 	}
 	if (conn->send_wait) {
-		conn->send_wait->wait_reason &= ~SUB_CAN_SEND;
+		conn->send_wait->events &= ~SUB_RETRY_SEND;
 		conn->send_wait = NULL;
 	}
 
diff --git a/include/proto/stream_interface.h b/include/proto/stream_interface.h
index 2874664..2a896af 100644
--- a/include/proto/stream_interface.h
+++ b/include/proto/stream_interface.h
@@ -130,7 +130,7 @@
 		return -1;
 	si->wait_event.task->process    = si_cs_io_cb;
 	si->wait_event.task->context = si;
-	si->wait_event.wait_reason = 0;
+	si->wait_event.events = 0;
 	return 0;
 }
 
@@ -169,8 +169,8 @@
 		return;
 
 	if ((cs = objt_cs(si->end))) {
-		if (si->wait_event.wait_reason != 0)
-			cs->conn->mux->unsubscribe(cs, si->wait_event.wait_reason,
+		if (si->wait_event.events != 0)
+			cs->conn->mux->unsubscribe(cs, si->wait_event.events,
 			    &si->wait_event);
 		cs_destroy(cs);
 	}
@@ -461,7 +461,7 @@
 	if (!cs)
 		return 0; // only conn_streams are supported
 
-	if (si->wait_event.wait_reason & SUB_CAN_RECV)
+	if (si->wait_event.events & SUB_RETRY_RECV)
 		return 0; // already subscribed
 
 	if (!si_rx_endp_ready(si) || si_rx_blocked(si))
diff --git a/include/types/connection.h b/include/types/connection.h
index 3b7f4e1..430e92a 100644
--- a/include/types/connection.h
+++ b/include/types/connection.h
@@ -47,16 +47,19 @@
 struct session;
 struct pipe;
 
+/* Note: subscribing to these events is only valid after the caller has really
+ * attempted to perform the operation, and failed to proceed or complete.
+ */
 enum sub_event_type {
-	SUB_CAN_SEND        = 0x00000001,  /* Schedule the tasklet when we can send more */
-	SUB_CAN_RECV        = 0x00000002,  /* Schedule the tasklet when we can recv more */
-	SUB_CALL_UNSUBSCRIBE = 0x00000004, /* The mux wants its unsubscribe() method to be called before destruction of the underlying object */
+	SUB_RETRY_RECV       = 0x00000001,  /* Schedule the tasklet when we can attempt to recv again */
+	SUB_RETRY_SEND       = 0x00000002,  /* Schedule the tasklet when we can attempt to send again */
+	SUB_CALL_UNSUBSCRIBE = 0x00000004,  /* The mux wants its unsubscribe() method to be called before destruction of the underlying object */
 };
 
 struct wait_event {
 	struct tasklet *task;
 	void *handle;           /* To be used by the callee */
-	int wait_reason;
+	int events;             /* set of enum sub_event_type above */
 };
 
 /* A connection handle is how we differentiate two connections on the lower
diff --git a/src/checks.c b/src/checks.c
index e4bb732..cb89f2f 100644
--- a/src/checks.c
+++ b/src/checks.c
@@ -712,9 +712,9 @@
 	struct check *check = ctx;
 	struct conn_stream *cs = check->cs;
 
-	if (!(check->wait_list.wait_reason & SUB_CAN_SEND))
+	if (!(check->wait_list.events & SUB_RETRY_SEND))
 		wake_srv_chk(cs);
-	if (!(check->wait_list.wait_reason & SUB_CAN_RECV)) {
+	if (!(check->wait_list.events & SUB_RETRY_RECV)) {
 		HA_SPIN_LOCK(SERVER_LOCK, &check->server->lock);
 		__event_srv_chk_r(cs);
 		HA_SPIN_UNLOCK(SERVER_LOCK, &check->server->lock);
@@ -739,7 +739,7 @@
 		goto out_wakeup;
 
 	if (conn->flags & CO_FL_HANDSHAKE) {
-		cs->conn->mux->subscribe(cs, SUB_CAN_SEND, &check->wait_list);
+		cs->conn->mux->subscribe(cs, SUB_RETRY_SEND, &check->wait_list);
 		goto out;
 	}
 
@@ -773,7 +773,7 @@
 			goto out_wakeup;
 		}
 		if (b_data(&check->bo)) {
-			conn->mux->subscribe(cs, SUB_CAN_SEND, &check->wait_list);
+			conn->mux->subscribe(cs, SUB_RETRY_SEND, &check->wait_list);
 			goto out;
 		}
 	}
@@ -824,7 +824,7 @@
 		goto out_wakeup;
 
 	if (conn->flags & CO_FL_HANDSHAKE) {
-		cs->conn->mux->subscribe(cs, SUB_CAN_RECV, &check->wait_list);
+		cs->conn->mux->subscribe(cs, SUB_RETRY_RECV, &check->wait_list);
 		goto out;
 	}
 
@@ -1380,7 +1380,7 @@
 	return;
 
  wait_more_data:
-	cs->conn->mux->subscribe(cs, SUB_CAN_RECV, &check->wait_list);
+	cs->conn->mux->subscribe(cs, SUB_RETRY_RECV, &check->wait_list);
         goto out;
 }
 
@@ -1403,7 +1403,7 @@
 		ret = tcpcheck_main(check);
 		cs = check->cs;
 		conn = cs->conn;
-	} else if (!(check->wait_list.wait_reason & SUB_CAN_SEND))
+	} else if (!(check->wait_list.events & SUB_RETRY_SEND))
 		__event_srv_chk_w(cs);
 
 	if (unlikely(conn->flags & CO_FL_ERROR || cs->flags & CS_FL_ERROR)) {
@@ -1576,7 +1576,7 @@
 		return SF_ERR_RESOURCE;
 	conn = cs->conn;
 	/* Maybe there were an older connection we were waiting on */
-	check->wait_list.wait_reason = 0;
+	check->wait_list.events = 0;
 
 	if (is_addr(&check->addr)) {
 		/* we'll connect to the check addr specified on the server */
@@ -2693,7 +2693,7 @@
 				break;
 			}
 			if (b_data(&check->bo)) {
-				cs->conn->mux->subscribe(cs, SUB_CAN_SEND, &check->wait_list);
+				cs->conn->mux->subscribe(cs, SUB_RETRY_SEND, &check->wait_list);
 				goto out;
 			}
 		}
@@ -2755,7 +2755,7 @@
 			check->cs = cs;
 			conn = cs->conn;
 			/* Maybe there were an older connection we were waiting on */
-			check->wait_list.wait_reason = 0;
+			check->wait_list.events = 0;
 			conn->target = &s->obj_type;
 
 			/* no client address */
@@ -2919,7 +2919,7 @@
 					}
 				}
 				else {
-					conn->mux->subscribe(cs, SUB_CAN_RECV, &check->wait_list);
+					conn->mux->subscribe(cs, SUB_RETRY_RECV, &check->wait_list);
 					break;
 				}
 			}
@@ -3112,7 +3112,7 @@
 	check->wait_list.task = tasklet_new();
 	if (!check->wait_list.task)
 		return "out of memroy while allocating check tasklet";
-	check->wait_list.wait_reason = 0;
+	check->wait_list.events = 0;
 	check->wait_list.task->process = event_srv_chk_io;
 	check->wait_list.task->context = check;
 	return NULL;
diff --git a/src/connection.c b/src/connection.c
index 2b0063e..37e48c5 100644
--- a/src/connection.c
+++ b/src/connection.c
@@ -112,7 +112,7 @@
 		 */
 		flags = 0;
 		if (conn->send_wait != NULL) {
-			conn->send_wait->wait_reason &= ~SUB_CAN_SEND;
+			conn->send_wait->events &= ~SUB_RETRY_SEND;
 			tasklet_wakeup(conn->send_wait->task);
 			conn->send_wait = NULL;
 		} else
@@ -132,7 +132,7 @@
 		 */
 		flags = 0;
 		if (conn->recv_wait) {
-			conn->recv_wait->wait_reason &= ~SUB_CAN_RECV;
+			conn->recv_wait->events &= ~SUB_RETRY_RECV;
 			tasklet_wakeup(conn->recv_wait->task);
 			conn->recv_wait = NULL;
 		} else
@@ -320,19 +320,19 @@
 {
 	struct wait_event *sw;
 
-	if (event_type & SUB_CAN_RECV) {
+	if (event_type & SUB_RETRY_RECV) {
 		sw = param;
-		if (sw->wait_reason & SUB_CAN_RECV) {
+		if (sw->events & SUB_RETRY_RECV) {
 			conn->recv_wait = NULL;
-			sw->wait_reason &= ~SUB_CAN_RECV;
+			sw->events &= ~SUB_RETRY_RECV;
 		}
 		__conn_xprt_stop_recv(conn);
 	}
-	if (event_type & SUB_CAN_SEND) {
+	if (event_type & SUB_RETRY_SEND) {
 		sw = param;
-		if (sw->wait_reason & SUB_CAN_SEND) {
+		if (sw->events & SUB_RETRY_SEND) {
 			conn->send_wait = NULL;
-			sw->wait_reason &= ~SUB_CAN_SEND;
+			sw->events &= ~SUB_RETRY_SEND;
 		}
 		__conn_xprt_stop_send(conn);
 	}
@@ -344,22 +344,22 @@
 {
 	struct wait_event *sw;
 
-	if (event_type & SUB_CAN_RECV) {
+	if (event_type & SUB_RETRY_RECV) {
 		sw = param;
-		if (!(sw->wait_reason & SUB_CAN_RECV)) {
-			sw->wait_reason |= SUB_CAN_RECV;
+		if (!(sw->events & SUB_RETRY_RECV)) {
+			sw->events |= SUB_RETRY_RECV;
 			conn->recv_wait = sw;
 		}
-		event_type &= ~SUB_CAN_RECV;
+		event_type &= ~SUB_RETRY_RECV;
 		__conn_xprt_want_recv(conn);
 	}
-	if (event_type & SUB_CAN_SEND) {
+	if (event_type & SUB_RETRY_SEND) {
 		sw = param;
-		if (!(sw->wait_reason & SUB_CAN_SEND)) {
-			sw->wait_reason |= SUB_CAN_SEND;
+		if (!(sw->events & SUB_RETRY_SEND)) {
+			sw->events |= SUB_RETRY_SEND;
 			conn->send_wait = sw;
 		}
-		event_type &= ~SUB_CAN_SEND;
+		event_type &= ~SUB_RETRY_SEND;
 		__conn_xprt_want_send(conn);
 	}
 	if (event_type != 0)
diff --git a/src/mux_h1.c b/src/mux_h1.c
index af2ce77..bca4773 100644
--- a/src/mux_h1.c
+++ b/src/mux_h1.c
@@ -321,9 +321,9 @@
 		h1c->h1s = NULL;
 
 		if (h1s->recv_wait != NULL)
-			h1s->recv_wait->wait_reason &= ~SUB_CAN_RECV;
+			h1s->recv_wait->events &= ~SUB_RETRY_RECV;
 		if (h1s->send_wait != NULL)
-			h1s->send_wait->wait_reason &= ~SUB_CAN_SEND;
+			h1s->send_wait->events &= ~SUB_RETRY_SEND;
 
 		h1c->flags &= ~H1C_F_IN_BUSY;
 		h1c->flags |= H1C_F_WAIT_NEXT_REQ;
@@ -370,7 +370,7 @@
 		goto fail;
 	h1c->wait_event.task->process = h1_io_cb;
 	h1c->wait_event.task->context = h1c;
-	h1c->wait_event.wait_reason   = 0;
+	h1c->wait_event.events   = 0;
 
 	if (!(conn->flags & CO_FL_CONNECTED))
 		h1c->flags |= H1C_F_CS_WAIT_CONN;
@@ -421,8 +421,8 @@
 			tasklet_free(h1c->wait_event.task);
 
 		h1s_destroy(h1c->h1s);
-		if (h1c->wait_event.wait_reason != 0)
-			conn->xprt->unsubscribe(conn, h1c->wait_event.wait_reason,
+		if (h1c->wait_event.events != 0)
+			conn->xprt->unsubscribe(conn, h1c->wait_event.events,
 			    &h1c->wait_event);
 		pool_free(pool_head_h1c, h1c);
 	}
@@ -1624,7 +1624,7 @@
 static void h1_wake_stream_for_recv(struct h1s *h1s)
 {
 	if (h1s && h1s->recv_wait) {
-		h1s->recv_wait->wait_reason &= ~SUB_CAN_RECV;
+		h1s->recv_wait->events &= ~SUB_RETRY_RECV;
 		tasklet_wakeup(h1s->recv_wait->task);
 		h1s->recv_wait = NULL;
 	}
@@ -1632,7 +1632,7 @@
 static void h1_wake_stream_for_send(struct h1s *h1s)
 {
 	if (h1s && h1s->send_wait) {
-		h1s->send_wait->wait_reason &= ~SUB_CAN_SEND;
+		h1s->send_wait->events &= ~SUB_RETRY_SEND;
 		tasklet_wakeup(h1s->send_wait->task);
 		h1s->send_wait = NULL;
 	}
@@ -1648,7 +1648,7 @@
 	size_t ret = 0, max;
 	int rcvd = 0;
 
-	if (h1c->wait_event.wait_reason & SUB_CAN_RECV)
+	if (h1c->wait_event.events & SUB_RETRY_RECV)
 		return (b_data(&h1c->ibuf));
 
 	if (!h1_recv_allowed(h1c)) {
@@ -1700,7 +1700,7 @@
 		goto end;
 	}
 
-	conn->xprt->subscribe(conn, SUB_CAN_RECV, &h1c->wait_event);
+	conn->xprt->subscribe(conn, SUB_RETRY_RECV, &h1c->wait_event);
 
   end:
 	if (ret > 0 || (conn->flags & CO_FL_ERROR) || conn_xprt_read0_pending(conn))
@@ -1730,8 +1730,8 @@
 		return 0;
 
 	if (h1c->flags & H1C_F_CS_WAIT_CONN) {
-		if (!(h1c->wait_event.wait_reason & SUB_CAN_SEND))
-			conn->xprt->subscribe(conn, SUB_CAN_SEND, &h1c->wait_event);
+		if (!(h1c->wait_event.events & SUB_RETRY_SEND))
+			conn->xprt->subscribe(conn, SUB_RETRY_SEND, &h1c->wait_event);
 		return 0;
 	}
 
@@ -1764,8 +1764,8 @@
 		if (h1c->flags & H1C_F_CS_SHUTW_NOW)
 			h1_shutw_conn(conn);
 	}
-	else if (!(h1c->wait_event.wait_reason & SUB_CAN_SEND))
-		conn->xprt->subscribe(conn, SUB_CAN_SEND, &h1c->wait_event);
+	else if (!(h1c->wait_event.events & SUB_RETRY_SEND))
+		conn->xprt->subscribe(conn, SUB_RETRY_SEND, &h1c->wait_event);
 
 	return sent;
 }
@@ -1832,9 +1832,9 @@
 	struct h1c *h1c = ctx;
 	int ret = 0;
 
-	if (!(h1c->wait_event.wait_reason & SUB_CAN_SEND))
+	if (!(h1c->wait_event.events & SUB_RETRY_SEND))
 		ret = h1_send(h1c);
-	if (!(h1c->wait_event.wait_reason & SUB_CAN_RECV))
+	if (!(h1c->wait_event.events & SUB_RETRY_RECV))
 		ret |= h1_recv(h1c);
 	if (ret || !h1c->h1s)
 		h1_process(h1c);
@@ -2052,17 +2052,17 @@
 	if (!h1s)
 		return 0;
 
-	if (event_type & SUB_CAN_RECV) {
+	if (event_type & SUB_RETRY_RECV) {
 		sw = param;
 		if (h1s->recv_wait == sw) {
-			sw->wait_reason &= ~SUB_CAN_RECV;
+			sw->events &= ~SUB_RETRY_RECV;
 			h1s->recv_wait = NULL;
 		}
 	}
-	if (event_type & SUB_CAN_SEND) {
+	if (event_type & SUB_RETRY_SEND) {
 		sw = param;
 		if (h1s->send_wait == sw) {
-			sw->wait_reason &= ~SUB_CAN_SEND;
+			sw->events &= ~SUB_RETRY_SEND;
 			h1s->send_wait = NULL;
 		}
 	}
@@ -2079,18 +2079,18 @@
 		return -1;
 
 	switch (event_type) {
-		case SUB_CAN_RECV:
+		case SUB_RETRY_RECV:
 			sw = param;
-			if (!(sw->wait_reason & SUB_CAN_RECV)) {
-				sw->wait_reason |= SUB_CAN_RECV;
+			if (!(sw->events & SUB_RETRY_RECV)) {
+				sw->events |= SUB_RETRY_RECV;
 				sw->handle = h1s;
 				h1s->recv_wait = sw;
 			}
 			return 0;
-		case SUB_CAN_SEND:
+		case SUB_RETRY_SEND:
 			sw = param;
-			if (!(sw->wait_reason & SUB_CAN_SEND)) {
-				sw->wait_reason |= SUB_CAN_SEND;
+			if (!(sw->events & SUB_RETRY_SEND)) {
+				sw->events |= SUB_RETRY_SEND;
 				sw->handle = h1s;
 				h1s->send_wait = sw;
 			}
@@ -2115,7 +2115,7 @@
 		h1s->flags |= H1S_F_BUF_FLUSH;
 	else if (ret > 0 || (h1s->flags & H1S_F_SPLICED_DATA)) {
 		h1s->flags &= ~H1S_F_SPLICED_DATA;
-		if (!(h1c->wait_event.wait_reason & SUB_CAN_RECV))
+		if (!(h1c->wait_event.events & SUB_RETRY_RECV))
 			tasklet_wakeup(h1c->wait_event.task);
 	}
 	return ret;
@@ -2187,8 +2187,8 @@
 	ret = cs->conn->xprt->snd_pipe(cs->conn, pipe);
   end:
 	if (pipe->data) {
-		if (!(h1s->h1c->wait_event.wait_reason & SUB_CAN_SEND))
-			cs->conn->xprt->subscribe(cs->conn, SUB_CAN_SEND, &h1s->h1c->wait_event);
+		if (!(h1s->h1c->wait_event.events & SUB_RETRY_SEND))
+			cs->conn->xprt->subscribe(cs->conn, SUB_RETRY_SEND, &h1s->h1c->wait_event);
 	}
 	return ret;
 }
diff --git a/src/mux_h2.c b/src/mux_h2.c
index 862c188..499e423 100644
--- a/src/mux_h2.c
+++ b/src/mux_h2.c
@@ -416,7 +416,7 @@
 		goto fail;
 	h2c->wait_event.task->process = h2_io_cb;
 	h2c->wait_event.task->context = h2c;
-	h2c->wait_event.wait_reason = 0;
+	h2c->wait_event.events = 0;
 
 	h2c->ddht = hpack_dht_alloc(h2_settings_header_table_size);
 	if (!h2c->ddht)
@@ -535,8 +535,8 @@
 		}
 		if (h2c->wait_event.task)
 			tasklet_free(h2c->wait_event.task);
-		if (h2c->wait_event.wait_reason != 0)
-			conn->xprt->unsubscribe(conn, h2c->wait_event.wait_reason,
+		if (h2c->wait_event.events != 0)
+			conn->xprt->unsubscribe(conn, h2c->wait_event.events,
 			    &h2c->wait_event);
 
 		pool_free(pool_head_h2c, h2c);
@@ -703,9 +703,9 @@
 		offer_buffers(NULL, tasks_run_queue);
 	}
 	if (h2s->send_wait != NULL)
-		h2s->send_wait->wait_reason &= ~SUB_CAN_SEND;
+		h2s->send_wait->events &= ~SUB_RETRY_SEND;
 	if (h2s->recv_wait != NULL)
-		h2s->recv_wait->wait_reason &= ~SUB_CAN_RECV;
+		h2s->recv_wait->events &= ~SUB_RETRY_RECV;
 	/* There's no need to explicitly call unsubscribe here, the only
 	 * reference left would be in the h2c send_list/fctl_list, and if
 	 * we're in it, we're getting out anyway
@@ -740,7 +740,7 @@
 	h2s->wait_event.task->process = h2_deferred_shut;
 	h2s->wait_event.task->context = h2s;
 	h2s->wait_event.handle = NULL;
-	h2s->wait_event.wait_reason = 0;
+	h2s->wait_event.events = 0;
 	LIST_INIT(&h2s->list);
 	h2s->h2c       = h2c;
 	h2s->cs        = NULL;
@@ -1265,7 +1265,7 @@
 
 		if (h2s->recv_wait) {
 			struct wait_event *sw = h2s->recv_wait;
-			sw->wait_reason &= ~SUB_CAN_RECV;
+			sw->events &= ~SUB_RETRY_RECV;
 			tasklet_wakeup(sw->task);
 			h2s->recv_wait = NULL;
 		} else if (h2s->cs->data_cb->wake != NULL)
@@ -1750,7 +1750,7 @@
 		if (h2s->recv_wait) {
 			struct wait_event *sw = h2s->recv_wait;
 
-			sw->wait_reason &= ~SUB_CAN_RECV;
+			sw->events &= ~SUB_RETRY_RECV;
 			tasklet_wakeup(sw->task);
 			h2s->recv_wait = NULL;
 		}
@@ -2106,7 +2106,7 @@
 			/* we may have to signal the upper layers */
 			h2s->cs->flags |= CS_FL_RCV_MORE;
 			if (h2s->recv_wait) {
-				h2s->recv_wait->wait_reason &= ~SUB_CAN_RECV;
+				h2s->recv_wait->events &= ~SUB_RETRY_RECV;
 				tasklet_wakeup(h2s->recv_wait->task);
 				h2s->recv_wait = NULL;
 			}
@@ -2346,7 +2346,7 @@
 		/* we may have to signal the upper layers */
 		h2s->cs->flags |= CS_FL_RCV_MORE;
 		if (h2s->recv_wait) {
-			h2s->recv_wait->wait_reason &= ~SUB_CAN_RECV;
+			h2s->recv_wait->events &= ~SUB_RETRY_RECV;
 			tasklet_wakeup(h2s->recv_wait->task);
 			h2s->recv_wait = NULL;
 		}
@@ -2397,8 +2397,8 @@
 			break;
 
 		h2s->flags &= ~H2_SF_BLK_ANY;
-		h2s->send_wait->wait_reason &= ~SUB_CAN_SEND;
-		h2s->send_wait->wait_reason |= SUB_CALL_UNSUBSCRIBE;
+		h2s->send_wait->events &= ~SUB_RETRY_SEND;
+		h2s->send_wait->events |= SUB_CALL_UNSUBSCRIBE;
 		tasklet_wakeup(h2s->send_wait->task);
 		LIST_DEL(&h2s->list);
 		LIST_INIT(&h2s->list);
@@ -2410,8 +2410,8 @@
 			break;
 
 		h2s->flags &= ~H2_SF_BLK_ANY;
-		h2s->send_wait->wait_reason &= ~SUB_CAN_SEND;
-		h2s->send_wait->wait_reason |= SUB_CALL_UNSUBSCRIBE;
+		h2s->send_wait->events &= ~SUB_RETRY_SEND;
+		h2s->send_wait->events |= SUB_CALL_UNSUBSCRIBE;
 		tasklet_wakeup(h2s->send_wait->task);
 		LIST_DEL(&h2s->list);
 		LIST_INIT(&h2s->list);
@@ -2445,7 +2445,7 @@
 	int max;
 	size_t ret;
 
-	if (h2c->wait_event.wait_reason & SUB_CAN_RECV)
+	if (h2c->wait_event.events & SUB_RETRY_RECV)
 		return (b_data(&h2c->dbuf));
 
 	if (!h2_recv_allowed(h2c))
@@ -2481,7 +2481,7 @@
 	} while (ret > 0);
 
 	if (h2_recv_allowed(h2c) && (b_data(buf) < buf->size))
-		conn->xprt->subscribe(conn, SUB_CAN_RECV, &h2c->wait_event);
+		conn->xprt->subscribe(conn, SUB_RETRY_RECV, &h2c->wait_event);
 
 	if (!b_data(buf)) {
 		h2_release_buf(h2c, &h2c->dbuf);
@@ -2571,8 +2571,8 @@
 			LIST_DEL(&h2s->list);
 			LIST_INIT(&h2s->list);
 			LIST_ADDQ(&h2c->sending_list, &h2s->list);
-			h2s->send_wait->wait_reason &= ~SUB_CAN_SEND;
-			h2s->send_wait->wait_reason |= SUB_CALL_UNSUBSCRIBE;
+			h2s->send_wait->events &= ~SUB_RETRY_SEND;
+			h2s->send_wait->events |= SUB_CALL_UNSUBSCRIBE;
 			tasklet_wakeup(h2s->send_wait->task);
 		}
 	}
@@ -2580,8 +2580,8 @@
 	if (!b_data(&h2c->mbuf))
 		return sent;
 schedule:
-	if (!(h2c->wait_event.wait_reason & SUB_CAN_SEND))
-		conn->xprt->subscribe(conn, SUB_CAN_SEND, &h2c->wait_event);
+	if (!(h2c->wait_event.events & SUB_RETRY_SEND))
+		conn->xprt->subscribe(conn, SUB_RETRY_SEND, &h2c->wait_event);
 	return sent;
 }
 
@@ -2590,9 +2590,9 @@
 	struct h2c *h2c = ctx;
 	int ret = 0;
 
-	if (!(h2c->wait_event.wait_reason & SUB_CAN_SEND))
+	if (!(h2c->wait_event.events & SUB_RETRY_SEND))
 		ret = h2_send(h2c);
-	if (!(h2c->wait_event.wait_reason & SUB_CAN_RECV))
+	if (!(h2c->wait_event.events & SUB_RETRY_RECV))
 		ret |= h2_recv(h2c);
 	if (ret || b_data(&h2c->dbuf))
 		h2_process(h2c);
@@ -2647,7 +2647,7 @@
 			if ((h2s->cs->flags & CS_FL_WAIT_FOR_HS) &&
 			    h2s->recv_wait) {
 				struct wait_event *sw = h2s->recv_wait;
-				sw->wait_reason &= ~SUB_CAN_RECV;
+				sw->events &= ~SUB_RETRY_RECV;
 				tasklet_wakeup(sw->task);
 				h2s->recv_wait = NULL;
 			}
@@ -2932,14 +2932,14 @@
 	    h2c_send_goaway_error(h2c, h2s) <= 0)
 		return;
 
-	if (!(h2c->wait_event.wait_reason & SUB_CAN_SEND))
+	if (!(h2c->wait_event.events & SUB_RETRY_SEND))
 		tasklet_wakeup(h2c->wait_event.task);
 	h2s_close(h2s);
 
 	return;
 add_to_list:
 	if (LIST_ISEMPTY(&h2s->list)) {
-		sw->wait_reason |= SUB_CAN_SEND;
+		sw->events |= SUB_RETRY_SEND;
 		if (h2s->flags & H2_SF_BLK_MFCTL) {
 			LIST_ADDQ(&h2c->fctl_list, &h2s->list);
 			h2s->send_wait = sw;
@@ -2990,13 +2990,13 @@
 		h2s_close(h2s);
 	}
 
-	if (!(h2c->wait_event.wait_reason & SUB_CAN_SEND))
+	if (!(h2c->wait_event.events & SUB_RETRY_SEND))
 		tasklet_wakeup(h2c->wait_event.task);
 	return;
 
  add_to_list:
 	if (LIST_ISEMPTY(&h2s->list)) {
-		sw->wait_reason |= SUB_CAN_SEND;
+		sw->events |= SUB_RETRY_SEND;
 		if (h2s->flags & H2_SF_BLK_MFCTL) {
 			LIST_ADDQ(&h2c->fctl_list, &h2s->list);
 			h2s->send_wait = sw;
@@ -3016,7 +3016,7 @@
 	long reason = (long)h2s->wait_event.handle;
 
 	if (h2s->send_wait) {
-		h2s->send_wait->wait_reason &= ~SUB_CALL_UNSUBSCRIBE;
+		h2s->send_wait->events &= ~SUB_CALL_UNSUBSCRIBE;
 		h2s->send_wait = NULL;
 		LIST_DEL(&h2s->list);
 		LIST_INIT(&h2s->list);
@@ -4526,19 +4526,19 @@
 	struct h2s *h2s = cs->ctx;
 	struct h2c *h2c = h2s->h2c;
 
-	if (event_type & SUB_CAN_RECV) {
+	if (event_type & SUB_RETRY_RECV) {
 		sw = param;
-		if (!(sw->wait_reason & SUB_CAN_RECV)) {
-			sw->wait_reason |= SUB_CAN_RECV;
+		if (!(sw->events & SUB_RETRY_RECV)) {
+			sw->events |= SUB_RETRY_RECV;
 			sw->handle = h2s;
 			h2s->recv_wait = sw;
 		}
-		event_type &= ~SUB_CAN_RECV;
+		event_type &= ~SUB_RETRY_RECV;
 	}
-	if (event_type & SUB_CAN_SEND) {
+	if (event_type & SUB_RETRY_SEND) {
 		sw = param;
-		if (!(sw->wait_reason & SUB_CAN_SEND)) {
-			sw->wait_reason |= SUB_CAN_SEND;
+		if (!(sw->events & SUB_RETRY_SEND)) {
+			sw->events |= SUB_RETRY_SEND;
 			sw->handle = h2s;
 			h2s->send_wait = sw;
 			if (!(h2s->flags & H2_SF_BLK_SFCTL)) {
@@ -4548,7 +4548,7 @@
 					LIST_ADDQ(&h2c->send_list, &h2s->list);
 			}
 		}
-		event_type &= ~SUB_CAN_SEND;
+		event_type &= ~SUB_RETRY_SEND;
 	}
 	if (event_type != 0)
 		return -1;
@@ -4562,26 +4562,26 @@
 	struct wait_event *sw;
 	struct h2s *h2s = cs->ctx;
 
-	if (event_type & SUB_CAN_RECV) {
+	if (event_type & SUB_RETRY_RECV) {
 		sw = param;
 		if (h2s->recv_wait == sw) {
-			sw->wait_reason &= ~SUB_CAN_RECV;
+			sw->events &= ~SUB_RETRY_RECV;
 			h2s->recv_wait = NULL;
 		}
 	}
-	if (event_type & SUB_CAN_SEND) {
+	if (event_type & SUB_RETRY_SEND) {
 		sw = param;
 		if (h2s->send_wait == sw) {
 			LIST_DEL(&h2s->list);
 			LIST_INIT(&h2s->list);
-			sw->wait_reason &= ~SUB_CAN_SEND;
+			sw->events &= ~SUB_RETRY_SEND;
 			h2s->send_wait = NULL;
 		}
 	}
 	if (event_type & SUB_CALL_UNSUBSCRIBE) {
 		sw = param;
 		if (h2s->send_wait == sw) {
-			sw->wait_reason &= ~SUB_CALL_UNSUBSCRIBE;
+			sw->events &= ~SUB_CALL_UNSUBSCRIBE;
 			h2s->send_wait = NULL;
 		}
 	}
@@ -4642,7 +4642,7 @@
 	if (ret && h2c->dsi == h2s->id) {
 		/* demux is blocking on this stream's buffer */
 		h2c->flags &= ~H2_CF_DEM_SFULL;
-		if (b_data(&h2c->dbuf) || !(h2c->wait_event.wait_reason & SUB_CAN_RECV)) {
+		if (b_data(&h2c->dbuf) || !(h2c->wait_event.events & SUB_RETRY_RECV)) {
 			if (h2_recv_allowed(h2c))
 				tasklet_wakeup(h2c->wait_event.task);
 		}
@@ -4662,8 +4662,8 @@
 		LIST_DEL(&h2s->list);
 		LIST_INIT(&h2s->list);
 		task_remove_from_task_list((struct task *)h2s->send_wait->task);
-		h2s->send_wait->wait_reason |= SUB_CAN_SEND;
-		h2s->send_wait->wait_reason &= ~SUB_CALL_UNSUBSCRIBE;
+		h2s->send_wait->events |= SUB_RETRY_SEND;
+		h2s->send_wait->events &= ~SUB_CALL_UNSUBSCRIBE;
 		LIST_ADD(&h2c->send_list, &h2s->list);
 	}
 }
@@ -4682,7 +4682,7 @@
 	int32_t idx;
 
 	if (h2s->send_wait) {
-		h2s->send_wait->wait_reason &= ~SUB_CALL_UNSUBSCRIBE;
+		h2s->send_wait->events &= ~SUB_CALL_UNSUBSCRIBE;
 		h2s->send_wait = NULL;
 		LIST_DEL(&h2s->list);
 		LIST_INIT(&h2s->list);
@@ -4844,7 +4844,7 @@
 		total = orig_count;
 
 	if (total > 0) {
-		if (!(h2s->h2c->wait_event.wait_reason & SUB_CAN_SEND))
+		if (!(h2s->h2c->wait_event.events & SUB_RETRY_SEND))
 			tasklet_wakeup(h2s->h2c->wait_event.task);
 
 	}
@@ -4886,7 +4886,7 @@
 		      " .orph_cnt=%d .sub=%d .dsi=%d .dbuf=%u@%p+%u/%u .msi=%d .mbuf=%u@%p+%u/%u",
 		      h2c->st0, h2c->errcode, h2c->max_id, h2c->last_sid, h2c->flags,
 		      h2c->nb_streams, h2c->nb_cs, fctl_cnt, send_cnt, tree_cnt, orph_cnt,
-		      h2c->wait_event.wait_reason, h2c->dsi,
+		      h2c->wait_event.events, h2c->dsi,
 		      (unsigned int)b_data(&h2c->dbuf), b_orig(&h2c->dbuf),
 		      (unsigned int)b_head_ofs(&h2c->dbuf), (unsigned int)b_size(&h2c->dbuf),
 		      h2c->msi,
diff --git a/src/mux_pt.c b/src/mux_pt.c
index 4d3303a..43c3f6f 100644
--- a/src/mux_pt.c
+++ b/src/mux_pt.c
@@ -52,7 +52,7 @@
 	if (ctx->conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH))
 		mux_pt_destroy(ctx);
 	else
-		ctx->conn->xprt->subscribe(ctx->conn, SUB_CAN_RECV,
+		ctx->conn->xprt->subscribe(ctx->conn, SUB_RETRY_RECV,
 		    &ctx->wait_event);
 
 	return NULL;
@@ -76,7 +76,7 @@
 		goto fail_free_ctx;
 	ctx->wait_event.task->context = ctx;
 	ctx->wait_event.task->process = mux_pt_io_cb;
-	ctx->wait_event.wait_reason = 0;
+	ctx->wait_event.events = 0;
 	ctx->conn = conn;
 
 	if (!cs) {
@@ -143,7 +143,7 @@
 	struct conn_stream *cs;
 	struct mux_pt_ctx *ctx = conn->mux_ctx;
 
-	conn->xprt->unsubscribe(conn, SUB_CAN_RECV, &ctx->wait_event);
+	conn->xprt->unsubscribe(conn, SUB_RETRY_RECV, &ctx->wait_event);
 	cs = cs_new(conn);
 	if (!cs)
 		goto fail;
@@ -187,7 +187,7 @@
 	if (conn->owner != NULL &&
 	    !(conn->flags & (CO_FL_ERROR | CO_FL_SOCK_RD_SH | CO_FL_SOCK_WR_SH))) {
 		ctx->cs = NULL;
-		conn->xprt->subscribe(conn, SUB_CAN_RECV, &ctx->wait_event);
+		conn->xprt->subscribe(conn, SUB_RETRY_RECV, &ctx->wait_event);
 	} else
 		/* There's no session attached to that connection, destroy it */
 		mux_pt_destroy(ctx);
diff --git a/src/stream_interface.c b/src/stream_interface.c
index 5283ed5..53d030d 100644
--- a/src/stream_interface.c
+++ b/src/stream_interface.c
@@ -545,7 +545,7 @@
 	struct channel *oc = si_oc(si);
 
 	/* If we have data to send, try it now */
-	if (!channel_is_empty(oc) && !(si->wait_event.wait_reason & SUB_CAN_SEND))
+	if (!channel_is_empty(oc) && !(si->wait_event.events & SUB_RETRY_SEND))
 		si_cs_send(cs);
 
 	/* First step, report to the stream-int what was detected at the
@@ -596,7 +596,7 @@
 	int did_send = 0;
 
 	/* We're already waiting to be able to send, give up */
-	if (si->wait_event.wait_reason & SUB_CAN_SEND)
+	if (si->wait_event.events & SUB_RETRY_SEND)
 		return 0;
 
 	if (conn->flags & CO_FL_ERROR || cs->flags & CS_FL_ERROR)
@@ -680,7 +680,7 @@
  end:
 	/* We couldn't send all of our data, let the mux know we'd like to send more */
 	if (!channel_is_empty(oc))
-		conn->mux->subscribe(cs, SUB_CAN_SEND, &si->wait_event);
+		conn->mux->subscribe(cs, SUB_RETRY_SEND, &si->wait_event);
 	return did_send;
 }
 
@@ -698,9 +698,9 @@
 	if (!cs)
 		return NULL;
 
-	if (!(si->wait_event.wait_reason & SUB_CAN_SEND) && !channel_is_empty(si_oc(si)))
+	if (!(si->wait_event.events & SUB_RETRY_SEND) && !channel_is_empty(si_oc(si)))
 		ret = si_cs_send(cs);
-	if (!(si->wait_event.wait_reason & SUB_CAN_RECV))
+	if (!(si->wait_event.events & SUB_RETRY_RECV))
 		ret |= si_cs_recv(cs);
 	if (ret != 0)
 		si_cs_process(cs);
@@ -1004,7 +1004,7 @@
 	    !(si->flags & SI_FL_WAIT_DATA))       /* not waiting for data */
 		return;
 
-	if (!(si->wait_event.wait_reason & SUB_CAN_SEND) && !channel_is_empty(si_oc(si)))
+	if (!(si->wait_event.events & SUB_RETRY_SEND) && !channel_is_empty(si_oc(si)))
 		si_cs_send(cs);
 
 	if (cs->flags & CS_FL_ERROR || cs->conn->flags & CO_FL_ERROR) {
@@ -1093,7 +1093,7 @@
 	/* If another call to si_cs_recv() failed, and we subscribed to
 	 * recv events already, give up now.
 	 */
-	if (si->wait_event.wait_reason & SUB_CAN_RECV)
+	if (si->wait_event.events & SUB_RETRY_RECV)
 		return 0;
 
 	/* maybe we were called immediately after an asynchronous shutr */
@@ -1335,7 +1335,7 @@
 
 	/* Subscribe to receive events if we're blocking on I/O */
 	if (!si_rx_blocked(si)) {
-		conn->mux->subscribe(cs, SUB_CAN_RECV, &si->wait_event);
+		conn->mux->subscribe(cs, SUB_RETRY_RECV, &si->wait_event);
 		si_rx_endp_done(si);
 	} else {
 		si_rx_endp_more(si);