Only generate a new xid at the start of getting a new lease.
authorflorian <florian@openbsd.org>
Tue, 13 Feb 2024 12:53:05 +0000 (12:53 +0000)
committerflorian <florian@openbsd.org>
Tue, 13 Feb 2024 12:53:05 +0000 (12:53 +0000)
commitee9c6200f9dcdfe6c777f48c0a27d9aa918683e0
tree0b389a06c50ee490bba625b6bc4446a305b153c8
parentf4285d6dc163455ae3cd46684ed6f35e3d846d32
Only generate a new xid at the start of getting a new lease.

"RFC 2131 4.1 Constructing and sending DHCP messages" has this:

| Selecting a new 'xid' for each retransmission is an implementation
| decision.  A client may choose to reuse the same 'xid' or select a new
| 'xid' for each retransmitted message.

We used to change xid for each request / response cycle but this ran
into problems with slow dhcp servers where we would change the xid too
frequently and would ignore late coming replies from the server.

Andre S points out that table 5 in "4.4.1 Initialization and
allocation of network address" says for the xid field in "DHCPREQUEST"
messages:

| 'xid' from server DHCPOFFER message

This seems to suggest that we need to use the same xid for the whole
DHCPDISCOVER / DHCPOFFER / DHCPREQUEST / DHCPACK exchange of messages.

Nothing else in the RFC is saying this though.

But since there are DHCP servers out there that depend on this, we
only generate a new xid when entering the INIT, REBOOTING and RENEWING
state.

I do wonder if we should just go with a static value of 0x04, which
was chosen by a fair dice roll, so guaranteed to be random.

Issue reported, initial diff and fix tested by Andre S
deraadt likes this version
OK tb
sbin/dhcpleased/engine.c