diff options
author | Denys Vlasenko | 2017-09-29 15:55:24 +0200 |
---|---|---|
committer | Denys Vlasenko | 2017-09-29 16:02:11 +0200 |
commit | a6a3ad327360669e0c12552f680382e3b9713489 (patch) | |
tree | 7dcfc65aa41e6f0f22e5b6631c35dbae8b99052f /networking/udhcp/packet.c | |
parent | 2b9acc60c0468379cd24d13bc9e3f3e50761c0c9 (diff) | |
download | busybox-a6a3ad327360669e0c12552f680382e3b9713489.zip busybox-a6a3ad327360669e0c12552f680382e3b9713489.tar.gz |
udhcpc: paranoia when using kernel UDP mode for sending renew: server ID may be bogus
With new code, we request that target IP (server ID) must be directly reachable.
If it's not, this happens:
udhcpc: waiting 2000 seconds
udhcpc: entering listen mode: kernel
udhcpc: opening listen socket on *:68 wlan0
udhcpc: entering renew state
udhcpc: sending renew to 1.1.1.1
udhcpc: send: Network is unreachable
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1.1.1.1 needs routing, this is fishy!
udhcpc: entering rebinding state
udhcpc: entering listen mode: raw
udhcpc: created raw socket
udhcpc: sending renew to 0.0.0.0
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ going to use broadcast
which is the desired behavior. Before the patch, packet to 1.1.1.1 was routed
over eth0 (!) and maybe even into Internet (!!!).
function old new delta
udhcpc_main 2752 2763 +11
udhcp_send_kernel_packet 295 301 +6
send_renew 82 84 +2
send_packet 166 168 +2
bcast_or_ucast 23 25 +2
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 5/0 up/down: 23/0) Total: 23 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking/udhcp/packet.c')
-rw-r--r-- | networking/udhcp/packet.c | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/networking/udhcp/packet.c b/networking/udhcp/packet.c index 44d9cee..ad0028b 100644 --- a/networking/udhcp/packet.c +++ b/networking/udhcp/packet.c @@ -191,7 +191,8 @@ int FAST_FUNC udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt, /* Let the kernel do all the work for packet generation */ int FAST_FUNC udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt, uint32_t source_nip, int source_port, - uint32_t dest_nip, int dest_port) + uint32_t dest_nip, int dest_port, + int send_flags) { struct sockaddr_in sa; unsigned padding; @@ -228,8 +229,8 @@ int FAST_FUNC udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt, padding = DHCP_OPTIONS_BUFSIZE - 1 - udhcp_end_option(dhcp_pkt->options); if (padding > DHCP_SIZE - 300) padding = DHCP_SIZE - 300; - result = safe_write(fd, dhcp_pkt, DHCP_SIZE - padding); - msg = "write"; + result = send(fd, dhcp_pkt, DHCP_SIZE - padding, send_flags); + msg = "send"; ret_close: close(fd); if (result < 0) { |