Browse Source
ldn: Add better stubs and more data types
ldn: Add better stubs and more data types
Co-Authored-By: Narr the Reg <5944268+german77@users.noreply.github.com> Co-Authored-By: Morph <39850852+Morph1984@users.noreply.github.com>nce_cpp
6 changed files with 773 additions and 72 deletions
-
3src/core/CMakeLists.txt
-
12src/core/hle/service/ldn/errors.h
-
431src/core/hle/service/ldn/ldn.cpp
-
73src/core/hle/service/ldn/ldn.h
-
28src/core/hle/service/ldn/ldn_results.h
-
298src/core/hle/service/ldn/ldn_types.h
@ -1,12 +0,0 @@ |
|||
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project |
|||
// SPDX-License-Identifier: GPL-2.0-or-later |
|||
|
|||
#pragma once |
|||
|
|||
#include "core/hle/result.h" |
|||
|
|||
namespace Service::LDN { |
|||
|
|||
constexpr Result ERROR_DISABLED{ErrorModule::LDN, 22}; |
|||
|
|||
} // namespace Service::LDN |
|||
@ -0,0 +1,28 @@ |
|||
// Copyright 2022 yuzu Emulator Project |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include "core/hle/result.h" |
|||
|
|||
namespace Service::LDN { |
|||
|
|||
constexpr Result ResultAdvertiseDataTooLarge{ErrorModule::LDN, 10}; |
|||
constexpr Result ResultAuthenticationFailed{ErrorModule::LDN, 20}; |
|||
constexpr Result ResultDisabled{ErrorModule::LDN, 22}; |
|||
constexpr Result ResultAirplaneModeEnabled{ErrorModule::LDN, 23}; |
|||
constexpr Result ResultInvalidNodeCount{ErrorModule::LDN, 30}; |
|||
constexpr Result ResultConnectionFailed{ErrorModule::LDN, 31}; |
|||
constexpr Result ResultBadState{ErrorModule::LDN, 32}; |
|||
constexpr Result ResultNoIpAddress{ErrorModule::LDN, 33}; |
|||
constexpr Result ResultInvalidBufferCount{ErrorModule::LDN, 50}; |
|||
constexpr Result ResultAccessPointConnectionFailed{ErrorModule::LDN, 65}; |
|||
constexpr Result ResultAuthenticationTimeout{ErrorModule::LDN, 66}; |
|||
constexpr Result ResultMaximumNodeCount{ErrorModule::LDN, 67}; |
|||
constexpr Result ResultBadInput{ErrorModule::LDN, 96}; |
|||
constexpr Result ResultLocalCommunicationIdNotFound{ErrorModule::LDN, 97}; |
|||
constexpr Result ResultLocalCommunicationVersionTooLow{ErrorModule::LDN, 113}; |
|||
constexpr Result ResultLocalCommunicationVersionTooHigh{ErrorModule::LDN, 114}; |
|||
|
|||
} // namespace Service::LDN |
|||
@ -0,0 +1,298 @@ |
|||
// Copyright 2022 yuzu emulator team |
|||
// Licensed under GPLv2 or any later version |
|||
// Refer to the license.txt file included. |
|||
|
|||
#pragma once |
|||
|
|||
#include <fmt/format.h> |
|||
|
|||
#include "common/common_funcs.h" |
|||
#include "common/common_types.h" |
|||
#include "network/network.h" |
|||
|
|||
namespace Service::LDN { |
|||
|
|||
constexpr size_t SsidLengthMax = 32; |
|||
constexpr size_t AdvertiseDataSizeMax = 384; |
|||
constexpr size_t UserNameBytesMax = 32; |
|||
constexpr int NodeCountMax = 8; |
|||
constexpr int StationCountMax = NodeCountMax - 1; |
|||
constexpr size_t PassphraseLengthMax = 64; |
|||
|
|||
enum class SecurityMode : u16 { |
|||
All, |
|||
Retail, |
|||
Debug, |
|||
}; |
|||
|
|||
enum class NodeStateChange : u8 { |
|||
None, |
|||
Connect, |
|||
Disconnect, |
|||
DisconnectAndConnect, |
|||
}; |
|||
|
|||
inline NodeStateChange operator|(NodeStateChange a, NodeStateChange b) { |
|||
return static_cast<NodeStateChange>(static_cast<u8>(a) | static_cast<u8>(b)); |
|||
} |
|||
|
|||
inline NodeStateChange operator|=(NodeStateChange& a, NodeStateChange b) { |
|||
return a = a | b; |
|||
} |
|||
|
|||
enum class ScanFilterFlag : u32 { |
|||
None = 0, |
|||
LocalCommunicationId = 1 << 0, |
|||
SessionId = 1 << 1, |
|||
NetworkType = 1 << 2, |
|||
Ssid = 1 << 4, |
|||
SceneId = 1 << 5, |
|||
IntentId = LocalCommunicationId | SceneId, |
|||
NetworkId = IntentId | SessionId, |
|||
}; |
|||
|
|||
enum class NetworkType : u32 { |
|||
None, |
|||
General, |
|||
Ldn, |
|||
All, |
|||
}; |
|||
|
|||
enum class PackedNetworkType : u8 { |
|||
None, |
|||
General, |
|||
Ldn, |
|||
All, |
|||
}; |
|||
|
|||
enum class State : u32 { |
|||
None, |
|||
Initialized, |
|||
AccessPointOpened, |
|||
AccessPointCreated, |
|||
StationOpened, |
|||
StationConnected, |
|||
Error, |
|||
}; |
|||
|
|||
enum class DisconnectReason : s16 { |
|||
Unknown = -1, |
|||
None, |
|||
DisconnectedByUser, |
|||
DisconnectedBySystem, |
|||
DestroyedByUser, |
|||
DestroyedBySystem, |
|||
Rejected, |
|||
SignalLost, |
|||
}; |
|||
|
|||
enum class NetworkError { |
|||
Unknown = -1, |
|||
None = 0, |
|||
PortUnreachable, |
|||
TooManyPlayers, |
|||
VersionTooLow, |
|||
VersionTooHigh, |
|||
ConnectFailure, |
|||
ConnectNotFound, |
|||
ConnectTimeout, |
|||
ConnectRejected, |
|||
RejectFailed, |
|||
}; |
|||
|
|||
enum class AcceptPolicy : u8 { |
|||
AcceptAll, |
|||
RejectAll, |
|||
BlackList, |
|||
WhiteList, |
|||
}; |
|||
|
|||
enum class WifiChannel : s16 { |
|||
Default = 0, |
|||
wifi24_1 = 1, |
|||
wifi24_6 = 6, |
|||
wifi24_11 = 11, |
|||
wifi50_36 = 36, |
|||
wifi50_40 = 40, |
|||
wifi50_44 = 44, |
|||
wifi50_48 = 48, |
|||
}; |
|||
|
|||
enum class LinkLevel : s8 { |
|||
Bad, |
|||
Low, |
|||
Good, |
|||
Excelent, |
|||
}; |
|||
|
|||
struct NodeLatestUpdate { |
|||
NodeStateChange state_change; |
|||
INSERT_PADDING_BYTES(0x7); // Unknown |
|||
}; |
|||
static_assert(sizeof(NodeLatestUpdate) == 0x8, "NodeLatestUpdate is an invalid size"); |
|||
|
|||
struct SessionId { |
|||
u64 high; |
|||
u64 low; |
|||
|
|||
public: |
|||
bool operator==(const SessionId& b) const { |
|||
return (low == b.low) && (high == b.high); |
|||
} |
|||
}; |
|||
static_assert(sizeof(SessionId) == 0x10, "SessionId is an invalid size"); |
|||
|
|||
struct IntentId { |
|||
u64 local_communication_id; |
|||
INSERT_PADDING_BYTES(0x2); // Reserved |
|||
u16 scene_id; |
|||
INSERT_PADDING_BYTES(0x4); // Reserved |
|||
}; |
|||
static_assert(sizeof(IntentId) == 0x10, "IntentId is an invalid size"); |
|||
|
|||
struct NetworkId { |
|||
IntentId intent_id; |
|||
SessionId session_id; |
|||
}; |
|||
static_assert(sizeof(NetworkId) == 0x20, "NetworkId is an invalid size"); |
|||
|
|||
struct Ssid { |
|||
u8 length; |
|||
std::array<char, SsidLengthMax + 1> raw; |
|||
|
|||
public: |
|||
std::string GetStringValue() const { |
|||
return std::string(raw.data(), length); |
|||
} |
|||
}; |
|||
static_assert(sizeof(Ssid) == 0x22, "Ssid is an invalid size"); |
|||
|
|||
struct Ipv4Address { |
|||
union { |
|||
u32 raw{}; |
|||
std::array<u8, 4> bytes; |
|||
}; |
|||
|
|||
public: |
|||
std::string GetStringValue() const { |
|||
return fmt::format("{}.{}.{}.{}", bytes[3], bytes[2], bytes[1], bytes[0]); |
|||
} |
|||
}; |
|||
static_assert(sizeof(Ipv4Address) == 0x4, "Ipv4Address is an invalid size"); |
|||
|
|||
struct MacAddress { |
|||
std::array<u8, 6> raw{}; |
|||
|
|||
friend bool operator==(const MacAddress& lhs, const MacAddress& rhs) = default; |
|||
}; |
|||
static_assert(sizeof(MacAddress) == 0x6, "MacAddress is an invalid size"); |
|||
|
|||
struct ScanFilter { |
|||
NetworkId network_id; |
|||
NetworkType network_type; |
|||
MacAddress mac_address; |
|||
Ssid ssid; |
|||
INSERT_PADDING_BYTES(0x10); |
|||
ScanFilterFlag flag; |
|||
}; |
|||
static_assert(sizeof(ScanFilter) == 0x60, "ScanFilter is an invalid size"); |
|||
|
|||
struct CommonNetworkInfo { |
|||
MacAddress bssid; |
|||
Ssid ssid; |
|||
WifiChannel channel; |
|||
LinkLevel link_level; |
|||
PackedNetworkType network_type; |
|||
INSERT_PADDING_BYTES(0x4); |
|||
}; |
|||
static_assert(sizeof(CommonNetworkInfo) == 0x30, "CommonNetworkInfo is an invalid size"); |
|||
|
|||
struct NodeInfo { |
|||
Ipv4Address ipv4_address; |
|||
MacAddress mac_address; |
|||
s8 node_id; |
|||
u8 is_connected; |
|||
std::array<u8, UserNameBytesMax + 1> user_name; |
|||
INSERT_PADDING_BYTES(0x1); // Reserved |
|||
s16 local_communication_version; |
|||
INSERT_PADDING_BYTES(0x10); // Reserved |
|||
}; |
|||
static_assert(sizeof(NodeInfo) == 0x40, "NodeInfo is an invalid size"); |
|||
|
|||
struct LdnNetworkInfo { |
|||
std::array<u8, 0x10> security_parameter; |
|||
SecurityMode security_mode; |
|||
AcceptPolicy station_accept_policy; |
|||
u8 has_action_frame; |
|||
INSERT_PADDING_BYTES(0x2); // Padding |
|||
u8 node_count_max; |
|||
u8 node_count; |
|||
std::array<NodeInfo, NodeCountMax> nodes; |
|||
INSERT_PADDING_BYTES(0x2); // Reserved |
|||
u16 advertise_data_size; |
|||
std::array<u8, AdvertiseDataSizeMax> advertise_data; |
|||
INSERT_PADDING_BYTES(0x8C); // Reserved |
|||
u64 random_authentication_id; |
|||
}; |
|||
static_assert(sizeof(LdnNetworkInfo) == 0x430, "LdnNetworkInfo is an invalid size"); |
|||
|
|||
struct NetworkInfo { |
|||
NetworkId network_id; |
|||
CommonNetworkInfo common; |
|||
LdnNetworkInfo ldn; |
|||
}; |
|||
static_assert(sizeof(NetworkInfo) == 0x480, "NetworkInfo is an invalid size"); |
|||
|
|||
struct SecurityConfig { |
|||
SecurityMode security_mode; |
|||
u16 passphrase_size; |
|||
std::array<u8, PassphraseLengthMax> passphrase; |
|||
}; |
|||
static_assert(sizeof(SecurityConfig) == 0x44, "SecurityConfig is an invalid size"); |
|||
|
|||
struct UserConfig { |
|||
std::array<u8, UserNameBytesMax + 1> user_name; |
|||
INSERT_PADDING_BYTES(0xF); // Reserved |
|||
}; |
|||
static_assert(sizeof(UserConfig) == 0x30, "UserConfig is an invalid size"); |
|||
|
|||
#pragma pack(push, 4) |
|||
struct ConnectRequest { |
|||
SecurityConfig security_config; |
|||
UserConfig user_config; |
|||
u32 local_communication_version; |
|||
u32 option_unknown; |
|||
NetworkInfo network_info; |
|||
}; |
|||
static_assert(sizeof(ConnectRequest) == 0x4FC, "ConnectRequest is an invalid size"); |
|||
#pragma pack(pop) |
|||
|
|||
struct SecurityParameter { |
|||
std::array<u8, 0x10> data; // Data, used with the same key derivation as SecurityConfig |
|||
SessionId session_id; |
|||
}; |
|||
static_assert(sizeof(SecurityParameter) == 0x20, "SecurityParameter is an invalid size"); |
|||
|
|||
struct NetworkConfig { |
|||
IntentId intent_id; |
|||
WifiChannel channel; |
|||
u8 node_count_max; |
|||
INSERT_PADDING_BYTES(0x1); // Reserved |
|||
u16 local_communication_version; |
|||
INSERT_PADDING_BYTES(0xA); // Reserved |
|||
}; |
|||
static_assert(sizeof(NetworkConfig) == 0x20, "NetworkConfig is an invalid size"); |
|||
|
|||
struct AddressEntry { |
|||
Ipv4Address ipv4_address; |
|||
MacAddress mac_address; |
|||
INSERT_PADDING_BYTES(0x2); // Reserved |
|||
}; |
|||
static_assert(sizeof(AddressEntry) == 0xC, "AddressEntry is an invalid size"); |
|||
|
|||
struct AddressList { |
|||
std::array<AddressEntry, 0x8> addresses; |
|||
}; |
|||
static_assert(sizeof(AddressList) == 0x60, "AddressList is an invalid size"); |
|||
|
|||
} // namespace Service::LDN |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue