Hallo,
thanks, I’m doing the dhcp_release and can see it in wireshark now.
Since I work with lwipv1.4.1 I use the netifapi functions. For dhcp release I call netifapi_netif_common(netif, NULL, dhcp_release);
That leads to another questions:
Wouldn’t it make sense to have a define in netifapi.h for dhcp_release as follows:
#define netifapi_dhcp_release(n) netifapi_netif_common(n, NULL, dhcp_release)
Best regards,
Sandra
Gesendet: Freitag, 5. Juni 2015 11:07
An: Sandra Gilge
Betreff: Fwd: [lwip-users] DHCP usage
Hi,
I had issues with this too. This is what I did and it has worked with out change from lwIP V1.3.2 to current:
typedef struct _NVDHCP
{
uint8_t pbyIpAddress[4];
uint8_t pbyAddressMask[4];
uint8_t pbyGatewayAddress[4];
uint8_t byEnableDHCP;
} NVDHCP,
*PNVDHCP;
/******************************************************************************
* Function Name: ipReconfigure
* Description : Function to re-configure the interface
* Arguments : IN pszInterface - The symbolic link name of the interface
* IN pIpConfig - Pointer to the new configuration
* Return Value : 0 for success or -1 on error
******************************************************************************/
int32_t ipReconfigure(int8_t *pszInterface, PNVDHCP pIpConfig)
{
PRTEIP pEtherC = ipFindNetIf(&gpEtherC, pszInterface);
if (pEtherC)
{
if (pIpConfig->byEnableDHCP == 0U)
{
_Bool bfLinkUp = false;
pEtherC->ipConfig = *pIpConfig;
/* If DHCP was previously on */
if (pEtherC->ipConfig.byEnableDHCP)
{
/* Stop it */
tcpip_callback((void(*)(void*))dhcp_release,
&pEtherC->ipNetIf);
tcpip_callback((void(*)(void*))dhcp_stop,
&pEtherC->ipNetIf);
}
/* Set the fixed address */
memcpy(&pEtherC->ipNetIf.ip_addr.addr,
pEtherC->ipConfig.pbyIpAddress,
sizeof(struct ip_addr));
memcpy(&pEtherC->ipNetIf.netmask.addr,
pEtherC->ipConfig.pbyAddressMask,
sizeof(struct ip_addr));
memcpy(&pEtherC->ipNetIf.gw.addr,
pEtherC->ipConfig.pbyGatewayAddress,
sizeof(struct ip_addr));
/* Check the state of the link */
if ((control(pEtherC->iEtherC, CTL_GET_LINK_STATE, &bfLinkUp) == 0U)
&& (bfLinkUp))
{
/* Tell lwIP that the data link is up */
tcpip_callback((void(*)(void*))netif_set_up,
&pEtherC->ipNetIf);
}
}
else
{
if (pEtherC->ipConfig.byEnableDHCP == 0U)
{
pEtherC->ipConfig = *pIpConfig;
/* Protect against concurrent access,
specifically in the ARP modules */
tcpip_callback((void(*)(void*))netif_set_link_down,
&pEtherC->ipNetIf);
/* Also have to do this one as well. Is it not obvious
that if the physical link has been set down that
the data link is down too? */
tcpip_callback((void(*)(void*))netif_set_down,
&pEtherC->ipNetIf);
/* Tell lwIP to start DHCP */
tcpip_callback((void(*)(void*))dhcp_start,
&pEtherC->ipNetIf);
}
else
{
pEtherC->ipConfig = *pIpConfig;
}
}
return 0;
}
return -1;
}
/******************************************************************************
End of function ipReconfigure
******************************************************************************/
The code comes from a system using an RTOS so the calls are made by call-backs to the TCPIP task.
Good luck!
Adam.
-------- Forwarded Message --------
Hallo,
The IP configuration in our embedded system is reconfigurable by the user during runtime.
The user can also switch on DHCP or switch it off and use a static IP address.
What is the correct way to switch DHCP off. Do I have to call netifapi_dhcp_stop(), when switching off DHCP?
I tried this, but I could not see a DHCP message on wireshark.
This is how it works right now:
Any configuration change:
netifapi_netif_set_down()
DHCP switched off:
netifapi_netif_set_addr()
netifapi_netif_set_up()
DHCP switched on:
netifapi_dhcp_start()
wait up to 7 secs for DHCP_BOUND
Best regards,
Sandra