udhcpd initial lease

Grahame Jordan gbj at theforce.com.au
Mon Nov 29 00:46:43 UTC 2010


You are right. RFC 2131 says:
> "o DHCPREQUEST generated during INIT-REBOOT state:
>
>     'server identifier' MUST NOT be filled in, 'requested IP address'
>     option MUST be filled in with client's notion of its previously
>     assigned address. 'ciaddr' MUST be zero. The client is seeking to
>     verify a previously allocated, cached configuration. Server SHOULD
>     send a DHCPNAK message to the client if the 'requested IP address'
>     is incorrect, or is on the wrong network"
>
> and in this case, we don't answer at all. Looks like a bug.
>
> The minimal fix would be to at least send a NAK, forcing client
> to fall back to re-negotiating DHCP form the start:
>
>
>
> diff -ad -urpN busybox.0/networking/udhcp/dhcpd.c busybox.1/networking/udhcp/dhcpd.c
> --- busybox.0/networking/udhcp/dhcpd.c  2010-11-27 22:25:51.000000000 +0100
> +++ busybox.1/networking/udhcp/dhcpd.c  2010-11-28 21:45:13.000000000 +0100
> @@ -584,11 +584,15 @@ o DHCPREQUEST generated during REBINDING
>                                  send_ACK(&packet, lease->lease_nip);
>                                  break;
>                          }
> -                       if (server_id_opt) {
> -                               /* client was talking specifically to us.
> -                                * "No, we don't have this IP for you". */
> +                       /* No lease for this MAC, or lease IP != requested IP */
> +
> +                       if (server_id_opt    /* client is in SELECTING state */
> +                        || requested_ip_opt /* client is in INIT-REBOOT state */
> +                       ) {
> +                               /* "No, we don't have this IP for you" */
>                                  send_NAK(&packet);
> -                       }
> +                       } /* else: client is in RENEWING or REBINDING, do not answer */
> +
>                          break;
>
>                  case DHCPDECLINE:
>
>
>    
This solution works on 1.13.2.

Another option would be to call send_offer(&packet) and only 
send_NAK(&packet) if that fails.
send_offer() validates the packet before it completes. However 
send_offer() in the git version returns void :(

Cheers

Grahame Jordan




More information about the busybox mailing list