diff --git a/nx/include/switch/services/nifm.h b/nx/include/switch/services/nifm.h index 30a71e8f9..bc3a78abd 100644 --- a/nx/include/switch/services/nifm.h +++ b/nx/include/switch/services/nifm.h @@ -38,6 +38,33 @@ typedef enum { NifmRequestState_Unknown5 = 5, ///< Unknown } NifmRequestState; +/// Authentication +typedef enum { + NifmAuthentication_Invalid = 0, ///< Invalid + NifmAuthentication_Open = 1, ///< Open + NifmAuthentication_Shared = 2, ///< Shared + NifmAuthentication_Wpa = 3, ///< WPA + NifmAuthentication_WpaPsk = 4, ///< WPA-PSK + NifmAuthentication_Wpa2 = 5, ///< WPA2 + NifmAuthentication_Wpa2Psk = 6, ///< WPA2-PSK + NifmAuthentication_Unk7 = 7, ///< Unknown +} NifmAuthentication; + +/// Encryption +typedef enum { + NifmEncryption_Invalid = 0, ///< Invalid + NifmEncryption_None = 1, ///< No password + NifmEncryption_Wep = 2, ///< WEP + NifmEncryption_Tkip = 3, ///< TKIP + NifmEncryption_Aes = 4, ///< AES +} NifmEncryption; + +typedef enum { + NifmNetworkProfileType_User = BIT(0), ///< Saved by user + NifmNetworkProfileType_SsidList = BIT(1), ///< Hardcoded list of Nintendo hotspots + NifmNetworkProfileType_Temporary = BIT(2), ///< Temporary +} NifmNetworkProfileType; + /// Request typedef struct { Service s; ///< IRequest @@ -143,6 +170,18 @@ typedef struct { NifmIpSettingData ip_setting_data; ///< \ref NifmIpSettingData } NifmNetworkProfileData; +/// NetworkProfile +typedef struct { + Uuid uuid; ///< Uuid + char network_name[0x40]; ///< NUL-terminated Network Name string. + u8 profile_type; ///< \ref NifmNetworkProfileType + u8 connection_type; ///< \ref NifmInternetConnectionType + u8 ssid_len; ///< SSID length. + char ssid[0x20]; ///< SSID string. + u8 authentication; ///< \ref NifmAuthentication + u8 encryption; ///< \ref NifmEncryption +} NifmNetworkProfileBasicInfo; + /// Initialize nifm. This is used automatically by gethostid(). Result nifmInitialize(NifmServiceType service_type); @@ -173,6 +212,17 @@ Result nifmCreateRequest(NifmRequest* r, bool autoclear); */ Result nifmGetCurrentNetworkProfile(NifmNetworkProfileData *profile); +/** + * @brief Returns saved network profiles + * @note NifmServiceType User and System have access only to NifmNetworkProfileType_User + * @param[in] type \ref NifmNetworkProfileType + * @param[out] buffer \ref NifmNetworkProfileBasicInfo + * @param[in] max_entries How many \ref NifmNetworkProfileBasicInfo can fit into buffer + * @param[out] total_entries How many \ref NifmNetworkProfileBasicInfo is available + */ + +Result nifmEnumerateNetworkProfiles(NifmNetworkProfileType type, NifmNetworkProfileBasicInfo* buffer, size_t max_entries, u32* total_entries); + /** * @brief GetNetworkProfile * @param[in] uuid Uuid diff --git a/nx/source/services/nifm.c b/nx/source/services/nifm.c index 65f37efe3..bb885ba0c 100644 --- a/nx/source/services/nifm.c +++ b/nx/source/services/nifm.c @@ -217,6 +217,15 @@ Result nifmGetCurrentNetworkProfile(NifmNetworkProfileData *profile) { return rc; } +Result nifmEnumerateNetworkProfiles(NifmNetworkProfileType type, NifmNetworkProfileBasicInfo* buffer, size_t max_entries, u32* total_entries) { + u8 in = (u8)type; + serviceAssumeDomain(&g_nifmIGS); + return serviceDispatchInOut(&g_nifmIGS, 7, in, *total_entries, + .buffer_attrs = { SfBufferAttr_HipcMapAlias | SfBufferAttr_Out}, + .buffers = { { buffer, sizeof(buffer[0]) * max_entries } }, + ); +} + Result nifmGetNetworkProfile(Uuid uuid, NifmNetworkProfileData *profile) { NifmSfNetworkProfileData tmp={0}; serviceAssumeDomain(&g_nifmIGS);