From 148788eb0ee96026105755cf3fd1ad3d94f49cd2 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Thu, 21 Jun 2018 17:36:22 +0200 Subject: [PATCH] udhcpc: remove code which requires server ID to be on local network This reverts "udhcpc: paranoia when using kernel UDP mode for sending renew: server ID may be bogus". Users complain that they do have servers behind routers (with DHCP relays). function old new delta send_packet 168 166 -2 bcast_or_ucast 25 23 -2 udhcp_send_kernel_packet 301 295 -6 ------------------------------------------------------------------------------ (add/remove: 0/0 grow/shrink: 0/3 up/down: 0/-10) Total: -10 bytes Signed-off-by: Denys Vlasenko --- networking/udhcp/common.h | 4 +--- networking/udhcp/d6_dhcpc.c | 4 +--- networking/udhcp/dhcpc.c | 10 ++-------- networking/udhcp/dhcpd.c | 4 +--- networking/udhcp/packet.c | 7 +++---- 5 files changed, 8 insertions(+), 21 deletions(-) diff --git a/networking/udhcp/common.h b/networking/udhcp/common.h index 5f890459c..50ea9199b 100644 --- a/networking/udhcp/common.h +++ b/networking/udhcp/common.h @@ -317,9 +317,7 @@ int udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt, int udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt, uint32_t source_nip, int source_port, - uint32_t dest_nip, int dest_port, - int send_flags -) FAST_FUNC; + uint32_t dest_nip, int dest_port) FAST_FUNC; void udhcp_sp_setup(void) FAST_FUNC; void udhcp_sp_fd_set(struct pollfd *pfds, int extra_fd) FAST_FUNC; diff --git a/networking/udhcp/d6_dhcpc.c b/networking/udhcp/d6_dhcpc.c index 4dbc2b1bd..ed2255ef3 100644 --- a/networking/udhcp/d6_dhcpc.c +++ b/networking/udhcp/d6_dhcpc.c @@ -803,15 +803,13 @@ static NOINLINE int send_d6_renew(uint32_t xid, struct in6_addr *server_ipv6, st opt_ptr = add_d6_client_options(opt_ptr); bb_error_msg("sending %s", "renew"); - if (server_ipv6) { + if (server_ipv6) return d6_send_kernel_packet( &packet, (opt_ptr - (uint8_t*) &packet), our_cur_ipv6, CLIENT_PORT6, server_ipv6, SERVER_PORT6, client_config.ifindex - /* TODO? send_flags: MSG_DONTROUTE (see IPv4 code for reason why) */ ); - } return d6_mcast_from_client_config_ifindex(&packet, opt_ptr); } diff --git a/networking/udhcp/dhcpc.c b/networking/udhcp/dhcpc.c index c206a5825..c2805a009 100644 --- a/networking/udhcp/dhcpc.c +++ b/networking/udhcp/dhcpc.c @@ -693,16 +693,10 @@ static int raw_bcast_from_client_config_ifindex(struct dhcp_packet *packet, uint static int bcast_or_ucast(struct dhcp_packet *packet, uint32_t ciaddr, uint32_t server) { - if (server) { - /* Without MSG_DONTROUTE, the packet was seen routed over - * _other interface_ if server ID is bogus (example: 1.1.1.1). - */ + if (server) return udhcp_send_kernel_packet(packet, ciaddr, CLIENT_PORT, - server, SERVER_PORT, - /*send_flags: "to hosts only on directly connected networks" */ MSG_DONTROUTE - ); - } + server, SERVER_PORT); return raw_bcast_from_client_config_ifindex(packet, ciaddr); } diff --git a/networking/udhcp/dhcpd.c b/networking/udhcp/dhcpd.c index ef59dca5c..a8cd3f03b 100644 --- a/networking/udhcp/dhcpd.c +++ b/networking/udhcp/dhcpd.c @@ -591,9 +591,7 @@ static void send_packet_to_relay(struct dhcp_packet *dhcp_pkt) udhcp_send_kernel_packet(dhcp_pkt, server_config.server_nip, SERVER_PORT, - dhcp_pkt->gateway_nip, SERVER_PORT, - /*send_flags:*/ 0 - ); + dhcp_pkt->gateway_nip, SERVER_PORT); } static void send_packet(struct dhcp_packet *dhcp_pkt, int force_broadcast) diff --git a/networking/udhcp/packet.c b/networking/udhcp/packet.c index fc2bb5416..ff16904f7 100644 --- a/networking/udhcp/packet.c +++ b/networking/udhcp/packet.c @@ -189,8 +189,7 @@ 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, - int send_flags) + uint32_t dest_nip, int dest_port) { struct sockaddr_in sa; unsigned padding; @@ -227,8 +226,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 = send(fd, dhcp_pkt, DHCP_SIZE - padding, send_flags); - msg = "send"; + result = safe_write(fd, dhcp_pkt, DHCP_SIZE - padding); + msg = "write"; ret_close: close(fd); if (result < 0) {