RFC2132 is not clear about whether the "Maximum DHCP Message Size"

refers to the size of the whole ethernet packet, just the DHCP
message within the UDP payload, or something else. bootpd interpreted
it as a maximum UDP payload size, so it could end up sending
fragmented packets to clients (such as some versions of Etherboot)
that used different interpretations of the maximum message size.

Switch to the most conservative interpretation: ensure that the
ethernet packet containing the response is no larger than the
specified maximum message size. This matches the behaviour of
the ISC dhcpd.

MFC after:	1 week
This commit is contained in:
Ian Dowse 2001-09-25 21:02:10 +00:00
parent 2510719736
commit 3f48bf186f
2 changed files with 4 additions and 2 deletions

View File

@ -38,6 +38,8 @@ SOFTWARE.
#define BP_FILE_LEN 128
#define BP_VEND_LEN 64
#define BP_MINPKTSZ 300 /* to check sizeof(struct bootp) */
/* Overhead to fit a bootp message into an Ethernet packet. */
#define BP_MSG_OVERHEAD (14 + 20 + 8) /* Ethernet + IP + UDP headers */
struct bootp {
unsigned char bp_op; /* packet opcode type */

View File

@ -1292,10 +1292,10 @@ dovend_rfc1048(bp, hp, bootsize)
p += len;
}
if (msgsz > sizeof(*bp)) {
if (msgsz > sizeof(*bp) + BP_MSG_OVERHEAD) {
if (debug > 1)
report(LOG_INFO, "request has DHCP msglen=%d", msgsz);
pktlen = msgsz;
pktlen = msgsz - BP_MSG_OVERHEAD;
}
}
}