Hi Max,
I hope I am not confusing you or making an error here.
As far as I know DHCP client is handled almost completely by LwIP.
You should not worry about timers etc...
I have attached my DHCP task, take a look and I hope this helps...
This code is running with LwIP 1.41
BR,
Noam.
-----Original Message-----
From: lwip-users [mailto:[email protected]] On
Behalf Of massimiliano cialdi
Sent: Tuesday, July 11, 2017 11:50 AM
To: [email protected]
Subject: [lwip-users] dhcp behaviour
Hallo,
I have some questions about dhcp behaviour:
- Do I have to call the functions dhcp_coarse_tmr() and
dhcp_coarse_tmr() explicitly?
I have this doubt because I have seen that these functions are already being
declared as
timer callbacks in file timeout.c
- if my dhcp server has 10s as lease time, should I lower
DHCP_COARSE_TIMER_SECS and DHCP_FINE_TIMER_MSECS? And what values?
Best regards
Max
_______________________________________________
lwip-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/lwip-users
// Scheduler include files.
#include "FreeRTOS.h"
#include "task.h"
// lwIP includes
#include "dhcp.h"
#include "dns.h"
#include "DHCP_client.h"
#include "IP_Settings.h"
#include "UserInterface.h"
#ifndef LWIP_DNS
#error "LWIP_DNS not defined, check your lwipopts.h file !!!!"
#endif
// Private macro -------------------------------------------------------------
#ifndef MY_DHCP_DEBUG
#define MY_DHCP_DEBUG LWIP_DBG_OFF //LWIP_DBG_ON //LWIP_DBG_OFF //
LWIP_DBG_ON
#endif
#if (MY_DHCP_DEBUG == LWIP_DBG_ON)
#define DHCP_BUFF_S 350
static char lpbuf[DHCP_BUFF_S];
#ifdef ATLONA_PROC
#ifdef ATLONA_PROC_WS_WSS
#define DHCPP_DEBUG(x, ...) { snprintf(lpbuf, DHCP_BUFF_S, (char *)x,
##__VA_ARGS__); streamPrint(AMS_RS232_ID, DefaultInterface, FALSE, "%s",
lpbuf); }
#else
#define DHCPP_DEBUG(x, ...) { snprintf(lpbuf, DHCP_BUFF_S, (char *)x,
##__VA_ARGS__); streamPrint(DefaultInterface, FALSE, "%s", lpbuf); }
#endif
#else
#define DHCPP_DEBUG(x, ...) { snprintf(lpbuf, WSS_BUFF_S, (char *)x,
##__VA_ARGS__); streamPrint(DefaultInterface, "%s", lpbuf); }
#endif
#else
#define DHCPP_DEBUG(x, ...)
#endif
#define MAX_DHCP_TRIES 4
static DHCP_States DHCP_state = eDHCP_LinkDown;
bool DhcpAddressAssigned = FALSE;
//-------------------------------------------------------------------------
void SetDhcpState(DHCP_States NewState)
{
DHCP_state = NewState;
#if (MY_DHCP_DEBUG == LWIP_DBG_ON)
DHCPP_DEBUG("DHCP_NewState:\r\n");
switch(NewState)
{
case eDHCP_Start: DHCPP_DEBUG(" eDHCP_Start\r\n");
break;
case eDHCP_WaitAddress: DHCPP_DEBUG(" eDHCP_WaitAddress\r\n");
break;
case eDHCP_AddressAsigned: DHCPP_DEBUG(" eDHCP_AddressAsigned\r\n");
break;
case eDHCP_TimeOut: DHCPP_DEBUG(" eDHCP_TimeOut\r\n");
break;
case eDHCP_LinkDown: DHCPP_DEBUG(" eDHCP_LinkDown\r\n");
break;
}
#endif
}
//-------------------------------------------------------------------------
bool GetDhcpAddressAssignedState(void)
{
return DhcpAddressAssigned;
}
//-------------------------------------------------------------------------
/**
* @brief DHCP Process
* @param argument: network interface
* @retval None
*/
void vDHCP_thread( void *pvParameters )
{
DHCP_TaskParams_t *pDHCP_TaskParams = (DHCP_TaskParams_t*)pvParameters;
__DwordOrBytes Addr;
bool ShowNewAddress = FALSE;
struct ip_addr DnsIpAddr;
while(1)
{
switch(DHCP_state)
{
case eDHCP_Start:
DhcpAddressAssigned = FALSE;
// Stop DHCP
netifapi_dhcp_stop(pDHCP_TaskParams->netif);
if(GetTcpIpMode() == TRUE)
{
// init values to ZERO before starting DHCP
pDHCP_TaskParams->netif->ip_addr.addr =
0;
pDHCP_TaskParams->netif->netmask.addr = 0;
pDHCP_TaskParams->netif->gw.addr = 0;
Addr.Dword = 0;
ShowNewAddress = FALSE;
// start DHCP and wait for address
netifapi_dhcp_start(pDHCP_TaskParams->netif);
// change DHCP task state machine
DHCP_state = eDHCP_WaitAddress;
#if ((defined ATLONA_PROC) || (defined ATLONA_PROC_WS_WSS))
#ifdef ATLONA_PROC_WS_WSS
streamPrint(AMS_DEBUG_PRINT, DefaultInterface, FALSE, "State: Looking
for DHCP server ...\r\n");
#else
streamPrint(DefaultInterface, FALSE, "State: Looking for DHCP server
...\r\n");
#endif
#else
streamPrint(DefaultInterface, "State: Looking for DHCP server
...\r\n");
#endif
}
else
{
DHCP_state = eDHCP_TimeOut;
}
break;
//-------------------------------------------------------------------
case eDHCP_WaitAddress:
DHCPP_DEBUG(" from inside eDHCP_WaitAddress\r\n");
// Read the new IP address
if(pDHCP_TaskParams->netif->ip_addr.addr != 0)
{
// if new address assigned change DHCP task state
DHCP_state = eDHCP_AddressAsigned;
ShowNewAddress = TRUE;
DHCPP_DEBUG(" from inside if(pDHCP_TaskParams->netif->ip_addr.addr
!= 0)\r\n");
}
else
{
// DHCP timeout
if(pDHCP_TaskParams->netif->dhcp->tries > MAX_DHCP_TRIES)
{
// Stop DHCP
netifapi_dhcp_stop(pDHCP_TaskParams->netif);
DHCP_state = eDHCP_TimeOut;
DHCPP_DEBUG(" from inside dhcp->tries > MAX_DHCP_TRIES\r\n");
}
}
break;
//-------------------------------------------------------------------
case eDHCP_TimeOut:
pDHCP_TaskParams->netif->ip_addr.addr = GetIpAddDword();
pDHCP_TaskParams->netif->netmask.addr = GetIpMaskDword();
pDHCP_TaskParams->netif->gw.addr = GetIpGwDword();
netifapi_netif_set_addr(pDHCP_TaskParams->netif,
&pDHCP_TaskParams->netif->ip_addr , &pDHCP_TaskParams->netif->netmask,
&pDHCP_TaskParams->netif->gw);
// make it the default interface
netifapi_netif_set_default(pDHCP_TaskParams->netif);
netifapi_netif_set_up(pDHCP_TaskParams->netif);
if(GetTcpIpMode() == TRUE)
{
#if ((defined ATLONA_PROC) || (defined ATLONA_PROC_WS_WSS))
#ifdef ATLONA_PROC_WS_WSS
streamPrint(AMS_DEBUG_PRINT, DefaultInterface, FALSE, "DHCP timeout
!!\r\n");
#else
streamPrint(DefaultInterface, FALSE, "DHCP timeout !!\r\n");
#endif
#else
streamPrint(DefaultInterface, "DHCP timeout !!\r\n");
#endif
}
DHCP_state = eDHCP_AddressAsigned;
ShowNewAddress = TRUE;
break;
//-------------------------------------------------------------------
case eDHCP_AddressAsigned:
if(ShowNewAddress == TRUE)
{
ShowNewAddress = FALSE;
// display IP settings
Addr.Dword = pDHCP_TaskParams->netif->ip_addr.addr;
#if ((defined ATLONA_PROC) || (defined ATLONA_PROC_WS_WSS))
#ifdef ATLONA_PROC_WS_WSS
streamPrint(AMS_DEBUG_PRINT, DefaultInterface, FALSE, "IP address set
to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2],
Addr.Bytes[3]);
Addr.Dword = pDHCP_TaskParams->netif->netmask.addr;
streamPrint(AMS_DEBUG_PRINT, DefaultInterface, FALSE, "Net Mask value
set to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2],
Addr.Bytes[3]);
Addr.Dword = pDHCP_TaskParams->netif->gw.addr;
streamPrint(AMS_DEBUG_PRINT, DefaultInterface, FALSE,"Gateway IP
address set to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2],
Addr.Bytes[3]);
DnsIpAddr = dns_getserver(0);
Addr.Dword = DnsIpAddr.addr;
streamPrint(AMS_DEBUG_PRINT, DefaultInterface, FALSE,"DNS #1 IP set
to: %d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2],
Addr.Bytes[3]);
DnsIpAddr = dns_getserver(1);
Addr.Dword = DnsIpAddr.addr;
streamPrint(AMS_DEBUG_PRINT, DefaultInterface, FALSE,"DNS #2 IP set
to: %d.%d.%d.%d\r\n\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2],
Addr.Bytes[3]);
#else
streamPrint(DefaultInterface, FALSE, "IP address set to:
%d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]);
Addr.Dword = pDHCP_TaskParams->netif->netmask.addr;
streamPrint(DefaultInterface, FALSE, "Net Mask value set to:
%d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]);
Addr.Dword = pDHCP_TaskParams->netif->gw.addr;
streamPrint(DefaultInterface, FALSE,"Gateway IP address set to:
%d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]);
DnsIpAddr = dns_getserver(0);
Addr.Dword = DnsIpAddr.addr;
streamPrint(DefaultInterface, FALSE,"DNS #1 IP set to:
%d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]);
DnsIpAddr = dns_getserver(1);
Addr.Dword = DnsIpAddr.addr;
streamPrint(DefaultInterface, FALSE,"DNS #2 IP set to:
%d.%d.%d.%d\r\n\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]);
#endif
#else
streamPrint(DefaultInterface, "IP address set to: %d.%d.%d.%d\r\n",
Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]);
Addr.Dword = pDHCP_TaskParams->netif->netmask.addr;
streamPrint(DefaultInterface, "Net Mask value set to:
%d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]);
Addr.Dword = pDHCP_TaskParams->netif->gw.addr;
streamPrint(DefaultInterface, "Gateway IP address set to:
%d.%d.%d.%d\r\n", Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]);
DnsIpAddr = dns_getserver(0);
Addr.Dword = DnsIpAddr.addr;
streamPrint(DefaultInterface, "DNS #1 IP set to: %d.%d.%d.%d\r\n",
Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]);
DnsIpAddr = dns_getserver(1);
Addr.Dword = DnsIpAddr.addr;
streamPrint(DefaultInterface, "DNS #2 IP set to: %d.%d.%d.%d\r\n\n",
Addr.Bytes[0], Addr.Bytes[1], Addr.Bytes[2], Addr.Bytes[3]);
#endif
// update TCP IP struct in RAM with the new addresses:
SetIpAddDword(pDHCP_TaskParams->netif->ip_addr.addr, NO_WRITE_TO_FLASH);
SetIpMaskDword(pDHCP_TaskParams->netif->netmask.addr,
NO_WRITE_TO_FLASH);
SetIpGwDword(pDHCP_TaskParams->netif->gw.addr, NO_WRITE_TO_FLASH);
DnsIpAddr = dns_getserver(0);
Addr.Dword = DnsIpAddr.addr;
SetDnsIpDword(eDNS_Primary, Addr.Dword);
DnsIpAddr = dns_getserver(1);
Addr.Dword = DnsIpAddr.addr;
SetDnsIpDword(eDNS_Secondary, Addr.Dword);
// set the IP settings structure for later usage
// add function calles here !!!
pDHCP_TaskParams->DHCP_AddrAssignedCB();
DhcpAddressAssigned = TRUE;
}
break;
//-------------------------------------------------------------------
case eDHCP_LinkDown:
// do nothing, wait for link to established
DHCPP_DEBUG(" from inside eDHCP_LinkDown\r\n");
break;
//-------------------------------------------------------------------
default:
break;
}
/* wait 250 ms */
vTaskDelay((250 / portTICK_RATE_MS));
}
}_______________________________________________
lwip-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/lwip-users