citra-emu
/
citra
Archived
1
0
Fork 0

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:
Sebastian Valle 2017-06-13 19:00:58 +00:00 committed by Weiyi Wang
parent 791cd14c8d
commit ac168eeb5d
3 changed files with 15 additions and 5 deletions

View File

@ -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();

View File

@ -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;

View File

@ -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