A phased plan to eventually replace dhcpcd in this project with a port of Apple's IPConfiguration daemon-as-plugin. Sequenced after launchd, configd, and mDNSResponder are substantially complete. Recommendation: defer to Phase 7+ unless dhcpcd-with-netconfigd-shim shows real friction. This page exists to document the path so we don't relitigate the decision.
apple-oss-distributions/bootp repo (currently bootp-534.100.6) under IPConfiguration.bproj/; total port surface ~57k LOC.State:/Network/Service/<UUID>/IPv4 dynamic-store keys and the same IPConfigurationServiceCreate client API that Mac apps consume. Removes a third-party port dependency. Tightens integration with eventual netconfigd.netconfigd's address space. That requires netconfigd Phase 2-3 (KernelEventMonitor over PF_ROUTE + SCDynamicStore-equivalent) substantially shipped first. We aren't there yet (configd is in Phase 1d stub state per the configd plan).Eventually replace dhcpcd in the freebsd-launchd project with a port of Apple's IPConfiguration. End state: netconfigd loads IPConfiguration.bundle at startup; the bundle owns DHCPv4/DHCPv6/IPv4LL/RA processing for every interface; state lands in netconfigd's dynamic store under the canonical Apple key namespace; client tools (scutil, ipconfig(8), GUI apps) reach the daemon via Distributed Objects over AF_UNIX.
bootplib/ipconfig.defs is replaced by an ObjC @protocol served over NSConnection.IORegisterForSystemPower + IOPMConnectionCreate + scheduled wake events have no FreeBSD equivalent. Live without sleep-coordinated lease renewal in v1.Apple80211. Wi-Fi association state comes from wpa_supplicant's control socket, not Apple's private 802.11 framework.SymptomReporter / IPv6AWDReport. Apple wireless diagnostics telemetry — delete on import.MobileGestalt. One call site in dhcp.c; stub returns "FreeBSD".bootp repo contains bootpd, BSDPClient, netbootdisk, etc. — out of scope for this port.EAPOLController. 802.1X auth coordination skipped in v1; if needed later, route through wpa_supplicant.#ifdef'd out.| Component | Apple LOC | Action | Post-port LOC |
|---|---|---|---|
IPConfiguration.bproj/ (the daemon plugin) | 39,722 | port + reshape | ~28,000 |
bootplib/ (shared protocol library, also used by sibling daemons) | 26,997 | cherry-pick: keep DHCP/DHCPv6 cores, drop NetBoot | ~16,000 |
IPConfiguration_framework/ (client API library) | 5,228 | rewrite Mach client → DO client | ~2,500 |
IPConfigurationHelper/ (XPC helper for PvD HTTPS fetch) | 1,250 | fold into main daemon or DO helper | ~800 |
ipconfig.tproj/ (CLI tool) | 1,630 | rewrite as DO client | ~700 |
| Total port target | ~74,827 | ~48,000 | |
Out-of-scope siblings (bootpd, bsdpd, dhcp6d, rtadvd, BSDPClient, netbootdisk, tests) | ~24,000 | delete | 0 |
Largest single files:
IPConfiguration.bproj/ipconfigd.c — 10,312 LOC. Plugin shell + IFState + SCDynamicStore + power events + service lifecycle. The bulk of the port effort.IPConfiguration.bproj/dhcp.c — 4,660 LOC. DHCPv4 state machine. Port verbatim (one MobileGestalt call to amputate).IPConfiguration.bproj/DHCPv6Client.c — 3,717 LOC. DHCPv6 state machine. Port verbatim.bootplib/RouterAdvertisement.c — 1,788 LOC. RA parser/builder. Port verbatim.bootplib/dhcp_options.c — 1,716 LOC. 113 known DHCPv4 options. Port verbatim.bootplib/DHCPv6Options.c — 1,637 LOC. DHCPv6 options. Port verbatim.bootplib/interfaces.c — 1,589 LOC. Already uses getifaddrs(3) and SIOCGIFMEDIA. Minor BSD #ifdefs.Same shape as Apple's: IPConfiguration is a plugin inside netconfigd's process, not a separate daemon. Shares the SCDynamicStore + DO IPC infrastructure netconfigd provides.
bootpd.tproj, bootpdutil.tproj, bsdpc.tproj, BSDPClient/, dhcp6d.tproj/, DHCPServer/, netbootdisk/, rtadvd/ — all sibling daemons not in scope.IPConfiguration.bproj/IPv6AWDReport.{h,m} — Apple Wireless Diagnostics telemetry.IPConfiguration.bproj/report_symptoms.{c,h} — same.IPConfiguration.bproj/Embedded-Info.plist — iOS variant manifest.IPConfiguration.bproj/wireless-entitlements.plist — code-signing entitlements.bootplib/ioregpath.{c,h} — IORegistry walker, only used for NetBoot.bootplib/{nbimages,nbsp,bsdplib,macnc_options,netinfo,subnets}.{c,h} — NetBoot internals.SCTest-Swift/, tests/IPConfigurationTest/ Xcode test schemes — replace with our own.*.xcodeproj, xcconfigs/).| File | Apple LOC | Why rewrite | Target LOC |
|---|---|---|---|
IPConfiguration.bproj/server.c | 654 | Mach RPC server stubs (_ipconfig_*) → NSConnection-rooted DO server. audit_token_t entitlement checks → getpeereid(2) uid checks. | ~700 |
IPConfiguration.bproj/ipconfigd.c | 10,312 | Plugin shell uses SCDynamicStore via Mach. Power event handlers (IORegisterForSystemPower) need stubbing or FreeBSD devd bridge. ~70% of file is portable IFState/state-machine logic that ports as-is. | ~7,500 |
IPConfiguration.bproj/wireless.c | 789 | Replace IO80211/Apple80211API.h with wpa_supplicant control-socket reader (STATUS, SIGNAL_POLL, attached event mode). | ~250 |
IPConfiguration.bproj/ifutil.c | 2,211 | ~30% Darwin-specific ioctls: SIOCAUTOADDR, SIOCSIFL4S, SIOCCLAT46_*, SIOCPROTOATTACH, IFEF_AWDL, IFRTYPE_L4S_*. Ifdef out CLAT46/L4S; use FreeBSD ioctls for the rest. | ~1,200 |
IPConfiguration.bproj/HostUUID.c | 56 | gethostuuid(3) → sysctlbyname("kern.hostuuid", ...). | ~30 |
IPConfiguration_framework/IPConfigurationService.c | 1,245 | Mach client → DO client. Public API surface (IPConfigurationServiceCreate, etc.) preserved. | ~600 |
IPConfiguration_framework/DHCPv6PDService.c | 565 | Same: Mach client → DO client. | ~300 |
ipconfig.tproj/client.c | 1,630 | CLI tool, Mach client → DO client. Subcommand parser stays. | ~700 |
IPConfigurationHelper/IPHXPCServer.m + IPHPvDInfoRequestServer.m | 1,167 | XPC helper for PvD HTTPS fetch. Either fold into main daemon or implement as small DO helper. Defer until PvD support actually matters. | 0 (Phase 4+) |
bootplib/IPConfigurationLog.c | ~200 | os_log_t handle plumbing → syslog(3) wrapper, same shape as launchd's mylog.h. | ~150 |
| File | Apple LOC | Notes |
|---|---|---|
IPConfiguration.bproj/dhcp.c | 4,660 | DHCPv4 state machine. One MobileGestalt call at line 447 to stub. |
IPConfiguration.bproj/DHCPv6Client.c | 3,717 | DHCPv6 state machine. RFC 8415 retry constants in bootplib/DHCPv6.h:79-94 — no source changes. |
IPConfiguration.bproj/arp_session.c | 2,505 | ARP probe/announce/conflict via BPF. bpflib is BSD-portable. |
IPConfiguration.bproj/rtadv.c | 2,133 | RA consumer; PIO/RDNSS/DNSSL/PvD state. |
IPConfiguration.bproj/bootp_session.c | 827 | Raw IP/UDP DHCPv4 socket on port 68. |
IPConfiguration.bproj/RTADVSocket.c | 801 | ICMPv6 RS sender / RA receiver via <netinet6/nd6.h>. |
IPConfiguration.bproj/CGA.c | 711 | RFC 3972 Cryptographically Generated Addresses. |
IPConfiguration.bproj/DHCPv6Socket.c | 685 | UDP socket on port 546. |
IPConfiguration.bproj/linklocal.c | 577 | IPv4LL (RFC 3927). |
IPConfiguration.bproj/manual.c + manual_v6.c | 742 | Static IP config method. |
IPConfiguration.bproj/DHCPDUIDIAID.c | 371 | DUID/IAID generation, persisted to DUID_IA.plist. |
IPConfiguration.bproj/timer.c + FDSet.c | 494 | libdispatch-source timers + FD wrappers. |
bootplib/RouterAdvertisement.c | 1,788 | RA parser/builder. |
bootplib/dhcp_options.c | 1,716 | DHCPv4 option parse/build. |
bootplib/DHCPv6Options.c | 1,637 | DHCPv6 option parse/build. |
bootplib/DNSEncryptedServers.c + DNSNameList.c | 2,868 | RFC 1035 DNS-name compression + DDR. |
bootplib/interfaces.c | 1,589 | getifaddrs + SIOCGIFMEDIA; few Darwin-only IFEF_/IFXNAMSIZ usages. |
bootplib/cfutil.c | 1,068 | CFPropertyList helpers — corebase already provides. |
bootplib/IPv4ClasslessRoute.c | 651 | Option 121 parser. |
bootplib/NICache.c | 646 | DHCPv4 binding cache. |
bootplib/arp.c | 633 | ARP packet build/parse. |
bootplib/{ptrlist,dynarray,util}.c | ~700 | Utility types. |
bootplib/DHCPDUID.c | 283 | DUID factory. |
bootplib/inetroute.c | 263 | Route table reader. |
bootplib/udp_transmit.c | 245 | Raw UDP send. |
bootplib/bpflib.c | 204 | BPF socket open/filter. |
The single MIG IDL bootplib/ipconfig.defs (196 LOC, 21 routines) becomes an ObjC @protocol over NSConnection on a known AF_UNIX path. Same shape as the configd plan.
@protocol NCIPConfiguration
// Counts and lookups
- (NSNumber *)interfaceCount;
- (NSArray *)interfaceList;
// DHCPv4 state queries
- (NSData *)optionForInterface:(NSString *)ifname code:(int)code
status:(out NCStatus *)status;
- (NSString *)addressForInterface:(NSString *)ifname
status:(out NCStatus *)status;
- (NSData *)lastDHCPPacketForInterface:(NSString *)ifname
status:(out NCStatus *)status;
- (NSDictionary *)summaryForInterface:(NSString *)ifname;
// Service lifecycle
- (NSString *)addServiceOnInterface:(NSString *)ifname
methodPlist:(NSDictionary *)plist
status:(out NCStatus *)status;
- (NCStatus)removeServiceOnInterface:(NSString *)ifname
serviceID:(NSString *)sid;
- (NCStatus)refreshServiceOnInterface:(NSString *)ifname
serviceID:(NSString *)sid;
- (NCStatus)setMethodForInterface:(NSString *)ifname
methodPlist:(NSDictionary *)plist;
// IPv6 / DHCPv6
- (NSData *)lastDHCPv6PacketForInterface:(NSString *)ifname
status:(out NCStatus *)status;
- (NSData *)lastRAForInterface:(NSString *)ifname;
- (NSData *)dhcpDUID;
- (NSNumber *)iaidForInterface:(NSString *)ifname;
// Operational
- (NCStatus)setVerbose:(BOOL)verbose;
- (NCStatus)forgetNetworkForInterface:(NSString *)ifname;
@end
Per-call uid/gid check via getpeereid(2) on the AF_UNIX socket replaces Apple's BSM audit-token entitlement check (server.c:79-115). Same caller identity, much simpler than maintaining libbsm + an entitlement DB.
Important finding: IPConfiguration does not subscribe to KEV_NETWORK_CLASS directly. grep -rln 'KEV_DL\|KEV_INET\|KEV_NETWORK_CLASS' IPConfiguration.bproj returns nothing. All kernel events arrive translated as SCDynamicStore key changes from the sibling KernelEventMonitor.bundle configd plugin. This is a clean win — our port can subscribe to the same key suffixes through netconfigd's KernelEventMonitor port (a Phase 2 item in the configd plan), and the PF_ROUTE knowledge stays in one place.
Keys IPConfiguration subscribes to (ipconfigd.c:9303-9333):
kSCEntNetLink — link up/down → link_key_changed()kSCEntNetAirPort — Wi-Fi association change → ap_key_changed()kSCEntNetRefreshConfiguration — explicit RENEW request → link_refresh()kSCEntNetIPv6 — IPv6 address-list change → ipv6_interface_address_changed()kSCEntNetIPv4ARPCollision — ARP collision detected → arp_collision()kSCEntNetIPv6RouterExpired — router lifetime expired → ipv6_router_expired()kSCEntNetNAT64 — PLAT discovery complete → process_plat_discovery_complete()The PF_ROUTE → SC-key translation table goes in netconfigd's KernelEventMonitor port:
| FreeBSD PF_ROUTE message | SC key suffix |
|---|---|
RTM_IFINFO (link state from if_data.ifi_link_state) | State:/Network/Interface/<bsd>/Link |
RTM_NEWADDR (AF_INET) | State:/Network/Interface/<bsd>/IPv4 |
RTM_NEWADDR (AF_INET6) | State:/Network/Interface/<bsd>/IPv6 |
RTM_DELADDR | same keys, recomputed |
RTM_IFANNOUNCE (IFAN_ARRIVAL/IFAN_DEPARTURE) | recompute interface list |
| Dependency | Where | FreeBSD plan |
|---|---|---|
IORegisterForSystemPower + IOPMConnectionCreate | ipconfigd.c:8469, 8530 | Drop in v1; FreeBSD has no pmset-equivalent. Sleep-coordinated lease renewal not supported. Future: bridge from devd ACPI events. |
IOPMCopyScheduledPowerEvents / IOPMCancelScheduledPowerEvent | ipconfigd.c:1515, 1531 | Drop. No scheduled-wake support. |
gethostuuid(3) | HostUUID.c:52 | Replace with sysctlbyname("kern.hostuuid", ...). Caveat: ISO first-boot needs to seed kern.hostuuid if blank. |
MGCopyAnswer(kMGQProductType, ...) | dhcp.c:447 | One-line stub: return "FreeBSD". |
IO80211/Apple80211API.h | wireless.c:178 | Replace with wpa_supplicant control-socket consumer (/var/run/wpa_supplicant/<ifname>, STATUS command). |
SymptomReporter.framework | report_symptoms.c, DHCPv6Client.c:2692 | Delete entirely. Apple wireless-diag telemetry. |
os_log family | throughout | Map to syslog(3) via opaque handle wrapper. Keep call-sites unchanged. |
bsm/libbsm.h audit_token_to_au32() | server.c:79-115 | Replace with getpeereid(2) on the DO socket. Drop the entitlement-DB concept. |
IODeviceTree:/chosen NetBoot blob | ipconfigd.c:2933 via ioregpath.c | Delete (NetBoot out of scope). |
Darwin-only ioctls (SIOCAUTOADDR, SIOCSIFL4S, SIOCCLAT46_*, SIOCPROTOATTACH) | ifutil.c (~12 ioctls) | #ifdef __APPLE__ them out. CLAT46 (464XLAT) and L4S features unavailable. |
SCPreferences watcher | throughout for tunables file | Requires netconfigd Phase 2+ SCPreferences-equivalent. Sequencing constraint. |
ipconfigd.c is 10,312 LOC of mixed concerns. Plugin shell + IFState + SCDynamicStore plumbing + power events + DHCP renew scheduling + wireless coordination + service-list ordering. Splitting into a portable core + Darwin-specific shell is the largest single sub-task. No clean cut at any function boundary above ~150 LOC.server.c (654 LOC) is the only server. But IPConfigurationService.c (1,245 LOC), DHCPv6PDService.c (565 LOC), and ipconfig.tproj/client.c (1,630 LOC) are all pure Mach clients. Our DO rewrite lands in four places.kern.hostuuid. First-boot ISOs may have kern.hostuuid blank or all-zeros. Need a seed step (UUIDv4 from /dev/random, persisted) that runs before IPConfiguration first runs. Extend the launchd varrun one-shot to handle this.SymptomReporter + IOPMCopyScheduledPowerEvents sprinkled across files. Simple amputation but ~30 call sites in ipconfigd.c, DHCPv6Client.c:2692, dhcp.c retry paths, report_symptoms.c.os_log_t handle plumbing. Every translation unit takes os_log_t parameters in macros. Rewrite as opaque void * wrapping our logger, or replace the entire module with a syslog(3) wrapper.ifutil.c Darwin-specific ioctls. About 12 with no FreeBSD equivalent. #ifdef out; CLAT46 + L4S features unavailable.IPConfigurationHelper is a separate launchd-managed sandboxed helper that does NSURLSession TLS fetches. We don't have XPC. Either fold into main daemon (loses sandbox isolation) or implement DO-based helper. Defer until PvD support actually matters — RFC 8801 deployment is rare.InterfaceNamer, KernelEventMonitor) must exist before IPConfiguration loads. netconfigd's responsibility — both are Phase 2 work in the configd plan. Sequencing constraint.Confirmed: IPConfiguration has the same problem as dhcpcd. Both implement RFC 8415 verbatim. RFC 8415 says DHCPv6 Solicit has no max retransmission count (SOL_MAX_RC = 0 = infinite). Both clients retry Solicit forever on networks where the router advertises the M-flag but the DHCPv6 server returns "No Addresses Available." Both cap at one Solicit per hour with random jitter (SOL_MAX_RT = 3600).
Source citations:
bootplib/DHCPv6.h:79-94 defines constants. DHCPv6Client.c:2641-2691 sends Solicit with DHCPv6ClientNextRetransmit(client, DHCPv6_SOL_TIMEOUT, DHCPv6_SOL_MAX_RT). No max-retry check.src/dhcp6.h:120-121 defines same constants. src/dhcp6.c:1723 sets state->MRC = SOL_MAX_RC (= 0).The Apple-vs-FreeBSD difference is purely logging policy:
os_log infrastructure suppresses LOG_INFO "Solicit Transmit (try=N)" messages from default user-visible streams. Packets still go out the wire; users don't see them.syslog(3) shows everything at default priority. dhcpcd at LOG_NOTICE for "DHCPv6 REPLY: No Addresses Available" → spammy.Knob to disable in IPConfiguration: DHCPv6Enabled boolean in Embedded-Info.plist (default true). Per-service: set kSCNetworkProtocolTypeIPv6 ConfigMethod to Manual or LinkLocal. Our port should default to DHCPv6Enabled=false, requiring per-service opt-in via the ConfigMethod Setup-key. This matches the nodhcp6 default we're shipping in dhcpcd today.
Conclusion: porting IPConfiguration does NOT solve the spam problem; it merely renames it. The fix in either world is the same: don't enable DHCPv6 by default on networks where it doesn't function. Not a reason to port; not a reason not to either.
| Feature | IPConfiguration | dhcpcd |
|---|---|---|
| DHCPv4 (RFC 2131) | ✓ | ✓ |
| DHCPv4 rapid commit (RFC 4039) | ✗ | ✗ (yes for v6) |
| BOOTP (RFC 951) | ✓ (separate ConfigMethod) | partial (frame layout shared) |
| IPv4LL (RFC 3927) | ✓ (linklocal.c) | ✓ (src/ipv4ll.c) |
| DHCPv6 stateful (RFC 8415) | ✓ | ✓ |
| DHCPv6 IA_PD prefix delegation | ✓ | ✓ |
| DHCPv6 Information-Request (RFC 3736) | ✓ | ✓ |
| DHCPv6 Reconfigure (RFC 8415 §18) | partial (option codes, no full handler) | ✓ |
| RS/RA (RFC 4861) | ✓ | ✓ |
| RDNSS / DNSSL (RFC 8106) | ✓ | ✓ |
| DHCP authentication (RFC 3118) | ✗ | ✓ |
| Dynamic SOL_MAX_RT learning | ✗ (fixed 3600) | ✓ |
| Bonjour Sleep Proxy coordination | ✓ (Apple-only) | ✗ |
| IOKit power-management awareness | ✓ (Apple-only) | ✗ |
| CGA (RFC 3972) | ✓ | ✗ |
| RFC 7217 stable IIDs | ✗ | ✓ (slaac private) |
| Captive portal URL option (RFC 8910) | ✓ (DHCPv6 code 103) | partial |
| Hook-script framework | ✗ (publishes to SCDynamicStore instead) | ✓ (/lib/dhcpcd/dhcpcd-hooks/) |
resolvconf(8) integration | writes /etc/resolv.conf directly via configd plugin chain | ✓ via hook |
| WiFi association coordination | via Apple80211 (wireless.c) | via wpa_supplicant hook |
| Bridge / lagg / vlan layering | partial (Apple's interface model) | ✓ |
| Per-iface profiles | ✓ (each Service has its own UUID) | ✓ |
| Privsep | ✗ (runs in configd as root) | ✓ (src/privsep*.c) |
| Cross-platform | macOS only | NetBSD, FreeBSD, OpenBSD, DragonFly, Linux, Solaris, Haiku |
| SCDynamicStore publication | ✓ (canonical Apple keys) | ✗ (lease file + hooks) |
Native ObjC client API (IPConfigurationServiceCreate) | ✓ | ✗ (control socket protocol) |
What IPConfiguration has that we'd gain: SCDynamicStore-keyed publication (cleaner integration with netconfigd), IPConfigurationServiceCreate framework API (Mac app symmetry), Bonjour Sleep Proxy + IOKit power coordination (irrelevant on FreeBSD without their kernel infra), CGA.
What dhcpcd has that we'd lose: RFC 3118 authentication (rare in real deployments), Reconfigure handler, dynamic SOL_MAX_RT learning, hook-script ecosystem, bridge/lagg/vlan layering recognition (the killer for our use case if we don't replace it), privilege separation, RFC 7217 stable IIDs, cross-platform maintenance burden shared with NetBSD/Linux/etc.
| Decision | Choice |
|---|---|
| Deployment shape | Configd plugin (loaded into netconfigd's process), not standalone daemon. Mirrors Apple. |
| Source repo | apple-oss-distributions/bootp at the latest tag (currently bootp-534.100.6). Strip everything outside IPConfiguration.bproj/, bootplib/, IPConfiguration_framework/, ipconfig.tproj/. |
| Mach IPC | None. Replace with GNUstep DO over AF_UNIX. bootplib/ipconfig.defs rewritten as NCIPConfiguration @protocol. |
| SCDynamicStore | Use netconfigd's port (Phase 2+ work). IPConfiguration subscribes to existing store keys; doesn't reach into the kernel directly. |
| Power management | Drop. No FreeBSD equivalent for IOPMConnection. Sleep-coordinated renew unsupported. |
| Wi-Fi coordination | wpa_supplicant control socket replaces Apple80211. Our dhcpcd switch already added wpa_supplicant from ports — same daemon. |
| EAPOL / 802.1X | Skip in v1. Route through wpa_supplicant if needed later. |
| NetBoot / BSDP | Out of scope. |
| Logging | syslog(3) wrapper around the os_log macros. |
| Privsep | Inherit launchd's UID model (configd plugins run as configd's UID — root in our case). No separate sandboxing in v1. |
| License | BSD-2-Clause for new code; preserve Apple OSReference 2.0 (Apache) headers on imported files. |
| DHCPv6 default | Disabled. Per-service opt-in via ConfigMethod Setup-key. Matches our dhcpcd nodhcp6 posture. |
ipconfiguration/ at the top of freebsd-launchd, mirror the configd shape (scripts/import-source.sh, src/, compat/, Makefile).bootp-534.100.6 (or HEAD) into src/.os_log_t wiring with syslog(3)-backed wrapper.IPConfiguration.bundle against netconfigd's plugin loader. load() / prime() resolve cleanly.bootp_session_init, DHCPv6Client_*, arp_session_init.wireless.c to return "no Wi-Fi info ever".IORegisterForSystemPower calls.bootp_session.c, dhcp.c, arp_session.c, linklocal.c, manual.c.DHCPLease.c against /var/db/dhcpclient/.kern.hostuuid in HostUUID.c.ifutil.c ifdef-cut: Darwin-specific ioctls disabled; FreeBSD equivalents for SIOCAIFADDR / SIOCDIFADDR / SIOCSIFFLAGS / SIOCSIFMTU.kSCEntNetLink via netconfigd's SCDynamicStore. Requires netconfigd Phase 3 (KernelEventMonitor) shipped.IPConfigurationService.c to a DO client over AF_UNIX. Ship as libIPConfiguration.so.ipconfig.tproj/client.c to use DO client. ipconfig getoption en0 router works.DHCPv6Client.c, DHCPv6Socket.c, RTADVSocket.c, rtadv.c, linklocal_v6.c, manual_v6.c, ICMPv6Socket.c, CGA.c.DHCPv6Enabled=false by default in our Info.plist.State:/Network/Service/<UUID>/DNS works.linklocal.c activates after DHCP fails N retries.tests/ XCTest plans as tests/run-tests.sh against a netns/qemu fixture.wireless.c with wireless_wpa.c that opens /var/run/wpa_supplicant/<ifname> and does STATUS / SIGNAL_POLL / event monitoring.org.freebsd.dhcpcd.plist → load IPConfiguration as a netconfigd plugin instead.interface em0 { dhcp; } translates to a netconfigd Setup-key ConfigMethod=DHCP.dhcpcd; wpa_supplicant stays as the WiFi association daemon.bootplib/ (DHCP option tables, DHCPv6 option parser, DHCPDUID/IAID, packet structs — pure C, no Mach) as static libraries inside a thin FreeBSD daemon, and skip the ipconfigd.c reshape? Tempting but the protocol cores are tightly coupled to ipconfigd_threads.h + timer.c + the IFEvent state machine. Extracting cleanly is itself a multi-month project. Not obviously cheaper than the full port.
IPConfigurationHelper) requires an XPC-equivalent we don't have. Defer until PvD deployment matters — currently rare.
IORegisterForSystemPower + scheduled wake events let IPConfiguration coordinate lease renewal across sleep. FreeBSD has no pmset-equivalent. Build a bridge from devd ACPI events later, or live without sleep coordination on laptops.
ipconfigd.c:978-1098 coordinates with mDNSResponder so a sleep proxy answers ARP/ND while the host sleeps. Useful on a Mac; less useful on a desktop. Requires freebsd-mdnsresponder shipped first. Punt to a Phase 8+ once mDNSResponder lands.
bootp-534.100.6). The IPConfiguration.bproj/ directory is what we port.