         
         return deviceInfo
     }
+    
+    func deviceList() throws -> HCIDeviceList {
+        
+        // allocate HCI device list buffer
+        var deviceList = HCIDeviceList()
+        deviceList.numberOfDevices = UInt16(HCI.maximumDeviceCount)
+        
+        // request device list
+        let ioctlValue = withUnsafeMutablePointer(to: &deviceList) {
+            IOControl(fileDescriptor, HCI.IOCTL.GetDeviceList, $0)
+        }
+        guard ioctlValue >= 0 else { throw POSIXError.fromErrno() }
+        
+        return deviceList
+    }
 }
 
 // MARK: - Errors

    
    static var `default`: HostController? {
        
        #if swift(>=5.0)
        guard let deviceIdentifier = try? HCIGetRoute(nil)
            else { return nil }
        #else
        guard let result = try? HCIGetRoute(nil),
            let deviceIdentifier = result
            else { return nil }
        #endif

    
    private static func requestControllers() throws -> [HostController] {
        
        let socket = try HostController.Socket()
        return try socket.deviceList()
            .sorted { $0.identifier < $1.identifier }
            .compactMap { try? HostController(identifier: $0.identifier) }
    }
    
    static var controllers: [HostController] {
