From 2ac5800fd945e41f27954942afa6742c2b6c9781 Mon Sep 17 00:00:00 2001 From: Hans Dedecker Date: Thu, 21 Jun 2018 22:26:18 +0200 Subject: [PATCH] busybox: udhcpc: replace udhcpc_no_msg_dontroute patch by upstream fix Replace 204-udhcpc_no_msg_dontroute patch by the upstream busybox fix which removes the code which requires the server ID to be on local network Signed-off-by: Hans Dedecker --- package/utils/busybox/Makefile | 2 +- .../patches/204-udhcpc_no_msg_dontroute.patch | 11 -- ...de-which-requires-server-ID-to-be-on.patch | 117 ++++++++++++++++++ 3 files changed, 118 insertions(+), 12 deletions(-) delete mode 100644 package/utils/busybox/patches/204-udhcpc_no_msg_dontroute.patch create mode 100644 package/utils/busybox/patches/400-udhcpc-remove-code-which-requires-server-ID-to-be-on.patch diff --git a/package/utils/busybox/Makefile b/package/utils/busybox/Makefile index 77e76af7cd..28375b87c0 100644 --- a/package/utils/busybox/Makefile +++ b/package/utils/busybox/Makefile @@ -9,7 +9,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=busybox PKG_VERSION:=1.28.3 -PKG_RELEASE:=3 +PKG_RELEASE:=4 PKG_FLAGS:=essential PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 diff --git a/package/utils/busybox/patches/204-udhcpc_no_msg_dontroute.patch b/package/utils/busybox/patches/204-udhcpc_no_msg_dontroute.patch deleted file mode 100644 index e70c412d3a..0000000000 --- a/package/utils/busybox/patches/204-udhcpc_no_msg_dontroute.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/networking/udhcp/dhcpc.c -+++ b/networking/udhcp/dhcpc.c -@@ -700,7 +700,7 @@ - return udhcp_send_kernel_packet(packet, - ciaddr, CLIENT_PORT, - server, SERVER_PORT, -- /*send_flags: "to hosts only on directly connected networks" */ MSG_DONTROUTE -+ 0 /*Was MSG_DONTROUTE here. It prevented unicast renewal requests to server in different subnet*/ - ); - } - return raw_bcast_from_client_config_ifindex(packet, ciaddr); diff --git a/package/utils/busybox/patches/400-udhcpc-remove-code-which-requires-server-ID-to-be-on.patch b/package/utils/busybox/patches/400-udhcpc-remove-code-which-requires-server-ID-to-be-on.patch new file mode 100644 index 0000000000..6770391cf2 --- /dev/null +++ b/package/utils/busybox/patches/400-udhcpc-remove-code-which-requires-server-ID-to-be-on.patch @@ -0,0 +1,117 @@ +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(-) + +--- a/networking/udhcp/common.h ++++ b/networking/udhcp/common.h +@@ -308,9 +308,7 @@ int udhcp_send_raw_packet(struct dhcp_pa + + 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; +--- a/networking/udhcp/d6_dhcpc.c ++++ b/networking/udhcp/d6_dhcpc.c +@@ -702,15 +702,13 @@ static NOINLINE int send_d6_renew(uint32 + 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); + } + +--- a/networking/udhcp/dhcpc.c ++++ b/networking/udhcp/dhcpc.c +@@ -693,16 +693,10 @@ static int raw_bcast_from_client_config_ + + 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); + } + +--- a/networking/udhcp/dhcpd.c ++++ b/networking/udhcp/dhcpd.c +@@ -588,9 +588,7 @@ static void send_packet_to_relay(struct + + 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) +--- a/networking/udhcp/packet.c ++++ b/networking/udhcp/packet.c +@@ -189,8 +189,7 @@ int FAST_FUNC udhcp_send_raw_packet(stru + /* 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(s + 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) {