mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +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.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
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue