udhcpc: ignore NAKs from "wrong" servers. Closes 4267
function old new delta udhcpc_main 2716 2814 +98 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
@@ -1232,7 +1232,7 @@ static void client_background(void)
|
|||||||
int udhcpc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
int udhcpc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||||
int udhcpc_main(int argc UNUSED_PARAM, char **argv)
|
int udhcpc_main(int argc UNUSED_PARAM, char **argv)
|
||||||
{
|
{
|
||||||
uint8_t *temp, *message;
|
uint8_t *message;
|
||||||
const char *str_V, *str_h, *str_F, *str_r;
|
const char *str_V, *str_h, *str_F, *str_r;
|
||||||
IF_FEATURE_UDHCP_PORT(char *str_P;)
|
IF_FEATURE_UDHCP_PORT(char *str_P;)
|
||||||
void *clientid_mac_ptr;
|
void *clientid_mac_ptr;
|
||||||
@@ -1640,6 +1640,8 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
case INIT_SELECTING:
|
case INIT_SELECTING:
|
||||||
/* Must be a DHCPOFFER */
|
/* Must be a DHCPOFFER */
|
||||||
if (*message == DHCPOFFER) {
|
if (*message == DHCPOFFER) {
|
||||||
|
uint8_t *temp;
|
||||||
|
|
||||||
/* What exactly is server's IP? There are several values.
|
/* What exactly is server's IP? There are several values.
|
||||||
* Example DHCP offer captured with tchdump:
|
* Example DHCP offer captured with tchdump:
|
||||||
*
|
*
|
||||||
@@ -1689,6 +1691,7 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
if (*message == DHCPACK) {
|
if (*message == DHCPACK) {
|
||||||
uint32_t lease_seconds;
|
uint32_t lease_seconds;
|
||||||
struct in_addr temp_addr;
|
struct in_addr temp_addr;
|
||||||
|
uint8_t *temp;
|
||||||
|
|
||||||
temp = udhcp_get_option(&packet, DHCP_LEASE_TIME);
|
temp = udhcp_get_option(&packet, DHCP_LEASE_TIME);
|
||||||
if (!temp) {
|
if (!temp) {
|
||||||
@@ -1766,6 +1769,26 @@ int udhcpc_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
continue; /* back to main loop */
|
continue; /* back to main loop */
|
||||||
}
|
}
|
||||||
if (*message == DHCPNAK) {
|
if (*message == DHCPNAK) {
|
||||||
|
/* If network has more than one DHCP server,
|
||||||
|
* "wrong" server can reply first, with a NAK.
|
||||||
|
* Do not interpret it as a NAK from "our" server.
|
||||||
|
*/
|
||||||
|
if (server_addr != 0) {
|
||||||
|
uint32_t svid;
|
||||||
|
uint8_t *temp;
|
||||||
|
|
||||||
|
temp = udhcp_get_option(&packet, DHCP_SERVER_ID);
|
||||||
|
if (!temp) {
|
||||||
|
non_matching_svid:
|
||||||
|
log1("%s with wrong server ID, ignoring packet",
|
||||||
|
"Received DHCP NAK"
|
||||||
|
);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
move_from_unaligned32(svid, temp);
|
||||||
|
if (svid != server_addr)
|
||||||
|
goto non_matching_svid;
|
||||||
|
}
|
||||||
/* return to init state */
|
/* return to init state */
|
||||||
bb_info_msg("Received DHCP NAK");
|
bb_info_msg("Received DHCP NAK");
|
||||||
udhcp_run_script(&packet, "nak");
|
udhcp_run_script(&packet, "nak");
|
||||||
|
Reference in New Issue
Block a user