mirror of
https://git.suyu.dev/suyu/suyu
synced 2024-10-30 20:07:51 +00:00
Services/UDS: Set the proper bit in the ConnectionStatus structure when creating a network. (#2738)
* Services/UDS: Set the proper bit in the ConnectionStatus structure when creating a network. This lets the application know that the host was successfully added to the session. * Services/UDS: Reset the connection status when destroying the network * Services/UDS: Reset the connection status's bitmask of changed nodes after reporting it to the game.
This commit is contained in:
parent
791cd14c8d
commit
ac168eeb5d
3 changed files with 15 additions and 5 deletions
|
@ -215,6 +215,11 @@ static void GetConnectionStatus(Interface* self) {
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
rb.PushRaw(connection_status);
|
rb.PushRaw(connection_status);
|
||||||
|
|
||||||
|
// Reset the bitmask of changed nodes after each call to this
|
||||||
|
// function to prevent falsely informing games of outstanding
|
||||||
|
// changes in subsequent calls.
|
||||||
|
connection_status.changed_nodes = 0;
|
||||||
|
|
||||||
LOG_DEBUG(Service_NWM, "called");
|
LOG_DEBUG(Service_NWM, "called");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -314,8 +319,11 @@ static void BeginHostingNetwork(Interface* self) {
|
||||||
// The host is always the first node
|
// The host is always the first node
|
||||||
connection_status.network_node_id = 1;
|
connection_status.network_node_id = 1;
|
||||||
node_info[0].network_node_id = 1;
|
node_info[0].network_node_id = 1;
|
||||||
|
connection_status.nodes[0] = connection_status.network_node_id;
|
||||||
// Set the bit 0 in the nodes bitmask to indicate that node 1 is already taken.
|
// Set the bit 0 in the nodes bitmask to indicate that node 1 is already taken.
|
||||||
connection_status.node_bitmask |= 1;
|
connection_status.node_bitmask |= 1;
|
||||||
|
// Notify the application that the first node was set.
|
||||||
|
connection_status.changed_nodes |= 1;
|
||||||
|
|
||||||
// If the game has a preferred channel, use that instead.
|
// If the game has a preferred channel, use that instead.
|
||||||
if (network_info.channel != 0)
|
if (network_info.channel != 0)
|
||||||
|
@ -352,6 +360,8 @@ static void DestroyNetwork(Interface* self) {
|
||||||
// Unschedule the beacon broadcast event.
|
// Unschedule the beacon broadcast event.
|
||||||
CoreTiming::UnscheduleEvent(beacon_broadcast_event, 0);
|
CoreTiming::UnscheduleEvent(beacon_broadcast_event, 0);
|
||||||
|
|
||||||
|
// TODO(Subv): Check if connection_status is indeed reset after this call.
|
||||||
|
connection_status = {};
|
||||||
connection_status.status = static_cast<u8>(NetworkStatus::NotConnected);
|
connection_status.status = static_cast<u8>(NetworkStatus::NotConnected);
|
||||||
connection_status_event->Signal();
|
connection_status_event->Signal();
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,9 @@ const double MillisecondsPerTU = 1.024;
|
||||||
// Interval measured in TU, the default value is 100TU = 102.4ms
|
// Interval measured in TU, the default value is 100TU = 102.4ms
|
||||||
const u16 DefaultBeaconInterval = 100;
|
const u16 DefaultBeaconInterval = 100;
|
||||||
|
|
||||||
|
/// The maximum number of nodes that can exist in an UDS session.
|
||||||
|
constexpr u32 UDSMaxNodes = 16;
|
||||||
|
|
||||||
struct NodeInfo {
|
struct NodeInfo {
|
||||||
u64_le friend_code_seed;
|
u64_le friend_code_seed;
|
||||||
std::array<u16_le, 10> username;
|
std::array<u16_le, 10> username;
|
||||||
|
@ -47,8 +50,8 @@ struct ConnectionStatus {
|
||||||
u32_le status;
|
u32_le status;
|
||||||
INSERT_PADDING_WORDS(1);
|
INSERT_PADDING_WORDS(1);
|
||||||
u16_le network_node_id;
|
u16_le network_node_id;
|
||||||
INSERT_PADDING_BYTES(2);
|
u16_le changed_nodes;
|
||||||
INSERT_PADDING_BYTES(32);
|
u16_le nodes[UDSMaxNodes];
|
||||||
u8 total_nodes;
|
u8 total_nodes;
|
||||||
u8 max_nodes;
|
u8 max_nodes;
|
||||||
u16_le node_bitmask;
|
u16_le node_bitmask;
|
||||||
|
|
|
@ -15,9 +15,6 @@ namespace Service {
|
||||||
namespace NWM {
|
namespace NWM {
|
||||||
|
|
||||||
using MacAddress = std::array<u8, 6>;
|
using MacAddress = std::array<u8, 6>;
|
||||||
|
|
||||||
/// The maximum number of nodes that can exist in an UDS session.
|
|
||||||
constexpr u32 UDSMaxNodes = 16;
|
|
||||||
constexpr std::array<u8, 3> NintendoOUI = {0x00, 0x1F, 0x32};
|
constexpr std::array<u8, 3> NintendoOUI = {0x00, 0x1F, 0x32};
|
||||||
|
|
||||||
/// Additional block tag ids in the Beacon frames
|
/// Additional block tag ids in the Beacon frames
|
||||||
|
|
Loading…
Reference in a new issue