dhcp: put option 53 at the beginning

... 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@yandex.ru>
[sbrivio: s/options 53/option 53/ and s/other/others/ in comment]
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
This commit is contained in:
Stas Sergeev 2023-10-03 13:01:22 +05:00 committed by Stefano Brivio
parent a469fc393f
commit f851084c96

7
dhcp.c
View file

@ -149,6 +149,13 @@ static int fill(struct msg *m)
for (o = 0; o < 255; o++) for (o = 0; o < 255; o++)
opts[o].sent = 0; opts[o].sent = 0;
/* Some clients (wattcp32, mTCP, maybe some others) expect
* option 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++) { for (i = 0; i < opts[55].clen; i++) {
o = opts[55].c[i]; o = opts[55].c[i];
if (opts[o].slen) if (opts[o].slen)