From 86ff4d3dc54483385f9f84f15d06460165ed5776 Mon Sep 17 00:00:00 2001
From: Ken Bannister <kb2ma@runbox.com>
Date: Tue, 25 Dec 2018 00:33:26 -0500
Subject: [PATCH] net/nanocoap: fix request retry countdown

---
 sys/net/application_layer/nanocoap/sock.c | 18 ++++++++----------
 1 file changed, 8 insertions(+), 10 deletions(-)

diff --git a/sys/net/application_layer/nanocoap/sock.c b/sys/net/application_layer/nanocoap/sock.c
index c722a553b0..ae3375199f 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;
-- 
GitLab