cpd: pass up lws_ss_request_tx ret
diff --git a/include/libwebsockets/lws-secure-streams.h b/include/libwebsockets/lws-secure-streams.h
index 47c8fb3..e4cb6ba 100644
--- a/include/libwebsockets/lws-secure-streams.h
+++ b/include/libwebsockets/lws-secure-streams.h
@@ -447,7 +447,7 @@
  * formats, \p ppayload_fmt is set to point to the name of the needed payload
  * format from the policy database if non-NULL.
  */
-LWS_VISIBLE LWS_EXTERN int
+LWS_VISIBLE LWS_EXTERN int LWS_WARN_UNUSED_RESULT
 lws_ss_create(struct lws_context *context, int tsi, const lws_ss_info_t *ssi,
 	      void *opaque_user_data, struct lws_ss_handle **ppss,
 	      struct lws_sequencer *seq_owner, const char **ppayload_fmt);
@@ -471,9 +471,9 @@
  * write on this stream, the \p *tx callback will occur with an empty buffer for
  * the stream owner to fill in.
  *
- * Returns 0 or LWSSSSRET_SS_HANDLE_DESTROYED
+ * Returns 0 or LWSSSSRET_DESTROY_ME
  */
-LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t
+LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t LWS_WARN_UNUSED_RESULT
 lws_ss_request_tx(struct lws_ss_handle *pss);
 
 /**
@@ -489,7 +489,7 @@
  * This api variant should be used when it's possible the payload will go out
  * over h1 with x-web-form-urlencoded or similar Content-Type.
  */
-LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t
+LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t LWS_WARN_UNUSED_RESULT
 lws_ss_request_tx_len(struct lws_ss_handle *pss, unsigned long len);
 
 /**
@@ -505,7 +505,7 @@
  * LWSSSSRET_OK means the connection is ongoing.
  *
  */
-LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t
+LWS_VISIBLE LWS_EXTERN lws_ss_state_return_t LWS_WARN_UNUSED_RESULT
 lws_ss_client_connect(struct lws_ss_handle *h);
 
 /**
diff --git a/lib/secure-streams/secure-streams-serialize.c b/lib/secure-streams/secure-streams-serialize.c
index ccb786d..09969fe 100644
--- a/lib/secure-streams/secure-streams-serialize.c
+++ b/lib/secure-streams/secure-streams-serialize.c
@@ -362,6 +362,7 @@
 			 lws_ss_conn_states_t *state, void *parconn,
 			 lws_ss_handle_t **pss, lws_ss_info_t *ssi, char client)
 {
+	lws_ss_state_return_t r;
 	lws_ss_metadata_t *pm;
 	lws_sspc_handle_t *h;
 	uint8_t pre[23];
@@ -1003,11 +1004,14 @@
 			lwsl_notice("%s: set payload len %u\n", __func__,
 				    par->temp32);
 
-			if (proxy_pss_to_ss_h(pss))
-				lws_ss_request_tx_len(proxy_pss_to_ss_h(pss),
-							(unsigned long)par->temp32);
-
 			par->ps = RPAR_TYPE;
+
+			if (proxy_pss_to_ss_h(pss)) {
+				r = lws_ss_request_tx_len(proxy_pss_to_ss_h(pss),
+							(unsigned long)par->temp32);
+				if (r == LWSSSSRET_DESTROY_ME)
+					goto hangup;
+			}
 			break;
 
 		case RPAR_METADATA_NAMELEN:
diff --git a/lib/secure-streams/secure-streams.c b/lib/secure-streams/secure-streams.c
index ced61f3..a13e752 100644
--- a/lib/secure-streams/secure-streams.c
+++ b/lib/secure-streams/secure-streams.c
@@ -1512,7 +1512,7 @@
 	lws_ss_state_return_t r;
 
 	r = _lws_ss_request_tx(h);
-	_lws_ss_handle_state_ret_CAN_DESTROY_HANDLE(r, NULL, &h);
+
 	return r;
 }
 
diff --git a/lib/secure-streams/system/auth-api.amazon.com/auth.c b/lib/secure-streams/system/auth-api.amazon.com/auth.c
index afbb720..af297d8 100644
--- a/lib/secure-streams/system/auth-api.amazon.com/auth.c
+++ b/lib/secure-streams/system/auth-api.amazon.com/auth.c
@@ -227,9 +227,8 @@
 		s = lws_system_blob_get_size(ab);
 		if (!s)
 			lwsl_debug("%s: no auth blob\n", __func__);
-		lws_ss_request_tx_len(m->ss, (unsigned long)s);
 		m->pos = 0;
-		break;
+		return lws_ss_request_tx_len(m->ss, (unsigned long)s);
 
 	case LWSSSCS_DISCONNECTED:
 		/*
diff --git a/lib/secure-streams/system/captive-portal-detect/captive-portal-detect.c b/lib/secure-streams/system/captive-portal-detect/captive-portal-detect.c
index 37d23ad..4de54bf 100644
--- a/lib/secure-streams/system/captive-portal-detect/captive-portal-detect.c
+++ b/lib/secure-streams/system/captive-portal-detect/captive-portal-detect.c
@@ -47,8 +47,7 @@
 	switch (state) {
 	case LWSSSCS_CREATING:
 		lws_ss_start_timeout(m->ss, 3 * LWS_US_PER_SEC);
-		lws_ss_request_tx(m->ss);
-		break;
+		return lws_ss_request_tx(m->ss);
 
 	case LWSSSCS_QOS_ACK_REMOTE:
 		lws_system_cpd_set(cx, LWS_CPD_INTERNET_OK);
diff --git a/lib/secure-streams/system/fetch-policy/fetch-policy.c b/lib/secure-streams/system/fetch-policy/fetch-policy.c
index 237d2db..ee4b139 100644
--- a/lib/secure-streams/system/fetch-policy/fetch-policy.c
+++ b/lib/secure-streams/system/fetch-policy/fetch-policy.c
@@ -102,8 +102,8 @@
 
 	switch (state) {
 	case LWSSSCS_CREATING:
-		lws_ss_request_tx(m->ss);
-		break;
+		return lws_ss_request_tx(m->ss);
+
 	case LWSSSCS_CONNECTING:
 		break;
 
diff --git a/minimal-examples/api-tests/api-test-lws_sequencer/main.c b/minimal-examples/api-tests/api-test-lws_sequencer/main.c
index becb73b..0db7f40 100644
--- a/minimal-examples/api-tests/api-test-lws_sequencer/main.c
+++ b/minimal-examples/api-tests/api-test-lws_sequencer/main.c
@@ -169,8 +169,8 @@
 }
 
 static const struct lws_protocols protocols[] = {
-	{ "seq-test-http", callback_http, 0, 0, },
-	{ NULL, NULL, 0, 0 }
+	{ "seq-test-http", callback_http, 0, 0, 0, NULL, 0 },
+	LWS_PROTOCOL_LIST_TERM
 };
 
 
diff --git a/minimal-examples/api-tests/api-test-secure-streams/main.c b/minimal-examples/api-tests/api-test-secure-streams/main.c
index 8becb67..841cd1a 100644
--- a/minimal-examples/api-tests/api-test-secure-streams/main.c
+++ b/minimal-examples/api-tests/api-test-secure-streams/main.c
@@ -183,11 +183,11 @@
 	*len = budget;
 	m->sent += budget;
 	if (m->sent != next_test->send)
-		lws_ss_request_tx(m->ss);
-	else
-		*flags |= LWSSS_FLAG_EOM;
+		return lws_ss_request_tx(m->ss);
 
-	return 0;
+	*flags |= LWSSS_FLAG_EOM;
+
+	return LWSSSSRET_OK;
 }
 
 static lws_ss_state_return_t
@@ -195,15 +195,18 @@
 	   lws_ss_tx_ordinal_t ack)
 {
 	myss_t *m = (myss_t *)userobj;
+	lws_ss_state_return_t r;
 
 	lwsl_notice("%s: %s, ord 0x%x\n", __func__, lws_ss_state_name((int)state),
 		  (unsigned int)ack);
 
 	switch (state) {
 	case LWSSSCS_CREATING:
-		lws_ss_client_connect(m->ss);
+		r = lws_ss_client_connect(m->ss);
+		if (r)
+			return r;
 		if (next_test->send)
-			lws_ss_request_tx_len(m->ss, (unsigned long)next_test->send);
+			return lws_ss_request_tx_len(m->ss, (unsigned long)next_test->send);
 		break;
 	case LWSSSCS_ALL_RETRIES_FAILED:
 		lwsl_notice("%s: Connection failed\n", __func__);
@@ -258,7 +261,7 @@
 		break;
 	}
 
-	return 0;
+	return LWSSSSRET_OK;
 }
 
 static const lws_ss_info_t ssi_get = {
diff --git a/minimal-examples/embedded/esp32/esp-heltec-wb32/main/lws-minimal-esp32.c b/minimal-examples/embedded/esp32/esp-heltec-wb32/main/lws-minimal-esp32.c
index ecde1a0..a249906 100644
--- a/minimal-examples/embedded/esp32/esp-heltec-wb32/main/lws-minimal-esp32.c
+++ b/minimal-examples/embedded/esp32/esp-heltec-wb32/main/lws-minimal-esp32.c
@@ -86,7 +86,7 @@
 
 	switch (state) {
 	case LWSSSCS_CREATING:
-		lws_ss_client_connect(m->ss);
+		return lws_ss_client_connect(m->ss);
 		break;
 	default:
 		break;
diff --git a/minimal-examples/secure-streams/minimal-secure-streams-avs/avs.c b/minimal-examples/secure-streams/minimal-secure-streams-avs/avs.c
index 6728146..bb453bf 100644
--- a/minimal-examples/secure-streams/minimal-secure-streams-avs/avs.c
+++ b/minimal-examples/secure-streams/minimal-secure-streams-avs/avs.c
@@ -187,7 +187,7 @@
 			lwsl_info("%s: tx done\n", __func__);
 			m->pos = (size_t)-1l; /* ban subsequent until new stream */
 		} else
