diff options
-rw-r--r-- | networking/udhcp/packet.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/networking/udhcp/packet.c b/networking/udhcp/packet.c index 33c9585cf..148f52551 100644 --- a/networking/udhcp/packet.c +++ b/networking/udhcp/packet.c @@ -143,8 +143,15 @@ int FAST_FUNC udhcp_send_raw_packet(struct dhcp_packet *dhcp_pkt, * * In order to work with those buggy servers, * we truncate packets after end option byte. + * + * However, RFC 1542 says "The IP Total Length and UDP Length + * must be large enough to contain the minimal BOOTP header of 300 octets". + * Thus, we retain enough padding to not go below 300 BOOTP bytes. + * Some devices have filters which drop DHCP packets shorter than that. */ padding = DHCP_OPTIONS_BUFSIZE - 1 - udhcp_end_option(packet.data.options); + if (padding > DHCP_SIZE - 300) + padding = DHCP_SIZE - 300; packet.ip.protocol = IPPROTO_UDP; packet.ip.saddr = source_nip; @@ -215,6 +222,8 @@ int FAST_FUNC udhcp_send_kernel_packet(struct dhcp_packet *dhcp_pkt, udhcp_dump_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"; ret_close: |