Difference between revisions of "Migration services"

From Nintendo Switch Brew
Jump to navigation Jump to search
 
Line 12: Line 12:
 
| 0 || [19.0.0+]
 
| 0 || [19.0.0+]
 
|-
 
|-
| 10 || [7.0.0+] TryGetLastUserMigrationInfo ([4.0.0-6.2.0] TryGetLastMigrationInfo)
+
| 1 || [20.0.0+]
 +
|-
 +
| 2 || [20.0.0+]
 +
|-
 +
| 10 || [7.0.0-19.0.1] TryGetLastUserMigrationInfo ([4.0.0-6.2.0] TryGetLastMigrationInfo)
 +
|-
 +
| 11 || [20.0.0+]
 
|-
 
|-
 
| 100 || [7.0.0+] [[#CreateUserMigrationServer|CreateUserMigrationServer]] ([4.0.0-6.2.0] CreateServer)
 
| 100 || [7.0.0+] [[#CreateUserMigrationServer|CreateUserMigrationServer]] ([4.0.0-6.2.0] CreateServer)
Line 26: Line 32:
 
| 1010 || [7.0.0+] TryGetLastSaveDataMigrationInfo
 
| 1010 || [7.0.0+] TryGetLastSaveDataMigrationInfo
 
|-
 
|-
| 1100 || [7.0.0+] [[#CreateSaveDataMigrationServer|CreateSaveDataMigrationServer]]
+
| 1100 || [7.0.0-19.0.1] [[#CreateSaveDataMigrationServer|CreateSaveDataMigrationServer]]
 
|-
 
|-
 
| 1101 || [7.0.0+] [[#ResumeSaveDataMigrationServer|ResumeSaveDataMigrationServer]]
 
| 1101 || [7.0.0+] [[#ResumeSaveDataMigrationServer|ResumeSaveDataMigrationServer]]
Line 35: Line 41:
 
|-
 
|-
 
| 1201 || [7.0.0+] [[#ResumeSaveDataMigrationClient|ResumeSaveDataMigrationClient]]
 
| 1201 || [7.0.0+] [[#ResumeSaveDataMigrationClient|ResumeSaveDataMigrationClient]]
 +
|-
 +
| 2001 || [20.0.0+]
 +
|-
 +
| 2010 || [20.0.0+]
 +
|-
 +
| 2100 || [20.0.0+]
 +
|-
 +
| 2200 || [20.0.0+]
 +
|-
 +
| 2210 || [20.0.0+]
 +
|-
 +
| 2220 || [20.0.0+]
 +
|-
 +
| 2230 || [20.0.0+]
 +
|-
 +
| 2231 || [20.0.0+]
 +
|-
 +
| 2232 || [20.0.0+]
 +
|-
 +
| 2233 || [20.0.0+]
 +
|-
 +
| 2234 || [20.0.0+]
 +
|-
 +
| 2250 || [20.0.0+]
 +
|-
 +
| 2260 || [20.0.0+]
 +
|-
 +
| 2270 || [20.0.0+]
 +
|-
 +
| 2280 || [20.0.0+]
 +
|-
 +
| 2300 || [20.0.0+]
 +
|-
 +
| 2310 || [20.0.0+]
 +
|-
 +
| 2400 || [20.0.0+]
 +
|-
 +
| 2420 || [20.0.0+]
 
|}
 
|}
  
Line 87: Line 131:
 
|-
 
|-
 
| 101 || GetConnectionRequirement
 
| 101 || GetConnectionRequirement
 +
|-
 +
| 102 || [20.0.0+]
 
|-
 
|-
 
| 200 || WaitConnectionAsync
 
| 200 || WaitConnectionAsync
Line 123: Line 169:
 
|-
 
|-
 
| 101 || GetConnectionRequirement
 
| 101 || GetConnectionRequirement
 +
|-
 +
| 102 || [20.0.0+]
 
|-
 
|-
 
| 200 || ScanServersAsync
 
| 200 || ScanServersAsync
Line 196: Line 244:
 
| 0 || GetUid
 
| 0 || GetUid
 
|-
 
|-
| 1 || GetApplicationId
+
| 1 || [7.0.0-19.0.1] GetApplicationId
 
|-
 
|-
 
| 2 || GetServerProfile
 
| 2 || GetServerProfile
Line 205: Line 253:
 
|-
 
|-
 
| 101 || GetConnectionRequirement
 
| 101 || GetConnectionRequirement
 +
|-
 +
| 102 || [20.0.0+]
 
|-
 
|-
 
| 200 || WaitConnectionAsync
 
| 200 || WaitConnectionAsync
 
|-
 
|-
 
| 201 || GetClientProfile
 
| 201 || GetClientProfile
 +
|-
 +
| 202 || [20.0.0+]
 +
|-
 +
| 203 || [20.0.0+]
 
|-
 
|-
 
| 210 || [8.0.0+] WaitAcceptanceAsync
 
| 210 || [8.0.0+] WaitAcceptanceAsync
Line 216: Line 270:
 
| 400 || CompleteAsync
 
| 400 || CompleteAsync
 
|-
 
|-
| 500 || Abort
+
| 500 || [7.0.0-19.0.1] Abort
 
|-
 
|-
 
| 510 || [19.0.0+]
 
| 510 || [19.0.0+]
Line 242: Line 296:
 
|-
 
|-
 
| 100 || GetConnectionRequirement
 
| 100 || GetConnectionRequirement
 +
|-
 +
| 101 || [20.0.0+]
 
|-
 
|-
 
| 200 || ScanServersAsync
 
| 200 || ScanServersAsync
 
|-
 
|-
| 201 || ListServers
+
| 201 || [[#ListServers|ListServers]]
 
|-
 
|-
 
| 210 || ConnectByServerIdAsync
 
| 210 || ConnectByServerIdAsync
Line 271: Line 327:
 
| 400 || CompleteAsync
 
| 400 || CompleteAsync
 
|-
 
|-
| 500 || Abort
+
| 500 || [7.0.0-19.0.1] Abort
 
|-
 
|-
 
| 510 || [19.0.0+]
 
| 510 || [19.0.0+]
Line 283: Line 339:
 
| 999 || DebugSynchronizeStateFinalizedAsync
 
| 999 || DebugSynchronizeStateFinalizedAsync
 
|}
 
|}
 +
 +
=== ListServers ===
 +
[20.0.0+] The struct size is now 0x130-bytes instead of 0x128-bytes.
  
 
= Notes =
 
= Notes =

Latest revision as of 18:18, 30 April 2025

Migration is a sysmodule designed for handling the Switch-to-Switch transfer system introduced in firmware 4.0.0.

With newer system-versions this sysmodule is only running when qlaunch is using migration from the relevant transfer menus (see ActivateMigrationService/DeactivateMigrationService).

mig:usr

This is "nn::migration::user::IService"

Cmd Name
0 [19.0.0+]
1 [20.0.0+]
2 [20.0.0+]
10 [7.0.0-19.0.1] TryGetLastUserMigrationInfo ([4.0.0-6.2.0] TryGetLastMigrationInfo)
11 [20.0.0+]
100 [7.0.0+] CreateUserMigrationServer ([4.0.0-6.2.0] CreateServer)
101 [7.0.0+] ResumeUserMigrationServer ([4.0.0-6.2.0] ResumeServer)
200 [7.0.0+] CreateUserMigrationClient ([4.0.0-6.2.0] CreateClient)
201 [7.0.0+] ResumeUserMigrationClient ([4.0.0-6.2.0] ResumeClient)
1001 [8.0.0+] GetSaveDataMigrationPolicyInfoAsync
1010 [7.0.0+] TryGetLastSaveDataMigrationInfo
1100 [7.0.0-19.0.1] CreateSaveDataMigrationServer
1101 [7.0.0+] ResumeSaveDataMigrationServer
1110 [17.0.0+]
1200 [7.0.0+] CreateSaveDataMigrationClient
1201 [7.0.0+] ResumeSaveDataMigrationClient
2001 [20.0.0+]
2010 [20.0.0+]
2100 [20.0.0+]
2200 [20.0.0+]
2210 [20.0.0+]
2220 [20.0.0+]
2230 [20.0.0+]
2231 [20.0.0+]
2232 [20.0.0+]
2233 [20.0.0+]
2234 [20.0.0+]
2250 [20.0.0+]
2260 [20.0.0+]
2270 [20.0.0+]
2280 [20.0.0+]
2300 [20.0.0+]
2310 [20.0.0+]
2400 [20.0.0+]
2420 [20.0.0+]

CreateUserMigrationServer

Takes a total of 0x18-bytes of input, a type-0x19 input buffer, a TransferMemory handle, returns an #IServer.

ResumeUserMigrationServer

Takes an input u32, a TransferMemory handle, returns an #IServer.

CreateUserMigrationClient

Takes an input u32, a type-0x19 input buffer, a TransferMemory handle, returns an #IClient.

ResumeUserMigrationClient

Takes an input u32, a TransferMemory handle, returns an #IClient.

GetSaveDataMigrationPolicyInfoAsync

Takes an ApplicationId, returns an #IAsyncSaveDataMigrationPolicyInfoContext.

This is used by qlaunch before the actual savedata transfer is started.

This starts a network request for save_data_migration_policy.

CreateSaveDataMigrationServer

Takes a total of 0x20-bytes of input, a type-0x19 input buffer, a TransferMemory handle, returns an IServer.

ResumeSaveDataMigrationServer

Takes an input u32, a TransferMemory handle, returns an IServer.

Cmd1110

Takes a total of 0x18-bytes of input, a type-0x19 input buffer, a type-0x5 input buffer containing an array of u64s, and a TransferMemory handle. Returns an IServer.

This is identical to CreateSaveDataMigrationServer except the u64-array is passed directly instead of from a single input u64.

CreateSaveDataMigrationClient

Takes an input u32, a type-0x19 input buffer, a TransferMemory handle, returns an IClient.

ResumeSaveDataMigrationClient

Takes an input u32, a TransferMemory handle, returns an IClient.

IServer

This is "nn::migration::user::IServer"

Cmd Name
0 GetUid
1 GetServerProfile
100 PrepareAsync
101 GetConnectionRequirement
102 [20.0.0+]
200 WaitConnectionAsync
201 GetClientProfile
202 AcceptConnectionAsync
203 DeclineConnectionAsync
300 ProcessTransferAsync
400 CompleteAsync
500 Abort

IClient

This is "nn::migration::user::IClient"

Cmd Name
0 GetClientProfile
10 CreateLoginSession
11 GetNetworkServiceAccountId
12 GetUserNickname
13 GetUserProfileImage
100 PrepareAsync
101 GetConnectionRequirement
102 [20.0.0+]
200 ScanServersAsync
201 ListServers
210 ConnectByServerIdAsync
300 GetStorageShortfall
301 GetTotalTransferInfo
302 GetImmigrantUid
310 GetCurrentTransferInfo
311 GetCurrentRelatedApplications
320 TransferNextAsync
350 SuspendAsync
400 CompleteAsync
500 Abort
999 DebugSynchronizeStateInFinalizationAsync

IAsyncContext

This is "nn::migration::detail::IAsyncContext".

Cmd Name
0 GetSystemEvent
1 Cancel
2 HasDone
3 GetResult

IAsyncSaveDataMigrationPolicyInfoContext

This is "nn::migration::detail::IAsyncSaveDataMigrationPolicyInfoContext".

Cmd Name
0 GetSystemEvent
1 Cancel
2 HasDone
3 GetResult
100 GetSaveDataMigrationPolicyInfo

IServer

This is "nn::migration::savedata::IServer".

This was added with [7.0.0+].

Cmd Name
0 GetUid
1 [7.0.0-19.0.1] GetApplicationId
2 GetServerProfile
3 [17.0.0+] ListApplicationIds
100 PrepareAsync
101 GetConnectionRequirement
102 [20.0.0+]
200 WaitConnectionAsync
201 GetClientProfile
202 [20.0.0+]
203 [20.0.0+]
210 [8.0.0+] WaitAcceptanceAsync
300 ProcessTransferAsync
400 CompleteAsync
500 [7.0.0-19.0.1] Abort
510 [19.0.0+]
998 [8.0.0+] DebugTryGetState
999 [8.0.0+] DebugWaitStateSynchronizationFinalizedAsync

PrepareAsync

No input, returns an IAsyncContext.

Besides various other functionality, the async task also uses functionality similar to GetSaveDataMigrationPolicyInfoAsync, throwing an error if needed.

IClient

This is "nn::migration::savedata::IClient".

This was added with [7.0.0+].

Cmd Name
0 GetClientProfile
100 GetConnectionRequirement
101 [20.0.0+]
200 ScanServersAsync
201 ListServers
210 ConnectByServerIdAsync
220 [8.0.0+] AcceptAsync
221 [8.0.0+] DeclineAsync
300 GetStorageShortfall
301 GetTotalTransferInfo
302 GetImmigrantUid
303 GetApplicationId
304 [17.0.0+] ListApplicationIds
310 GetCurrentTransferInfo
320 TransferNextAsync
350 SuspendAsync
400 CompleteAsync
500 [7.0.0-19.0.1] Abort
510 [19.0.0+]
996 [8.0.0+] DebugTryGetState
997 [8.0.0+] DebugSynchronizeStateInFinalization0Async
998 [8.0.0+] DebugSynchronizeStateInFinalization1Async
999 DebugSynchronizeStateFinalizedAsync

ListServers

[20.0.0+] The struct size is now 0x130-bytes instead of 0x128-bytes.

Notes

Savedata transfer ("nn::migration::savedata::IServer"/"nn::migration::savedata::IClient") requires that accounts are linked to the same network-account. acc:su IManagerForSystemService GetAccountId is used here. The server stores this Id into state, and also stores it in the ldn AdvertiseData. The client also verifies the Id in AdvertiseData against the Id from GetAccountId for the account(s) being used, during ScanServersAsync.