From e74b54d3ae0600d518f4d852d8d74241947bd9a1 Mon Sep 17 00:00:00 2001 From: Martine Lenders Date: Thu, 7 Oct 2021 14:55:57 +0200 Subject: [PATCH] gcoap_dtls: destroy session in _tl_send only on connection errors --- sys/net/application_layer/gcoap/gcoap.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/sys/net/application_layer/gcoap/gcoap.c b/sys/net/application_layer/gcoap/gcoap.c index 20fab4bba6..b9046cc995 100644 --- a/sys/net/application_layer/gcoap/gcoap.c +++ b/sys/net/application_layer/gcoap/gcoap.c @@ -910,9 +910,18 @@ static ssize_t _tl_send(gcoap_socket_t *sock, const void *data, size_t len, /* send application data */ res = sock_dtls_send(sock->socket.dtls, &sock->ctx_dtls_session, data, len, SOCK_NO_TIMEOUT); - if (res <= 0 ) { + switch (res) { + case -EHOSTUNREACH: + case -ENOTCONN: + case 0: + DEBUG("gcoap: DTLS sock not connected or remote unreachable. " + "Destroying session.\n"); dsm_remove(sock->socket.dtls, &sock->ctx_dtls_session); sock_dtls_session_destroy(sock->socket.dtls, &sock->ctx_dtls_session); + break; + default: + /* Temporary error. Keeping the DTLS session */ + break; } #endif } else if (sock->type == GCOAP_SOCKET_TYPE_UDP) {