-			lws_ss_request_tx(m->ss);
+			return lws_ss_request_tx(m->ss);
 
 		lwsl_hexdump_info(buf, *len);
 
@@ -211,7 +211,7 @@
 	if (m->pos == tot) {
 		*flags |= LWSSS_FLAG_EOM;
 		m->pos = 0; /* for next time */
-		lws_ss_request_tx(m->ss);
+		return lws_ss_request_tx(m->ss);
 	}
 
 	lwsl_hexdump_info(buf, *len);
diff --git a/minimal-examples/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c b/minimal-examples/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c
index 39257e3..087d494 100644
--- a/minimal-examples/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c
+++ b/minimal-examples/secure-streams/minimal-secure-streams-post/minimal-secure-streams-post.c
@@ -318,13 +318,15 @@
 	memcpy(buf, postbody + m->pos, *len);
 
 	m->pos += *len;
+
 	if (m->pos == m->len)
 		*flags |= LWSSS_FLAG_EOM;
-	else
-		lws_ss_request_tx(m->ss);
 
 	lwsl_notice("%s: write %d flags %d\n", __func__, (int)*len, (int)*flags);
 
+	if (m->pos != m->len)
+		return lws_ss_request_tx(m->ss);
+
 	return 0;
 }
 
@@ -353,11 +355,12 @@
 		/* provide a hint about the payload size */
 		m->pos = 0;
 		m->len = strlen(postbody);
-		lws_ss_request_tx_len(m->ss, (unsigned long)strlen(postbody));
-		break;
+
+		return lws_ss_request_tx_len(m->ss, (unsigned long)strlen(postbody));
+
 	case LWSSSCS_CONNECTED:
-		lws_ss_request_tx(m->ss);
-		break;
+		return lws_ss_request_tx(m->ss);
+
 	case LWSSSCS_ALL_RETRIES_FAILED:
 		/* if we're out of retries, we want to close the app and FAIL */
 		interrupted = 1;
