diff options
Diffstat (limited to 'package/busybox/patches/241-udhcpc-oversized_packets.patch')
-rw-r--r-- | package/busybox/patches/241-udhcpc-oversized_packets.patch | 99 |
1 files changed, 0 insertions, 99 deletions
diff --git a/package/busybox/patches/241-udhcpc-oversized_packets.patch b/package/busybox/patches/241-udhcpc-oversized_packets.patch deleted file mode 100644 index 471d704..0000000 --- a/package/busybox/patches/241-udhcpc-oversized_packets.patch +++ /dev/null @@ -1,99 +0,0 @@ ---- a/networking/udhcp/packet.c -+++ b/networking/udhcp/packet.c -@@ -158,6 +158,11 @@ uint16_t FAST_FUNC udhcp_checksum(void * - return ~sum; - } - -+int udhcp_get_payload_len(struct dhcp_packet *dhcp_pkt) -+{ -+ return sizeof(struct dhcp_packet) - DHCP_OPTIONS_BUFSIZE + udhcp_end_option(dhcp_pkt->options) + sizeof(dhcp_pkt->options[0]); -+} -+ - /* Construct a ip/udp header for a packet, send packet */ - int FAST_FUNC udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt, - uint32_t source_nip, int source_port, -@@ -166,10 +171,10 @@ int FAST_FUNC udhcp_send_raw_packet(stru - { - struct sockaddr_ll dest_sll; - struct ip_udp_dhcp_packet packet; -- unsigned padding; - int fd; - int result = -1; - const char *msg; -+ int p_len = udhcp_get_payload_len(dhcp_pkt); - - fd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP)); - if (fd < 0) { -@@ -178,8 +183,8 @@ int FAST_FUNC udhcp_send_raw_packet(stru - } - - memset(&dest_sll, 0, sizeof(dest_sll)); -- memset(&packet, 0, offsetof(struct ip_udp_dhcp_packet, data)); -- packet.data = *dhcp_pkt; /* struct copy */ -+ memset(&packet, 0, sizeof(packet)); -+ memcpy(&(packet.data), dhcp_pkt, p_len); - - dest_sll.sll_family = AF_PACKET; - dest_sll.sll_protocol = htons(ETH_P_IP); -@@ -192,36 +197,24 @@ int FAST_FUNC udhcp_send_raw_packet(stru - goto ret_close; - } - -- /* We were sending full-sized DHCP packets (zero padded), -- * but some badly configured servers were seen dropping them. -- * Apparently they drop all DHCP packets >576 *ethernet* octets big, -- * whereas they may only drop packets >576 *IP* octets big -- * (which for typical Ethernet II means 590 octets: 6+6+2 + 576). -- * -- * In order to work with those buggy servers, -- * we truncate packets after end option byte. -- */ -- padding = DHCP_OPTIONS_BUFSIZE - 1 - udhcp_end_option(packet.data.options); -- - packet.ip.protocol = IPPROTO_UDP; - packet.ip.saddr = source_nip; - packet.ip.daddr = dest_nip; - packet.udp.source = htons(source_port); - packet.udp.dest = htons(dest_port); -- /* size, excluding IP header: */ -- packet.udp.len = htons(UDP_DHCP_SIZE - padding); -- /* for UDP checksumming, ip.len is set to UDP packet len */ -+ p_len += sizeof(packet.udp); -+ packet.udp.len = htons(p_len); - packet.ip.tot_len = packet.udp.len; -- packet.udp.check = udhcp_checksum(&packet, IP_UDP_DHCP_SIZE - padding); -- /* but for sending, it is set to IP packet len */ -- packet.ip.tot_len = htons(IP_UDP_DHCP_SIZE - padding); -+ p_len += sizeof(packet.ip); -+ packet.udp.check = udhcp_checksum(&packet, p_len); -+ packet.ip.tot_len = htons(p_len); - packet.ip.ihl = sizeof(packet.ip) >> 2; - packet.ip.version = IPVERSION; - packet.ip.ttl = IPDEFTTL; - packet.ip.check = udhcp_checksum(&packet.ip, sizeof(packet.ip)); - - udhcp_dump_packet(dhcp_pkt); -- result = sendto(fd, &packet, IP_UDP_DHCP_SIZE - padding, /*flags:*/ 0, -+ result = sendto(fd, &packet, p_len, /*flags:*/ 0, - (struct sockaddr *) &dest_sll, sizeof(dest_sll)); - msg = "sendto"; - ret_close: -@@ -239,7 +232,6 @@ int FAST_FUNC udhcp_send_kernel_packet(s - uint32_t dest_nip, int dest_port) - { - struct sockaddr_in client; -- unsigned padding; - int fd; - int result = -1; - const char *msg; -@@ -270,9 +262,7 @@ int FAST_FUNC udhcp_send_kernel_packet(s - } - - udhcp_dump_packet(dhcp_pkt); -- -- padding = DHCP_OPTIONS_BUFSIZE - 1 - udhcp_end_option(dhcp_pkt->options); -- result = safe_write(fd, dhcp_pkt, DHCP_SIZE - padding); -+ result = safe_write(fd, dhcp_pkt, udhcp_get_payload_len(dhcp_pkt)); - msg = "write"; - ret_close: - close(fd); |