diff options
Diffstat (limited to 'networking/udhcp')
-rw-r--r-- | networking/udhcp/clientpacket.c | 15 | ||||
-rw-r--r-- | networking/udhcp/dhcpc.c | 6 | ||||
-rw-r--r-- | networking/udhcp/dhcpc.h | 1 | ||||
-rw-r--r-- | networking/udhcp/files.c | 6 |
4 files changed, 20 insertions, 8 deletions
diff --git a/networking/udhcp/clientpacket.c b/networking/udhcp/clientpacket.c index 29d0d9a1d..f826c1b94 100644 --- a/networking/udhcp/clientpacket.c +++ b/networking/udhcp/clientpacket.c @@ -62,17 +62,20 @@ static void add_param_req_option(struct dhcpMessage *packet) int end = end_option(packet->options); int i, len = 0; - packet->options[end + OPT_CODE] = DHCP_PARAM_REQ; for (i = 0; (c = dhcp_options[i].code) != 0; i++) { - if ((dhcp_options[i].flags & OPTION_REQ) + if (((dhcp_options[i].flags & OPTION_REQ) + && !client_config.no_default_options) || (client_config.opt_mask[c >> 3] & (1 << (c & 7))) ) { packet->options[end + OPT_DATA + len] = c; len++; } } - packet->options[end + OPT_LEN] = len; - packet->options[end + OPT_DATA + len] = DHCP_END; + if (len) { + packet->options[end + OPT_CODE] = DHCP_PARAM_REQ; + packet->options[end + OPT_LEN] = len; + packet->options[end + OPT_DATA + len] = DHCP_END; + } } @@ -107,7 +110,9 @@ int send_discover(uint32_t xid, uint32_t requested) /* Explicitly saying that we want RFC-compliant packets helps * some buggy DHCP servers to NOT send bigger packets */ add_simple_option(packet.options, DHCP_MAX_SIZE, htons(576)); + add_param_req_option(&packet); + bb_info_msg("Sending discover..."); return udhcp_send_raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST, SERVER_PORT, MAC_BCAST_ADDR, client_config.ifindex); @@ -125,8 +130,8 @@ int send_selecting(uint32_t xid, uint32_t server, uint32_t requested) add_simple_option(packet.options, DHCP_REQUESTED_IP, requested); add_simple_option(packet.options, DHCP_SERVER_ID, server); - add_param_req_option(&packet); + addr.s_addr = requested; bb_info_msg("Sending select for %s...", inet_ntoa(addr)); return udhcp_send_raw_packet(&packet, INADDR_ANY, CLIENT_PORT, INADDR_BROADCAST, diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index bc0676152..fb328cb03 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c @@ -182,6 +182,7 @@ int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv) OPT_W = 1 << 21, #endif OPT_P = 1 << 22, + OPT_o = 1 << 23, }; #if ENABLE_GETOPT_LONG static const char udhcpc_longopts[] ALIGN1 = @@ -211,6 +212,7 @@ int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv) #if ENABLE_FEATURE_UDHCP_PORT "client-port\0" Required_argument "P" #endif + "no-default-options\0" No_argument "o" ; #endif /* Default options. */ @@ -230,7 +232,7 @@ int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv) opt = getopt32(argv, "c:CV:fbH:h:F:i:np:qRr:s:T:t:vSA:" USE_FEATURE_UDHCPC_ARPING("aW:") USE_FEATURE_UDHCP_PORT("P:") - "O:" + "O:o" , &str_c, &str_V, &str_h, &str_h, &str_F , &client_config.interface, &client_config.pidfile, &str_r , &client_config.script @@ -291,6 +293,8 @@ int udhcpc_main(int argc ATTRIBUTE_UNUSED, char **argv) SERVER_PORT = CLIENT_PORT - 1; } #endif + if (opt & OPT_o) + client_config.no_default_options = 1; while (list_O) { int n = index_in_strings(dhcp_option_strings, list_O->data); if (n < 0) diff --git a/networking/udhcp/dhcpc.h b/networking/udhcp/dhcpc.h index d0fde7302..c8acd4982 100644 --- a/networking/udhcp/dhcpc.h +++ b/networking/udhcp/dhcpc.h @@ -21,6 +21,7 @@ struct client_config_t { char release_on_quit; /* Perform release on quit */ char abort_if_no_lease; /* Abort if no lease */ char background_if_no_lease; /* Fork to background if no lease */ + char no_default_options; /* Do not include default optins in request */ const char *interface; /* The name of the interface to use */ char *pidfile; /* Optionally store the process ID */ const char *script; /* User script to run at dhcp events */ diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c index 6a93bd0e2..043a95bb0 100644 --- a/networking/udhcp/files.c +++ b/networking/udhcp/files.c @@ -396,6 +396,7 @@ void write_leases(void) close(fp); if (server_config.notify_file) { +// TODO: vfork-based child creation char *cmd = xasprintf("%s %s", server_config.notify_file, server_config.lease_file); system(cmd); free(cmd); @@ -406,7 +407,7 @@ void write_leases(void) void read_leases(const char *file) { int fp; - unsigned int i = 0; + unsigned i; struct dhcpOfferedAddr lease; fp = open_or_warn(file, O_RDONLY); @@ -414,6 +415,7 @@ void read_leases(const char *file) return; } + i = 0; while (i < server_config.max_leases && full_read(fp, &lease, sizeof(lease)) == sizeof(lease) ) { @@ -422,7 +424,7 @@ void read_leases(const char *file) if (y >= server_config.start_ip && y <= server_config.end_ip) { lease.expires = ntohl(lease.expires); if (!server_config.remaining) - lease.expires -= time(0); + lease.expires -= time(NULL); if (!(add_lease(lease.chaddr, lease.yiaddr, lease.expires))) { bb_error_msg("too many leases while loading %s", file); break; |