dhcpcd/BUILDING.md
Roy Marples 3547ed19f0 hooks: add NOCARRIER_ROAMING reason
This is given when the OS supports the concept of wireless roaming
or the IP setup can be persisted when the carrier drops.

When this happens, routes are moved to a higher metric (if supported)
to support non preferred but non roaming routes.
The `interface_order` hook variable will now order the interfaces
according to priority and move roaming interfaces to the back of the
list.
If resolvconf is present then it is called with the -C option
to deprecate DNS and if carrier comes back it is called again with the
-c option to activate it once more.

As part of this change, default route metrics have been changed to
support a larger number of interfaces.
base metric		1000		(was 200)
wireless offset		2000		(was 100)
IPv4LL offset		1000000		(was 10000)
roaming offset		2000000
2020-12-27 19:53:31 +00:00

7.0 KiB

Building dhcpcd

This attempts to document various ways of building dhcpcd for your platform.

Size is an issue

To compile small dhcpcd, maybe to be used for installation media where size is a concern, you can use the --small configure option to enable a reduced feature set within dhcpcd. Currently this just removes non important options out of dhcpcd-definitions.conf, the logfile option, DHCPv6 Prefix Delegation and IPv6 address announcement (to prefer an address on another interface). Other features maybe dropped as and when required. dhcpcd can also be made smaller by removing the IPv4 or IPv6 stack:

  • --disable-inet
  • --disable-inet6

Or by removing the following features:

  • --disable-auth
  • --disable-arp
  • --disable-arping
  • --disable-ipv4ll
  • --disable-dhcp6
  • --disable-privsep

You can also move the embedded extended configuration from the dhcpcd binary to an external file (LIBEXECDIR/dhcpcd-definitions.conf)

  • --disable-embedded If dhcpcd cannot load this file at runtime, dhcpcd will work but will not be able to decode any DHCP/DHCPv6 options that are not defined by the user in /etc/dhcpcd.conf. This does not really change the total on disk size.

Cross compiling

If you're cross compiling you may need set the platform if OS is different from the host.
--target=sparc-sun-netbsd5.0

If you're building for an MMU-less system where fork() does not work, you should ./configure --disable-fork. This also puts the --no-background flag on and stops the --background flag from working.

Default directories

You can change the default dirs with these knobs. For example, to satisfy FHS compliance you would do this: ./configure --libexecdir=/lib/dhcpcd dbdir=/var/lib/dhcpcd

Compile Issues

We now default to using -std=c99. For 64-bit linux, this always works, but for 32-bit linux it requires either gnu99 or a patch to asm/types.h. Most distros patch linux headers so this should work fine. linux-2.6.24 finally ships with a working 32-bit header. If your linux headers are older, or your distro hasn't patched them you can set CSTD=gnu99 to work around this.

ArchLinux presently sanitises all kernel headers to the latest version regardless of the version for your CPU. As such, Arch presently ships a 3.12 kernel with 3.17 headers which claim that it supports temporary address management and no automatic prefix route generation, both of which are obviously false. You will have to patch support either in the kernel or out of the headers (or dhcpcd itself) to have correct operation.

Linux netlink headers cause a sign conversion error. I submitted a patch, but as yet it's not upstreamed.

GLIBC ships an icmp6.h header which will result in signedness warnings. Their bug #22489 will solve this once it's actually applied.

OS specific issues

Some BSD systems do not allow the manipulation of automatically added subnet routes. You can find discussion here: http://mail-index.netbsd.org/tech-net/2008/12/03/msg000896.html BSD systems where this has been fixed or is known to work are: NetBSD-5.0 FreeBSD-10.0

Some BSD systems protect against IPv6 NS/NA messages by ensuring that the source address matches a prefix on the recieved by a RA message. This is an error as the correct check is for on-link prefixes as the kernel may not be handling RA itself. BSD systems where this has been fixed or is known to work are: NetBSD-7.0 OpenBSD-5.0 patch submitted against FreeBSD-10.0

Some BSD systems do not announce IPv6 address flag changes, such as IN6_IFF_TENTATIVE, IN6_IFF_DUPLICATED, etc. On these systems, dhcpcd will poll a freshly added address until either IN6_IFF_TENTATIVE is cleared or IN6_IFF_DUPLICATED is set and take action accordingly. BSD systems where this has been fixed or is known to work are: NetBSD-7.0

OpenBSD will always add it's own link-local address if no link-local address exists, because it doesn't check if the address we are adding is a link-local address or not.

Some BSD systems do not announce cached neighbour route changes based on reachability to userland. For such systems, IPv6 routers will always be assumed to be reachable until they either stop being a router or expire. BSD systems where this has been fixed or is known to work are: NetBSD-7.99.3

Linux prior to 3.17 won't allow userland to manage IPv6 temporary addresses. Either upgrade or don't allow dhcpcd to manage the RA, so don't set either ipv6ra_own or slaac private in dhcpcd.conf if you want to have working IPv6 temporary addresses. SLAAC private addresses are just as private, just stable.

Init systems

We try and detect how dhcpcd should interact with system services at runtime. If we cannot auto-detect how do to this, or it is wrong then you can change this by passing shell commands to --serviceexists, --servicecmd and optionally --servicestatus to ./configure or overriding the service variables in a hook.

/dev management

Some systems have /dev management systems and some of these like to rename interfaces. As this system would listen in the same way as dhcpcd to new interface arrivals, dhcpcd needs to listen to the /dev management sytem instead of the kernel. However, if the /dev management system breaks, stops working, or changes to a new one, dhcpcd should still try and continue to work. To facilitate this, dhcpcd allows a plugin to load to instruct dhcpcd when it can use an interface. As of the time of writing only udev support is included. You can disable this with --without-dev, or without-udev. NOTE: in Gentoo at least, sys-fs/udev as provided by systemd leaks memory sys-fs/eudev, the fork of udev does not and as such is recommended.

Importing into another source control system

To import the full sources, use the import target. To import only the needed sources and documentation, use the import-src target. Both targets support DESTDIR to set the installation directory, if unset it defaults to /tmp/dhcpcd-$VERSION Example: make DESTDIR=/usr/src/contrib/dhcpcd import-src

Hooks

Not all the hooks in dhcpcd-hooks are installed by default. By default we install 01-test, 20-resolv.confand 30-hostname. The other hooks, 10-wpa_supplicant, 15-timezone and 29-lookup-hostname are installed to $(datadir)/dhcpcd/hooks by default and need to be copied to $(libexecdir)/dhcpcd-hooks for use. The configure program attempts to find hooks for systems you have installed. To add more simply ./configure -with-hook=ntp.conf

If using resolvconf, the 20-resolv.conf hook now requires a version with the -C and -c options to deprecate and activate interfaces to support wireless roaming (Linux) or carrier just drops (NetBSD). If your resolvconf does not support this then you will see a warning about an illegal option when the carrier changes, but things should still work. In this instance the DNS information cannot be Deprecated and may not be optimal for multi-homed hosts.