summaryrefslogtreecommitdiff
path: root/sbin/dhcpleased
AgeCommit message (Collapse)Author
2021-12-18Make sure we receive what we expect over imsg.Florian Obser
Instead of repairing potential garbage ensure that we receive proper C strings. Inspired by a similar diff by deraadt@ for ldapd.
2021-12-13including sys/cdefs.h manually started as a result of netbsd trying toTheo de Raadt
macro-build a replacement for sccsid, and was done without any concern for namespace damage. Unfortunately this practice started infecting other code as others were unaware they didn't need the file. ok millert guenther
2021-12-13Only generate a new xid on state change.Florian Obser
When we first request a lease (INIT or REBOOTING state) we run with very short timeouts. If the dhcp server is slow to respond we already have a new xid and ignore the server's response. This goes on until we increase the timeout high enough. If we just stick to an xid this will not happen and we accept "late" responses. RFC 2131 has: 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. Problem seen by phessler on german train wifi. OK phessler
2021-12-13Treat xid as a uint32_t in network byte order on the wire.Florian Obser
Internally this doesn't matter since we only care about equality. This makes logging output comparable to tcpdump(8). Pointed out by joel@ OK claudio
2021-12-13Replace struct member assignment with struct assignment to make theFlorian Obser
code more compact. No binary change. OK claudio
2021-12-09Rework in which state to add and not add the server-ip andFlorian Obser
requested-ip option as well as setting ciaddr. This started with joel@ pointing out that their CPE is ignoring RENEWING and REBINDING requests when ciaddr was not set. RFC 2131 4.3.6, Table 4 has a good overview, we got a bunch of it wrong. Previously the logic for this was all over the place which made it difficult to reason about, it is now contained in the engine process in request_dhcp_request() and request_dhcp_discover(). Problem pointed out by, lots of testing and review as well as OK joel@ Additional testing and 50% review benno@
2021-11-20Send default client identifier when a config file is present but noFlorian Obser
client identifier is configured like the man page claims we would do. Problem found and patch by Joel Knight (knight.joel AT gmail), thanks!
2021-11-14When we transition from RENEWING to REBINDING state we have toFlorian Obser
calculate the next timeout based on the rebinding time (T2), not renewal time (T1). At this point T1 already expired and we would wait way too long, past the lease lifetime. Spotted while investigating a problem reported by Zack Newman on misc@
2021-10-28Accept server replies from any server portKlemens Nanni
There is no requirement other than replying to client port 68/udp as per RFC 2131, so drop the 67/udp check. Same conclusion from florian Reported and tested by Roc Vallès < vallesroc AT gmail DOT com>, thanks!
2021-10-20Do not ignore carp(4) interfaces.Florian Obser
Problem reported by Guy Godfroy on bugs, thanks!
2021-10-15Don't declare variables as "unsigned char *" that are passed toChristian Weisgerber
functions that take "char *" arguments. Where such chars are assigned to int or passed to ctype functions, explicitly cast them to unsigned char. For OpenBSD's clang, -Wpointer-sign has been disabled by default, but when the parse.y code was built elsewhere, the compiler would complain. With help from millert@ ok benno@ deraadt@
2021-09-21Use upercase DHCP and sprinkle in some ":".Florian Obser
Committing on behalf of jmc OK deraadt
2021-09-20Document how a 0 byte can be encoded for client-id.Florian Obser
Requested by & OK sthen mdoc clue by schwarze
2021-09-20According to RFC 2132 (9.14. Client identifier) a hardware type of 0Florian Obser
should be used when the client identifier is not a hardware address, for example if it's just a string. It turns out that the majority of dhcp clients (and possibly servers?) does not do this but rather transmits the client identifier verbatim if a string is configured. The first character becomes the hardware type. Make dhcpleased(8) behave the same. Difference in behavior with dhclient(8) and interoperability issues with dhcp(8) first pointed out by Olivier Cherrier on misc@ OK sthen fine to get it in for 7.0 deraadt
2021-09-16dhcpleased(8) does not (yet?) track if routes it added are deletedFlorian Obser
behind its back. When a lease gets renewed dhcpleased simply adds all routes and lets the kernel sort duplicates out. This however leads to "failed to send route message: File exists" messages in /var/log/daemon which are confusing. Since this is expected do not log it as an error. While here change the error message when proposing nameservers so that it can be distinguished from failed routes. Pointed out by deraadt
2021-09-15Rewrite and simplify dhcpleasectl(8).Florian Obser
With this dhcpleasectl em0 does the same as dhclient em0 used to do. To please people's muscle memory one can be aliased to the other. earlier version OK benno with lots of help massaging the output & OK deraadt
2021-09-15Remove configured routes no longer present in lease.Florian Obser
Problem reported by claudio OK benno
2021-09-14When the dhcp server is unreachable via unicast UDP retry broadcast.Florian Obser
The only indication we get is sendto(2) failing, so if our UDP packet is silently dropped somewhere we won't notice. This has been observed in the wild with a dhcp server at the remote end of a VPN. The dhcp server is reachable via broadcast so we get an initial lease. However the server is not in the same subnet as the lease we are getting so to reach it unicast we depend on a default route being set. When the VPN goes down we lose the default route [*] and when dhcpleased then tries to renew the lease (unicast), sendto(2) fails with "network unreachable". [*] The exact mechanics on how this happens are unclear. I.e. why didn't dhcpleased(8) see a link-state change and transitioned to REBOOTING / INIT? Regardless, we shouldn't ignore sendto(2) errors. Reported by stsp, OK benno
2021-08-24When an interface disappears, e.g. when a usb dongle gets unplugged,Florian Obser
we get a RTM_IFANNOUNCE message not a RTM_IFINFO message. Handle this message to not accumulate "unknown" interfaces. OK benno
2021-08-23Say which read failed, helps debugging.Florian Obser
2021-08-23We don't have a config file on the ramdisks; prevents a warning.Florian Obser
2021-08-23Since we have a config file now we should Xr its manpage.Florian Obser
From Scott Bennett, thanks!
2021-08-12Make it possible to ignore routes or nameservers from a lease as wellFlorian Obser
as ignoring servers entirely. Tested by bket Parser looks reasonable to benno man page OK jmc
2021-08-07Go to REBOOTING state when interface config changed on reload.Florian Obser
This tries to reaquire the current lease and if that failes will send a DHCPDISCOVER message to request any lease. OK benno
2021-08-04Do not enter a tight INIT -> REQUESTING -> INIT loop when the dhcpFlorian Obser
server responds to our DHCPDISCOVER but is then slow to respond to our DHCPREQUEST. MAX_EXP_BACKOFF_FAST was introduced to get us quickly out of the REBOOTING state when we switch networks and no dhcp server would NAK our old lease but just ignore us. This is not the issue here, there is a dhcp server willing to talk to us, it's just slow. Problem reported, tested & OK jca
2021-08-01Do not abuse the IMSG_CTL_SEND_REQUEST imsg to transition toFlorian Obser
REBOOTING. There will be a few more cases internal to dhcpleased that have nothing to do with the control socket. While here move requesting a new lease via a call to dhclient under ifndef SMALL, nothing on the ramdisk uses this.
2021-07-28fix broken small build; ok florian@anton
2021-07-27Please muscle memory when dhclient $if is run and request a new lease.Florian Obser
An upcoming diff for dhclient(8) will make it exit when it discovers an autoconf flag at startup. "Quite a pleasing diff." deraadt@
2021-07-27Improve markup.Florian Obser
Suggested by schwarze
2021-07-27zap trailing comma in SEE ALSO;Jason McIntyre
2021-07-27'{' and '}' are fixed parts of the 'interface' decleration', not optional.Theo de Raadt
concern raised by kn. ok florian
2021-07-26small tweaks to dhcpleased.conf(5), ok jmc florianStuart Henderson
2021-07-26Implement possibility to send vendor class identifier (option 60) andFlorian Obser
client identifier (option 61). Some dhcp servers expect these options and refuse to hand out a lease without them. Need for vendor class identifier pointed out & tested by bket Need for client identifier pointed out by sthen Input & reads OK sthen (as part of a larger diff) OK kn (as part of a larger diff)
2021-07-26The SIOCAIFADDR ioctl could lose a race against another processFlorian Obser
configuring the same IP. Found the hard way by afresh1
2021-07-25If the lease didn't contain renewal or rebinding options set theFlorian Obser
defaults before validating the times to prevent excessive logging. Found the hard way & OK brynet
2021-07-23When dhcpleasectl asks to send a new request on an interface we areFlorian Obser
probably stuck in some way and the user wants a mostly clean slate. If we already have an IP address transition to state REBOOTING so that we no longer unicast dhcp requests. We will then try to reacquire our lease twice before giving up and transition to INIT and send dhcp discover messages accepting any IP address.
2021-07-22Make dhcpleased(8) always configure provided routes, regardless ofStefan Sperling
whether the address we received in our lease is already configured. In the case I observed, no default route was added to the routing table even though the server provided both an address and a route option. As it happened the leased address was already configured on the interface. This should not prevent routing table updates, but it did. ok florian
2021-07-21Use exclusive lock under /dev/, silence expected errors in installerkn
resolvd(8), slaacd(8) and dhcpleased(8) are different from other daemons in that there must only be a single instance. resolvd already does this, adjust slaacd and dhcpleased accordingly while moving the lockfile paths under /dev/ such that they work early on boot and don't run into races should /var be (un)mounted between daemon starts. Locking is especially required in the installer where all three daemons are started every time the "(I)nstall, (U)pgrade, (A)utoinstall or (S)hell? " prompt is entered, i.e. restarting installation or dropping into a shell and back into the prompt again would start multiple instances. To avoid expected lockfile error messages in between installer prompts, discard standard error when starting the autoconf daemons; none of them has other potential failure cases in installer mode before daemon(3)izing. Input sthen deraadt OK deraadt
2021-07-18Ignore routers option when a classless static routes option is presentFlorian Obser
as mandated by RFC3442. Pointed out by, initial diff, testing & OK bket@
2021-07-12Change the error reporting pattern throughout the tree when unveilBob Beck
fails to report the path that the failure occured on. Suggested by deraadt@ after some tech discussion. Work done and verified by Ashton Fagg <ashton@fagg.id.au> ok deraadt@ semarie@ claudio@
2021-06-20Put (boot) filename, next-server, host-name and domain-name into leaseFlorian Obser
file for the installer.
2021-06-18fix SMALL buildFlorian Obser
2021-06-16Actually request classless static routes from the dhcp server; missedFlorian Obser
in previous.
2021-06-16Implement classless static routes dhcp option.Florian Obser
For this we need to be able to handle multiple routes being sent from the engine to the main process as well as to the control tool. The configuration of the various cases (default route, directly connected routes, non-default route via a gateway) was inspired by dhclient's set_routes() and should behave the same way. Tested by Uwe Werler
2021-05-01In singel user mode / is mounted ro. Just warn if we can't createFlorian Obser
the control socket instead of fatal(). OK deraadt
2021-05-01Allow running in single user mode where /var/empty doesn't exist byFlorian Obser
switching from chroot("/var/empty") to unveil("/", ""). This is just an extra pair of suspenders since these processes pledge(2) to not access the filesystem. OK deraadt
2021-04-14my fingers cannot avoid KNF'ing as I review codeTheo de Raadt
2021-04-10Make sure the ip header lands on a 4 byte alignment by adding 2 bytesFlorian Obser
padding because the ethernet header in front is only 14 bytes. Found the hard way by me while testing on sparc64. Solution suggested by & OK deraadt
2021-04-09When a DHCP server sends an invalid T1 or T2 default back to the defaultMartijn van Duren
values as specified in RFC2131 section 4.4.5. Allows my Comtrend VI-3223u to work. OK florian@
2021-04-08Do not request unused "classless-static-routes" dhcp-options(5)kn
Doing so implies support for it, but dhcpleased(8) currently ingores it entirely and does not configure any route from it. As per RFC 3442 servers SHOULD NOT respond with a "routers" option when "classless-static-routes" is set. dhcpd(8)/dhcpd.conf(5) follows that, hence requesting but not using static routes results in not installing any routes at all. Stop signaling support for this option and only request "routers" such that dhcpleased continues to install a default route and properly ignores the unsupported option if used by the server. Report from Uwe Werler <uwe @ werler dot is> about a default route not being set when requesting the "classless-static-routes" dhcp-options(5) from dhcpd(8), thanks! OK florian