diff --git a/minimal-examples/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c b/minimal-examples/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c
index c6a7abe..6b7dd83 100644
--- a/minimal-examples/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c
+++ b/minimal-examples/secure-streams/minimal-secure-streams-seq/minimal-secure-streams.c
@@ -182,8 +182,8 @@
 
 	switch (state) {
 	case LWSSSCS_CREATING:
-		lws_ss_request_tx(m->ss);
-		break;
+		return lws_ss_request_tx(m->ss);
+
 	case LWSSSCS_ALL_RETRIES_FAILED:
 		/* if we're out of retries, we want to close the app and FAIL */
 		interrupted = 1;
@@ -266,7 +266,7 @@
 
 	case LWSSEQ_TIMED_OUT: /* current step timed out */
 		if (s->state == SEQ_RECONNECT_WAIT)
-			lws_ss_request_tx(s->ss);
+			return lws_ss_request_tx(s->ss);
 		break;
 
 	/*
@@ -277,8 +277,8 @@
 
 	case LWSSEQ_SS_STATE_BASE + LWSSSCS_CREATING:
 		lwsl_info("%s: seq LWSSSCS_CREATING\n", __func__);
-		lws_ss_request_tx(s->ss);
-		break;
+		return lws_ss_request_tx(s->ss);
+
 	case LWSSEQ_SS_STATE_BASE + LWSSSCS_DISCONNECTED:
 		lwsl_info("%s: seq LWSSSCS_DISCONNECTED\n", __func__);
 		break;
diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server-raw/ss-server.c b/minimal-examples/secure-streams/minimal-secure-streams-server-raw/ss-server.c
index 7ad0b84..4d395d4 100644
--- a/minimal-examples/secure-streams/minimal-secure-streams-server-raw/ss-server.c
+++ b/minimal-examples/secure-streams/minimal-secure-streams-server-raw/ss-server.c
@@ -54,9 +54,8 @@
 {
 	myss_srv_t *m = lws_container_of(sul, myss_srv_t, sul);
 
-	lws_ss_request_tx(m->ss);
-
-	lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul, spam_sul_cb,
+	if (!lws_ss_request_tx(m->ss))
+		lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul, spam_sul_cb,
 			 100 * LWS_US_PER_MS);
 }
 
@@ -90,8 +89,7 @@
 		lws_sul_cancel(&m->sul);
 		break;
 	case LWSSSCS_CONNECTED:
-		lws_ss_request_tx(m->ss);
-		break;
+		return lws_ss_request_tx(m->ss);
 
 	default:
 		break;
diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server/ss-client.c b/minimal-examples/secure-streams/minimal-secure-streams-server/ss-client.c
index 64834c3..58c0fd9 100644
--- a/minimal-examples/secure-streams/minimal-secure-streams-server/ss-client.c
+++ b/minimal-examples/secure-streams/minimal-secure-streams-server/ss-client.c
@@ -62,7 +62,7 @@
 
 	switch (state) {
 	case LWSSSCS_CREATING:
-		lws_ss_request_tx(m->ss);
+		return lws_ss_request_tx(m->ss);
 		break;
 	case LWSSSCS_ALL_RETRIES_FAILED:
 		/* if we're out of retries, we want to close the app and FAIL */
diff --git a/minimal-examples/secure-streams/minimal-secure-streams-server/ss-server.c b/minimal-examples/secure-streams/minimal-secure-streams-server/ss-server.c
index 2a81092..1b04545 100644
--- a/minimal-examples/secure-streams/minimal-secure-streams-server/ss-server.c
+++ b/minimal-examples/secure-streams/minimal-secure-streams-server/ss-server.c
@@ -134,9 +134,8 @@
 {
 	myss_srv_t *m = lws_container_of(sul, myss_srv_t, sul);
 
-	lws_ss_request_tx(m->ss);
-
-	lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul, spam_sul_cb,
+	if (!lws_ss_request_tx(m->ss))
+		lws_sul_schedule(lws_ss_get_context(m->ss), 0, &m->sul, spam_sul_cb,
 			 100 * LWS_US_PER_MS);
 }
 
@@ -170,8 +169,8 @@
 		lws_sul_cancel(&m->sul);
 		break;
 	case LWSSSCS_CREATING:
-		lws_ss_request_tx(m->ss);
-		break;
+		return lws_ss_request_tx(m->ss);
+
 	case LWSSSCS_ALL_RETRIES_FAILED:
 		/* if we're out of retries, we want to close the app and FAIL */
 		interrupted = 1;
@@ -201,10 +200,9 @@
 		/*
 		 * ...it's going to be whatever size it is (and request tx)
 		 */
-		lws_ss_request_tx_len(m->ss, (unsigned long)
+		return lws_ss_request_tx_len(m->ss, (unsigned long)
 				(multipart ? strlen(multipart_html) :
 							 strlen(html)));
-		break;
 
 	case LWSSSCS_SERVER_UPGRADE:
 
@@ -217,8 +215,8 @@
 
 		m->upgraded = 1;
 		lws_ss_change_handlers(m->ss, myss_ws_rx, myss_ws_tx, NULL);
-		lws_ss_request_tx(m->ss); /* we want to start sending numbers */
-		break;
+		return lws_ss_request_tx(m->ss); /* we want to start sending numbers */
+
 	default:
 		break;
 	}
diff --git a/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c b/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c
index b12f8f5..1acd431 100644
--- a/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c
+++ b/minimal-examples/secure-streams/minimal-secure-streams-sigv4/ss-s3-ss.c
@@ -57,7 +57,7 @@
 		*flags |= LWSSS_FLAG_EOM;
 		// m->pos = 0; /* we only want to send once */
 	} else
-		lws_ss_request_tx(m->ss);
+		return lws_ss_request_tx(m->ss);
 
 	return LWSSSSRET_OK;
 }
@@ -173,12 +173,10 @@
 				    timestamp, strlen(timestamp)))
 			return LWSSSSRET_DESTROY_ME;
 
-		lws_ss_request_tx_len(m->ss, m->total);
-		break;
+		return lws_ss_request_tx_len(m->ss, m->total);
 
 	case LWSSSCS_CONNECTED:
-		lws_ss_request_tx(m->ss);
-		break;
+		return lws_ss_request_tx(m->ss);
 
 	case LWSSSCS_DISCONNECTED:
 		return LWSSSSRET_DESTROY_ME;
diff --git a/minimal-examples/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c b/minimal-examples/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c
index 741e693..3a9577f 100644
--- a/minimal-examples/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c
+++ b/minimal-examples/secure-streams/minimal-secure-streams-smd/minimal-secure-streams-smd.c
@@ -94,7 +94,8 @@
 	myss_t *m = lws_container_of(sul, myss_t, sul);
 
 	lwsl_info("%s: requesting TX\n", __func__);
-	lws_ss_request_tx(m->ss);
+	if (lws_ss_request_tx(m->ss))
+		lwsl_info("%s: req failed\n", __func__);
 }
 
 static lws_ss_state_return_t