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
Diff: udp/dhcp/dhcp.c
- 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)