Some more information on the topic.
Here are the logs from the Console app for a successful sequence:
default 12:17:49.259885+0200 kernel if_updown: utun12 is not attached
default 12:17:49.259927+0200 kernel utun12: attached with 0 suspended link-layer multicast membership(s)
default 12:17:49.259933+0200 kernel ifnet_attach: Waiting for all kernel threads created for interface utun12 to get scheduled at least once.
default 12:17:49.259941+0200 kernel ifnet_attach: All kernel threads created for interface utun12 have been scheduled at least once. Proceeding.
default 12:17:49.260128+0200 nesessionmanager getsockopt(UTUN_OPT_IFNAME) returned virtual interface name utun12
default 12:17:49.260163+0200 airportd Driver Discovery: <airport[1189]> _interfaceAdded: utun12 added.
default 12:17:49.260186+0200 nesessionmanager Created a new NEVirtualInterface "utun12" (7A0B6CE9-D92F-49F7-B9B7-2B4713D78034)
default 12:17:49.261063+0200 kernel utun12: is now delegating en0 (type 0x6, family 2, sub-family 3)
default 12:17:49.261166+0200 com.my.cool.network.extension Using interface name utun12
default 12:17:49.261219+0200 com.my.cool.network.extension Created a new NEVirtualInterface "utun12" from socket
default 12:17:49.306250+0200 airportd Driver Discovery: <airport[1189]> _interfaceAdded: utun12 is not an AirPort interface.
default 12:17:49.936284+0200 nesessionmanager utun12: removing DNS
default 12:17:49.936371+0200 nesessionmanager utun12: removing IPv4
default 12:17:49.936440+0200 nesessionmanager utun12: removing IPv6
default 12:17:49.936542+0200 nesessionmanager utun12: removing proxies
default 12:17:49.936568+0200 nesessionmanager utun12: removing service dictionary
default 12:17:49.936976+0200 nesessionmanager utun12: setting DNS to dictionary with keys: (
ServerAddresses,
SupplementalMatchDomains,
SearchDomains
)
default 12:17:49.937052+0200 nesessionmanager utun12: removing IPv4
default 12:17:49.937133+0200 nesessionmanager utun12: removing IPv6
default 12:17:49.937211+0200 nesessionmanager utun12: setting proxies to dictionary with keys: (
FTPPassive
)
default 12:17:49.937241+0200 nesessionmanager utun12: removing service dictionary
default 12:17:50.003511+0200 kernel _dlil_attach_flowswitch_nexus: not attaching flowswitch to utun12
default 12:17:50.003520+0200 kernel _dlil_attach_flowswitch_nexus: not attaching flowswitch to utun12
default 12:17:50.007412+0200 kernel _dlil_attach_flowswitch_nexus: not attaching flowswitch to utun12
default 12:17:50.007422+0200 kernel _dlil_attach_flowswitch_nexus: not attaching flowswitch to utun12
default 12:17:50.012506+0200 nesessionmanager utun12: setting DNS to dictionary with keys: (
ConfirmedServiceID,
ServerAddresses,
SearchDomains,
SupplementalMatchDomains
)
default 12:17:50.013268+0200 nesessionmanager utun12: setting IPv4 to dictionary with keys: (
Router,
AdditionalRoutes,
ServerAddress,
InterfaceName,
Addresses
)
default 12:17:50.025320+0200 mDNSResponder *** Network Configuration Change *** SC key: State:/Network/Interface/utun12/IPv4
default 12:17:50.033711+0200 mDNSResponder *** Network Configuration Change *** SC key: State:/Network/Interface/utun12/IPv6
default 12:17:50.049101+0200 nesessionmanager utun12: setting IPv6 to dictionary with keys: (
PrefixLength,
AdditionalRoutes,
Router,
ServerAddress,
InterfaceName,
Addresses
)
default 12:17:50.094795+0200 mDNSResponder Interface not represented in list; marking active and retriggering queries - ifid: 31, ifname: utun12, ifaddr: <mask.hash: '8a4YjRU426n4aoobHYIE+Q=='>
default 12:17:50.094837+0200 mDNSResponder SetupActiveInterfaces: Registered utun12 (31) BSSID <mask.hash: 'kJtfT6erwO/YvBLN2AXs/Q=='> Struct addr 0x156024c00, primary 0x156024c00, <mask.hash: '8a4YjRU426n4aoobHYIE+Q=='>/64 (Primary)
default 12:17:50.094852+0200 mDNSResponder Interface already represented in list - ifid: 31, ifname: utun12, ifaddr: <mask.hash: 'LXjHHzNKtevmjyvB+o2I2w=='>
default 12:17:50.094878+0200 mDNSResponder SetupActiveInterfaces: Registered utun12 (31) BSSID <mask.hash: 'kJtfT6erwO/YvBLN2AXs/Q=='> Struct addr 0x15681aa00, primary 0x156024c00, <mask.hash: 'LXjHHzNKtevmjyvB+o2I2w=='>/120
default 12:17:50.095516+0200 nesessionmanager utun12: setting proxies to dictionary with keys: (
FTPPassive
)
default 12:17:50.095675+0200 nesessionmanager utun12: setting primary service dictionary to {
PrimaryRank = First;
}
default 12:17:50.129605+0200 configd effective_ifindex_get: utun12 (31): effective en0 (13)
default 12:17:50.133021+0200 configd Host 10.64.5.7 Gate 10.64.5.7 Ifp utun12 Ifa 10.64.5.7 [first] [force]
default 12:17:50.133399+0200 configd Host fc00:bbbb:bbbb:bb01::a40:507 Gate fc00:bbbb:bbbb:bb01::a40:507 Ifp utun12 Ifa fc00:bbbb:bbbb:bb01::a40:507 [first] [force]
default 12:17:50.175750+0200 configd network changed: v4(utun12+:10.64.5.7, en0) v6(utun12+:fc00:bbbb:bbbb:bb01::a40:507, en0) DNS! Proxy+ SMB
default 12:17:50.196686+0200 sharingd PrimaryIPv6 changed: fe80::82a9:97ff:fe2d:3990%utun12
default 12:17:50.196775+0200 sharingd PrimaryIP changed: IPv4 10.64.5.7, IPv6 fe80::82a9:97ff:fe2d:3990%utun12
default 12:17:50.196815+0200 rapportd PrimaryIPv6 changed: fe80::82a9:97ff:fe2d:3990%utun12
default 12:17:50.196908+0200 rapportd PrimaryIP changed: IPv4 10.64.5.7, IPv6 fe80::82a9:97ff:fe2d:3990%utun12
default 12:17:50.198332+0200 AirPlayXPCHelper PrimaryIPv6 changed: fe80::82a9:97ff:fe2d:3990%utun12
default 12:17:50.198395+0200 AirPlayXPCHelper PrimaryIP changed: IPv4 10.64.5.7, IPv6 fe80::82a9:97ff:fe2d:3990%utun12
default 12:17:50.258420+0200 nesessionmanager Changing primary physical interface: en0 => utun12