[En-Nut-Discussion] DCHP issues

Antonio Arena aveclebambin at gmail.com
Mon Oct 22 08:47:14 CEST 2012


I have upgraded an Ethernut 2.1b project from Nut/OS 4.8.3 to 4.10.2
and noticed some DHCP behavior differences that I would like to get
guidance on.

The most obvious one is that instead of Discovery-Offer-Request-Ack,
I'm only seeing Discovery-Offer. I believe this is the result of
http://ethernut.svn.sourceforge.net/viewvc/ethernut/trunk/nut/pro/dhcpc.c?r1=2966&r2=2982
which Harald Kipp had already flagged in a thread from December 3rd,
2011, when he wrote:

> For example we have now

> /* Change to REQUESTING state if we got a valid offer.
>   Otherwise we stay in SELECTING state. */
> else if (dhcpConfig) {
>    /* Wait for at least one period for other DHCP servers to offer */
>    retries = MAX_DCHP_RETRIES + 1;
>}

> but I cannot figure out, how this will put the client into SELECTING state again. It may be a left-over > comment, but the original version did that

> /* Change to REQUESTING state if we got a valid offer.
>   Otherwise we stay in SELECTING state. */
> else if (dhcpConfig) {
>    retries = 0;
>    dhcpState = DHCPST_REQUESTING;
>}

My knowledge of DHCP is very limited, but this patch looks wrong
because it causes Ethernut to bind to the offered IP address without
sending a request:

  if (retries++ > MAX_DCHP_RETRIES) {
1644	 	                 if( dhcpConfig) {
1645	 	                     /* Ulrich says: we got at least one valid
offer from a DHCP server */
1646	 	                     reply = 0;
1647	 	                     leaseTime = aqsTime;
1648	 	                     dhcpState = DHCPST_BOUND;
1649	 	                 }

IMHO, this could cause the server to offer the same address to another
unit because the first Ethernut unit never explicitly requested it.

A smaller issue is with some of the debugging statements.

For example this one de-references dyncfg pointer which could be NULL:

1302	/*!
1303	 * \brief Check a new offer.
1304	 *
1305	 * \param dyncfg Current configuration, may be NULL.
1306	 * \param ip     DHCP server IP address.
1307	 * \param bp     DHCP offer message.
1308	 * \param len    DHCP message length.
1309	 *
1310	 * \return Updated configuration.
1311	 */
1312	static DYNCFG *CheckOffer(DYNCFG * dyncfg, BOOTP *bp, size_t len)
1313	{
1314	    DYNCFG *offer;
1315	
1316	#ifdef NUTDEBUG
1317	    if (__tcp_trf & NET_DBG_DHCP) fprintf(__tcp_trs, "\n[chkoffer
%s ", inet_ntoa( dyncfg->dyn_yiaddr));
1318	#endif

But the main issue that I have not figured out yet is why, about half
of the times, the first UDP packet (Discover or Request depending on
cdn_cip_addr) does not appear on the bus even though the debug
statements suggests that it was sent out (and then Ethernut times out
on receiving).

I realize UDP is unreliable by definition, but I only have a Linux
laptop connected by cross-over cable to the Ethernut and there is no
other traffic: I reboot the Ethernut and expect to see the packets on
tcpdump. But the first packet is often missing. I'm inclined to think
this is not a DHCP issue as much as a device driver issue (lanc111)
and somewhat triggered by something specific to my application.

But I have seen an old post from Paolo Simoncelli ("Slight problem
with UDP"), so I thought I would ask the mailing list before investing
more time debugging it.

Best regards,
Antonio


More information about the En-Nut-Discussion mailing list