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

Reply via email to