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
|
@ -215,6 +215,11 @@ static void GetConnectionStatus(Interface* self) {
|
|||
rb.Push(RESULT_SUCCESS);
|
||||
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");
|
||||
}
|
||||
|
||||
|
@ -314,8 +319,11 @@ static void BeginHostingNetwork(Interface* self) {
|
|||
// The host is always the first node
|
||||
connection_status.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.
|
||||
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 (network_info.channel != 0)
|
||||
|
@ -352,6 +360,8 @@ static void DestroyNetwork(Interface* self) {
|
|||
// Unschedule the beacon broadcast event.
|
||||
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_event->Signal();
|
||||
|
||||
|
|
|
@ -24,6 +24,9 @@ const double MillisecondsPerTU = 1.024;
|
|||
// Interval measured in TU, the default value is 100TU = 102.4ms
|
||||
const u16 DefaultBeaconInterval = 100;
|
||||
|
||||
/// The maximum number of nodes that can exist in an UDS session.
|
||||
constexpr u32 UDSMaxNodes = 16;
|
||||
|
||||
struct NodeInfo {
|
||||
u64_le friend_code_seed;
|
||||
std::array<u16_le, 10> username;
|
||||
|
@ -47,8 +50,8 @@ struct ConnectionStatus {
|
|||
u32_le status;
|
||||
INSERT_PADDING_WORDS(1);
|
||||
u16_le network_node_id;
|
||||
INSERT_PADDING_BYTES(2);
|
||||
INSERT_PADDING_BYTES(32);
|
||||
u16_le changed_nodes;
|
||||
u16_le nodes[UDSMaxNodes];
|
||||
u8 total_nodes;
|
||||
u8 max_nodes;
|
||||
u16_le node_bitmask;
|
||||
|
|
|
@ -15,9 +15,6 @@ namespace Service {
|
|||
namespace NWM {
|
||||
|
||||
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};
|
||||
|
||||
/// Additional block tag ids in the Beacon frames
|
||||
|
|
Reference in New Issue