... unless it is listed in 55. Many clients expect option 53 at the beginning. mTCP has this code: if ( resp->options[0] != 53 ) { TRACE_WARN(( "Dhcp: first option was not a Dhcp msg type\n" )); return; } wattcp32 has this: static int DHCP_is_ack (void) { const BYTE *opt = (const BYTE*) &dhcp_in.dh_opt[4]; return (opt[0] == DHCP_OPT_MSG_TYPE && opt[1] == 1 && opt[2] == DHCP_ACK); } static int DHCP_is_nack (void) { const BYTE *opt = (const BYTE*) &dhcp_in.dh_opt[4]; return (opt[0] == DHCP_OPT_MSG_TYPE && opt[1] == 1 && opt[2] == DHCP_NAK); } Link: https://bugs.passt.top/show_bug.cgi?id=77 Signed-off-by: Stas Sergeev <stsp2(a)yandex.ru> --- dhcp.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/dhcp.c b/dhcp.c index 46c258e..eed1b4a 100644 --- a/dhcp.c +++ b/dhcp.c @@ -149,6 +149,12 @@ static int fill(struct msg *m) for (o = 0; o < 255; o++) opts[o].sent = 0; + /* Some clients (wattcp32, mTCP, maybe some other) expect + * options 53 at the beginning of the list. + * Put it there explicitly, unless requested via option 55. + */ + if (!memchr(opts[55].c, 53, opts[55].clen)) + fill_one(m, 53, &offset); for (i = 0; i < opts[55].clen; i++) { o = opts[55].c[i]; if (opts[o].slen) -- 2.40.1