diff --git a/sys/net/application_layer/nanocoap/sock.c b/sys/net/application_layer/nanocoap/sock.c index c722a553b007b77609ba5505a6b58bb1a16cb2b7..ae3375199f64ba8e5c75cda26d71ad9657071263 100644 --- a/sys/net/application_layer/nanocoap/sock.c +++ b/sys/net/application_layer/nanocoap/sock.c @@ -46,19 +46,14 @@ ssize_t nanocoap_request(coap_pkt_t *pkt, sock_udp_ep_t *local, sock_udp_ep_t *r /* TODO: timeout random between between ACK_TIMEOUT and (ACK_TIMEOUT * * ACK_RANDOM_FACTOR) */ - uint32_t timeout = COAP_ACK_TIMEOUT * (1000000U); - int tries = 0; - while (tries++ < COAP_MAX_RETRANSMIT) { - if (!tries) { - DEBUG("nanocoap: maximum retries reached.\n"); - res = -ETIMEDOUT; - goto out; - } + uint32_t timeout = COAP_ACK_TIMEOUT * US_PER_SEC; + unsigned tries_left = COAP_MAX_RETRANSMIT + 1; /* add 1 for initial transmit */ + while (tries_left) { res = sock_udp_send(&sock, buf, pdu_len, NULL); if (res <= 0) { DEBUG("nanocoap: error sending coap request\n"); - goto out; + break; } res = sock_udp_recv(&sock, buf, len, timeout, NULL); @@ -67,6 +62,10 @@ ssize_t nanocoap_request(coap_pkt_t *pkt, sock_udp_ep_t *local, sock_udp_ep_t *r DEBUG("nanocoap: timeout\n"); timeout *= 2; + tries_left--; + if (!tries_left) { + DEBUG("nanocoap: maximum retries reached\n"); + } continue; } DEBUG("nanocoap: error receiving coap request\n"); @@ -81,7 +80,6 @@ ssize_t nanocoap_request(coap_pkt_t *pkt, sock_udp_ep_t *local, sock_udp_ep_t *r } } -out: sock_udp_close(&sock); return res;