diff options
-rw-r--r-- | networking/udhcp/dhcpd.c | 56 |
1 files changed, 30 insertions, 26 deletions
diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c index a015cf038..ac77b511d 100644 --- a/networking/udhcp/dhcpd.c +++ b/networking/udhcp/dhcpd.c @@ -133,7 +133,10 @@ static uint32_t select_lease_time(struct dhcp_packet *packet) /* We got a DHCP DISCOVER. Send an OFFER. */ /* NOINLINE: limit stack usage in caller */ -static NOINLINE void send_offer(struct dhcp_packet *oldpacket, uint32_t static_lease_nip, struct dyn_lease *lease) +static NOINLINE void send_offer(struct dhcp_packet *oldpacket, + uint32_t static_lease_nip, + struct dyn_lease *lease, + uint8_t *requested_ip_opt) { struct dhcp_packet packet; uint32_t lease_time_sec; @@ -147,7 +150,6 @@ static NOINLINE void send_offer(struct dhcp_packet *oldpacket, uint32_t static_l if (!static_lease_nip) { /* We have no static lease for client's chaddr */ uint32_t req_nip; - uint8_t *req_ip_opt; const char *p_host_name; if (lease) { @@ -158,9 +160,9 @@ static NOINLINE void send_offer(struct dhcp_packet *oldpacket, uint32_t static_l packet.yiaddr = lease->lease_nip; } /* Or: if client has requested an IP */ - else if ((req_ip_opt = udhcp_get_option(oldpacket, DHCP_REQUESTED_IP)) != NULL + else if (requested_ip_opt != NULL /* (read IP) */ - && (move_from_unaligned32(req_nip, req_ip_opt), 1) + && (move_from_unaligned32(req_nip, requested_ip_opt), 1) /* and the IP is in the lease range */ && ntohl(req_nip) >= server_config.start_ip && ntohl(req_nip) <= server_config.end_ip @@ -283,16 +285,12 @@ struct dyn_lease *g_leases; int udhcpd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int udhcpd_main(int argc UNUSED_PARAM, char **argv) { - fd_set rfds; int server_socket = -1, retval, max_sock; - struct dhcp_packet packet; uint8_t *state; - uint32_t static_lease_nip; unsigned timeout_end; unsigned num_ips; unsigned opt; struct option_set *option; - struct dyn_lease *lease, fake_lease; IF_FEATURE_UDHCP_PORT(char *str_P;) #if ENABLE_FEATURE_UDHCP_PORT @@ -372,11 +370,15 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv) timeout_end = monotonic_sec() + server_config.auto_time; while (1) { /* loop until universe collapses */ + fd_set rfds; + struct dhcp_packet packet; int bytes; struct timeval tv; uint8_t *server_id_opt; - uint8_t *requested_opt; + uint8_t *requested_ip_opt; uint32_t requested_nip = requested_nip; /* for compiler */ + uint32_t static_lease_nip; + struct dyn_lease *lease, fake_lease; if (server_socket < 0) { server_socket = udhcp_listen_socket(/*INADDR_ANY,*/ SERVER_PORT, @@ -443,6 +445,18 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv) continue; } + /* Get SERVER_ID if present */ + server_id_opt = udhcp_get_option(&packet, DHCP_SERVER_ID); + if (server_id_opt) { + uint32_t server_id_net; + move_from_unaligned32(server_id_net, server_id_opt); + if (server_id_net != server_config.server_nip) { + /* client talks to somebody else */ + log1("server ID doesn't match, ignoring"); + continue; + } + } + /* Look for a static/dynamic lease */ static_lease_nip = get_static_nip_by_mac(server_config.static_leases, &packet.chaddr); if (static_lease_nip) { @@ -455,20 +469,10 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv) lease = find_lease_by_mac(packet.chaddr); } - /* Get REQUESTED_IP and SERVER_ID if present */ - server_id_opt = udhcp_get_option(&packet, DHCP_SERVER_ID); - if (server_id_opt) { - uint32_t server_id_net; - move_from_unaligned32(server_id_net, server_id_opt); - if (server_id_net != server_config.server_nip) { - /* client talks to somebody else */ - log1("server ID doesn't match, ignoring"); - continue; - } - } - requested_opt = udhcp_get_option(&packet, DHCP_REQUESTED_IP); - if (requested_opt) { - move_from_unaligned32(requested_nip, requested_opt); + /* Get REQUESTED_IP if present */ + requested_ip_opt = udhcp_get_option(&packet, DHCP_REQUESTED_IP); + if (requested_ip_opt) { + move_from_unaligned32(requested_nip, requested_ip_opt); } switch (state[0]) { @@ -476,7 +480,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv) case DHCPDISCOVER: log1("Received DISCOVER"); - send_offer(&packet, static_lease_nip, lease); + send_offer(&packet, static_lease_nip, lease, requested_ip_opt); break; case DHCPREQUEST: @@ -567,7 +571,7 @@ o DHCPREQUEST generated during REBINDING state: A DHCP server MAY extend a client's lease only if it has local administrative authority to do so. */ - if (!requested_opt) { + if (!requested_ip_opt) { requested_nip = packet.ciaddr; if (requested_nip == 0) { log1("no requested IP and no ciaddr, ignoring"); @@ -603,7 +607,7 @@ o DHCPREQUEST generated during REBINDING state: */ log1("Received DECLINE"); if (server_id_opt - && requested_opt + && requested_ip_opt && lease /* chaddr matches this lease */ && requested_nip == lease->lease_nip ) { |