Difference between revisions of "Migration services"
Line 12: | Line 12: | ||
| 0 || [19.0.0+] | | 0 || [19.0.0+] | ||
|- | |- | ||
− | | 10 || [7.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|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 | + | | 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.