dhcpd: smaller code: do not look for REQUESTED_IP twice
text data bss dec hex filename 883235 936 17192 901363 dc0f3 busybox_old 883219 936 17192 901347 dc0e3 busybox_unstripped Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
b271ad46dc
commit
fa5e295600
@ -133,7 +133,10 @@ static uint32_t select_lease_time(struct dhcp_packet *packet)
|
|||||||
|
|
||||||
/* We got a DHCP DISCOVER. Send an OFFER. */
|
/* We got a DHCP DISCOVER. Send an OFFER. */
|
||||||
/* NOINLINE: limit stack usage in caller */
|
/* 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;
|
struct dhcp_packet packet;
|
||||||
uint32_t lease_time_sec;
|
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) {
|
if (!static_lease_nip) {
|
||||||
/* We have no static lease for client's chaddr */
|
/* We have no static lease for client's chaddr */
|
||||||
uint32_t req_nip;
|
uint32_t req_nip;
|
||||||
uint8_t *req_ip_opt;
|
|
||||||
const char *p_host_name;
|
const char *p_host_name;
|
||||||
|
|
||||||
if (lease) {
|
if (lease) {
|
||||||
@ -158,9 +160,9 @@ static NOINLINE void send_offer(struct dhcp_packet *oldpacket, uint32_t static_l
|
|||||||
packet.yiaddr = lease->lease_nip;
|
packet.yiaddr = lease->lease_nip;
|
||||||
}
|
}
|
||||||
/* Or: if client has requested an IP */
|
/* 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) */
|
/* (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 */
|
/* and the IP is in the lease range */
|
||||||
&& ntohl(req_nip) >= server_config.start_ip
|
&& ntohl(req_nip) >= server_config.start_ip
|
||||||
&& ntohl(req_nip) <= server_config.end_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, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||||
int udhcpd_main(int argc UNUSED_PARAM, char **argv)
|
int udhcpd_main(int argc UNUSED_PARAM, char **argv)
|
||||||
{
|
{
|
||||||
fd_set rfds;
|
|
||||||
int server_socket = -1, retval, max_sock;
|
int server_socket = -1, retval, max_sock;
|
||||||
struct dhcp_packet packet;
|
|
||||||
uint8_t *state;
|
uint8_t *state;
|
||||||
uint32_t static_lease_nip;
|
|
||||||
unsigned timeout_end;
|
unsigned timeout_end;
|
||||||
unsigned num_ips;
|
unsigned num_ips;
|
||||||
unsigned opt;
|
unsigned opt;
|
||||||
struct option_set *option;
|
struct option_set *option;
|
||||||
struct dyn_lease *lease, fake_lease;
|
|
||||||
IF_FEATURE_UDHCP_PORT(char *str_P;)
|
IF_FEATURE_UDHCP_PORT(char *str_P;)
|
||||||
|
|
||||||
#if ENABLE_FEATURE_UDHCP_PORT
|
#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;
|
timeout_end = monotonic_sec() + server_config.auto_time;
|
||||||
while (1) { /* loop until universe collapses */
|
while (1) { /* loop until universe collapses */
|
||||||
|
fd_set rfds;
|
||||||
|
struct dhcp_packet packet;
|
||||||
int bytes;
|
int bytes;
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
uint8_t *server_id_opt;
|
uint8_t *server_id_opt;
|
||||||
uint8_t *requested_opt;
|
uint8_t *requested_ip_opt;
|
||||||
uint32_t requested_nip = requested_nip; /* for compiler */
|
uint32_t requested_nip = requested_nip; /* for compiler */
|
||||||
|
uint32_t static_lease_nip;
|
||||||
|
struct dyn_lease *lease, fake_lease;
|
||||||
|
|
||||||
if (server_socket < 0) {
|
if (server_socket < 0) {
|
||||||
server_socket = udhcp_listen_socket(/*INADDR_ANY,*/ SERVER_PORT,
|
server_socket = udhcp_listen_socket(/*INADDR_ANY,*/ SERVER_PORT,
|
||||||
@ -443,6 +445,18 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
continue;
|
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 */
|
/* Look for a static/dynamic lease */
|
||||||
static_lease_nip = get_static_nip_by_mac(server_config.static_leases, &packet.chaddr);
|
static_lease_nip = get_static_nip_by_mac(server_config.static_leases, &packet.chaddr);
|
||||||
if (static_lease_nip) {
|
if (static_lease_nip) {
|
||||||
@ -455,20 +469,10 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
lease = find_lease_by_mac(packet.chaddr);
|
lease = find_lease_by_mac(packet.chaddr);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get REQUESTED_IP and SERVER_ID if present */
|
/* Get REQUESTED_IP if present */
|
||||||
server_id_opt = udhcp_get_option(&packet, DHCP_SERVER_ID);
|
requested_ip_opt = udhcp_get_option(&packet, DHCP_REQUESTED_IP);
|
||||||
if (server_id_opt) {
|
if (requested_ip_opt) {
|
||||||
uint32_t server_id_net;
|
move_from_unaligned32(requested_nip, requested_ip_opt);
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (state[0]) {
|
switch (state[0]) {
|
||||||
@ -476,7 +480,7 @@ int udhcpd_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
case DHCPDISCOVER:
|
case DHCPDISCOVER:
|
||||||
log1("Received DISCOVER");
|
log1("Received DISCOVER");
|
||||||
|
|
||||||
send_offer(&packet, static_lease_nip, lease);
|
send_offer(&packet, static_lease_nip, lease, requested_ip_opt);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DHCPREQUEST:
|
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
|
A DHCP server MAY extend a client's lease only if it has local
|
||||||
administrative authority to do so.
|
administrative authority to do so.
|
||||||
*/
|
*/
|
||||||
if (!requested_opt) {
|
if (!requested_ip_opt) {
|
||||||
requested_nip = packet.ciaddr;
|
requested_nip = packet.ciaddr;
|
||||||
if (requested_nip == 0) {
|
if (requested_nip == 0) {
|
||||||
log1("no requested IP and no ciaddr, ignoring");
|
log1("no requested IP and no ciaddr, ignoring");
|
||||||
@ -603,7 +607,7 @@ o DHCPREQUEST generated during REBINDING state:
|
|||||||
*/
|
*/
|
||||||
log1("Received DECLINE");
|
log1("Received DECLINE");
|
||||||
if (server_id_opt
|
if (server_id_opt
|
||||||
&& requested_opt
|
&& requested_ip_opt
|
||||||
&& lease /* chaddr matches this lease */
|
&& lease /* chaddr matches this lease */
|
||||||
&& requested_nip == lease->lease_nip
|
&& requested_nip == lease->lease_nip
|
||||||
) {
|
) {
|
||||||
|
Loading…
Reference in New Issue
Block a user