Using lagg(4) with diskless booting

The lagg interface enables transparent failover between (eg) wired & wifi interfaces - making it trivial to combine the flexibility of walking around the house without any cables with the throughput of a wired interface by simply connecting and disconnecting the LAN cable.

For a normal boot environment, this is as simple as placing something like the following in /etc/rc.conf (old wlan software):

ifconfig_re0="up"
ifconfig_ath0="ether 00:1e:68:aa:bb:cc"  # Set WiFi MAC address to match wired MAC address
wlans_ath0="wlan0"
ifconfig_wlan0="WPA"
cloned_interfaces="lagg0"
ifconfig_lagg0="SYNCDHCP laggproto failover laggport re0 laggport wlan0"

With recent wlan software, ath0 is no longer visible so it's necessary to instead attach the WiFi MAC address to the wired NIC and explicitly use the WiFi MAC address as the lagg address:

ifconfig_re0="ether 00:1e:68:aa:bb:cc"   # Set Wired MAC address to match WiFi adapter
wlans_ath0="wlan0"
ifconfig_wlan0="WPA"
cloned_interfaces="lagg0"
create_args_lagg0="ether 00:1e:68:aa:bb:cc laggproto failover"
ifconfig_lagg0="SYNCDHCP laggport re0 laggport wlan0"

If you have multiple boxes available, supporting diskless booting provides a convenient way to install, upgrade or recover systems. It can also provide a convenient way to test a planned upgrade without installing the upgrade onto the target host. One downside of diskless booting is that the root filesystem is NFS mounted via the boot interface and it's not possible to PXE boot from a WiFi or lagg interface. Whilst you would typically want the performance of a wired interface for installing/upgrading/recovering, lagg support is important for regression testing and can make installing/upgrading/recovering more convenient. Following some experimentation, I came up with the following configuration. Whilst I haven't tried this since updating to the new wlan software, making changes equivalent to the above should work:

Host configuration for ISC dhcpd 3.1:

host client_host {                               # Client name
  hardware ethernet 00:1e:68:aa:bb:cc;           # Wired NIC MAC address
  fixed-address client.f.q.d.n;                  # FQDN or IP address of diskless client
  filename "/tftpboot/pxeboot";
  next-server 10.11.12.13;                       # Boot/root server IP
  vendor-option-space FreeBSD
  option root-path "10.11.12.13:/client/root";   # NFS path to client root filesystem
  option host-name "client.f.q.d.n";
}

Client /etc/rc.conf (or 10.11.12.13:/client/root/etc/conf):

ifconfig_ath0="ether 00:1e:68:aa:bb:cc"  # Set WiFi MAC address to match wired MAC address
wlans_ath0="wlan0"
ifconfig_wlan0="WPA"
cloned_interfaces="lagg0"
ifconfig_lagg0="laggport wlan0"

The magic is an additional script ''/etc/rc.d/lagg'' which flips the IP address from the boot interface to a lagg interface comprising the boot interface. As a result, whilst it's necessary to boot with a LAN cable attached, once the system has booted to multi-user (or at least to the point where wpa_supplicant has started and authenticated), you can disconnect the LAN cable and run wireless.