diff options
author | Stas Sergeev <stsp2@yandex.ru> | 2023-10-03 13:01:22 +0500 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2023-10-04 23:39:58 +0200 |
commit | f851084c96e0a932e51c15ad9551e2cd85362147 (patch) | |
tree | ea33b11a8976bd404442e7483bf476c62ae9747f | |
parent | a469fc393fa1dfadc7c51c2729550597ee171a8e (diff) | |
download | passt-f851084c96e0a932e51c15ad9551e2cd85362147.tar passt-f851084c96e0a932e51c15ad9551e2cd85362147.tar.gz passt-f851084c96e0a932e51c15ad9551e2cd85362147.tar.bz2 passt-f851084c96e0a932e51c15ad9551e2cd85362147.tar.lz passt-f851084c96e0a932e51c15ad9551e2cd85362147.tar.xz passt-f851084c96e0a932e51c15ad9551e2cd85362147.tar.zst passt-f851084c96e0a932e51c15ad9551e2cd85362147.zip |
dhcp: put option 53 at the beginning2023_10_04.f851084
... 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>
-rw-r--r-- | dhcp.c | 7 |
1 files changed, 7 insertions, 0 deletions
@@ -149,6 +149,13 @@ static int fill(struct msg *m) for (o = 0; o < 255; o++) 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++) { o = opts[55].c[i]; if (opts[o].slen) |