aboutgitcodebugslistschat
path: root/dhcp.c
diff options
context:
space:
mode:
authorStas Sergeev <stsp2@yandex.ru>2023-10-03 13:01:22 +0500
committerStefano Brivio <sbrivio@redhat.com>2023-10-04 23:39:58 +0200
commitf851084c96e0a932e51c15ad9551e2cd85362147 (patch)
treeea33b11a8976bd404442e7483bf476c62ae9747f /dhcp.c
parenta469fc393fa1dfadc7c51c2729550597ee171a8e (diff)
downloadpasst-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>
Diffstat (limited to 'dhcp.c')
-rw-r--r--dhcp.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/dhcp.c b/dhcp.c
index 46c258e..53b4029 100644
--- a/dhcp.c
+++ b/dhcp.c
@@ -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)