A stack which works with or without an Mbed os library. Provides IPv4 or IPv6 with a full 1500 byte buffer.

Dependents:   oldheating gps motorhome heating

Revision:
119:8e1a7805b801
Parent:
116:60521b29e4c9
Child:
128:79052cb4a41c
--- a/udp/dhcp/dhcp.c	Sat Jan 26 18:57:27 2019 +0000
+++ b/udp/dhcp/dhcp.c	Tue Jan 29 15:07:14 2019 +0000
@@ -55,16 +55,16 @@
 };
 
 #define MAX_REPEAT_DELAY_TIME_MS 60000
-#define MIN_REPEAT_DELAY_TIME_MS  1000
-static uint32_t repeatDelayTimer = 0;               //Started whenever a message is sent and blocks another send until after the delay time
-static uint32_t delayMs = MIN_REPEAT_DELAY_TIME_MS; //Doubles on failure up to max; reset to min whenever an IP address request has been acknowledged
+#define MIN_REPEAT_DELAY_TIME_MS   900
+static uint32_t repeatDelayMsTimer = (uint32_t)-MIN_REPEAT_DELAY_TIME_MS; //Initial value ensures no delay at startup
+static uint32_t delayMs            =            MIN_REPEAT_DELAY_TIME_MS; //Doubles on failure up to max; reset to min whenever an IP address request has been acknowledged
 
-static uint32_t elapsedLifeTimer  = 0;              //Started whenever an IP address request has been acknowledged 
+static uint32_t elapsedLifeMsTimer  = 0;              //Started whenever an IP address request has been acknowledged 
 
 uint32_t DhcpGetElapsedLife()
 {
-    if (!elapsedLifeTimer) return 0;
-    return (MsTimerCount - elapsedLifeTimer) / 1000;
+    if (!elapsedLifeMsTimer) return 0;
+    return (MsTimerCount - elapsedLifeMsTimer) / 1000;
 }
 
 static uint8_t  dhcpMessageType = 0;
@@ -266,7 +266,7 @@
         case DHCPACK:
             if (DhcpTrace) { LogTime("DHCP <- ack ip ");   Ip4AddressLog(yiaddr); Log("\r\n"); }
             DhcpLocalIp = yiaddr;
-            elapsedLifeTimer = MsTimerCount;    //Start the life timer
+            elapsedLifeMsTimer = MsTimerCount;  //Start the life timer
             delayMs = MIN_REPEAT_DELAY_TIME_MS; //Set the delay time back to minimum
             break;
         case DHCPNAK:
@@ -281,16 +281,19 @@
 
 int DhcpPollForRequestToSend(void* pPacket, int* pSize)
 {
-    if (repeatDelayTimer && !MsTimerHasElapsed(repeatDelayTimer, delayMs)) return DO_NOTHING; //Don't retry within the delay time
-    delayMs <<= 1;                                                                            //Backoff (double) the delay time after each attempt
-    if (delayMs > MAX_REPEAT_DELAY_TIME_MS) delayMs = MAX_REPEAT_DELAY_TIME_MS;               //Don't go beyond a maximum
-    repeatDelayTimer = MsTimerCount;                                                          //Start the delay timer
-    
-    uint32_t elapsedTimeMs = MsTimerCount - elapsedLifeTimer;
+    //Check if time to update
+    uint32_t elapsedTimeMs = MsTimerCount - elapsedLifeMsTimer;
     uint32_t   leaseTimeMs = DhcpLeaseTime * 1000;
 
-    if (DhcpLocalIp && elapsedTimeMs < (leaseTimeMs >> 1)) return 0; //Do nothing if have address and within T1
+    if (DhcpLocalIp && elapsedTimeMs < (leaseTimeMs >> 1)) return DO_NOTHING;      //Do nothing if have address and within T1
     
+    //Limit retries with a backoff delay
+    if (!MsTimerHasElapsed(repeatDelayMsTimer, delayMs)) return DO_NOTHING;        //Don't retry within the delay time
+    delayMs <<= 1;                                                                 //Backoff (double) the delay time after each attempt
+    if (delayMs > MAX_REPEAT_DELAY_TIME_MS) delayMs = MAX_REPEAT_DELAY_TIME_MS;    //Don't go beyond a maximum
+    repeatDelayMsTimer = MsTimerCount;                                             //Start the delay timer
+    
+    //Send the renewal request
     *pSize = 0;
     int dest = DO_NOTHING;
     if (DhcpLocalIp && elapsedTimeMs <  leaseTimeMs)