Line 1: |
Line 1: |
− | Migration is a sysmodule designed for handling the new Switch to Switch transfer system. | + | 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 [[Applet_Manager_services#ActivateMigrationService|ActivateMigrationService]]/[[Applet_Manager_services#DeactivateMigrationService|DeactivateMigrationService]]). |
| | | |
| = mig:usr = | | = mig:usr = |
Line 8: |
Line 10: |
| ! Cmd || Name | | ! Cmd || Name |
| |- | | |- |
− | | 10 || TryGetLastMigrationInfo | + | | 0 || [19.0.0+] |
| + | |- |
| + | | 10 || [7.0.0+] TryGetLastUserMigrationInfo ([4.0.0-6.2.0] TryGetLastMigrationInfo) |
| + | |- |
| + | | 100 || [7.0.0+] [[#CreateUserMigrationServer|CreateUserMigrationServer]] ([4.0.0-6.2.0] CreateServer) |
| + | |- |
| + | | 101 || [7.0.0+] [[#ResumeUserMigrationServer|ResumeUserMigrationServer]] ([4.0.0-6.2.0] ResumeServer) |
| + | |- |
| + | | 200 || [7.0.0+] [[#CreateUserMigrationClient|CreateUserMigrationClient]] ([4.0.0-6.2.0] CreateClient) |
| + | |- |
| + | | 201 || [7.0.0+] [[#ResumeUserMigrationClient|ResumeUserMigrationClient]] ([4.0.0-6.2.0] ResumeClient) |
| + | |- |
| + | | 1001 || [8.0.0+] [[#GetSaveDataMigrationPolicyInfoAsync|GetSaveDataMigrationPolicyInfoAsync]] |
| + | |- |
| + | | 1010 || [7.0.0+] TryGetLastSaveDataMigrationInfo |
| |- | | |- |
− | | 100 || CreateServer | + | | 1100 || [7.0.0+] [[#CreateSaveDataMigrationServer|CreateSaveDataMigrationServer]] |
| |- | | |- |
− | | 101 || ResumeServer | + | | 1101 || [7.0.0+] [[#ResumeSaveDataMigrationServer|ResumeSaveDataMigrationServer]] |
| |- | | |- |
− | | 200 || CreateClient | + | | 1110 || [17.0.0+] |
| |- | | |- |
− | | 201 || ResumeClient | + | | 1200 || [7.0.0+] [[#CreateSaveDataMigrationClient|CreateSaveDataMigrationClient]] |
| |- | | |- |
| + | | 1201 || [7.0.0+] [[#ResumeSaveDataMigrationClient|ResumeSaveDataMigrationClient]] |
| |} | | |} |
| + | |
| + | == 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 [[NCM_services#ApplicationId|ApplicationId]], returns an [[#IAsyncSaveDataMigrationPolicyInfoContext]]. |
| + | |
| + | This is used by [[qlaunch]] before the actual savedata transfer is started. |
| + | |
| + | This starts a network request for [[Network|save_data_migration_policy]]. |
| + | |
| + | == CreateSaveDataMigrationServer == |
| + | Takes a total of 0x20-bytes of input, a type-0x19 input buffer, a TransferMemory handle, returns an [[#IServer_2|IServer]]. |
| + | |
| + | == ResumeSaveDataMigrationServer == |
| + | Takes an input u32, a TransferMemory handle, returns an [[#IServer_2|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_2|IServer]]. |
| + | |
| + | This is identical to [[#CreateSaveDataMigrationServer|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_2|IClient]]. |
| + | |
| + | == ResumeSaveDataMigrationClient == |
| + | Takes an input u32, a TransferMemory handle, returns an [[#IClient_2|IClient]]. |
| | | |
| == IServer == | | == IServer == |
Line 48: |
Line 101: |
| |- | | |- |
| | 500 || Abort | | | 500 || Abort |
− | |-
| |
| |} | | |} |
| | | |
Line 97: |
Line 149: |
| |- | | |- |
| | 999 || DebugSynchronizeStateInFinalizationAsync | | | 999 || DebugSynchronizeStateInFinalizationAsync |
| + | |} |
| + | |
| + | == IAsyncContext == |
| + | This is "nn::migration::detail::IAsyncContext". |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Cmd || Name |
| + | |- |
| + | | 0 || GetSystemEvent |
| + | |- |
| + | | 1 || Cancel |
| + | |- |
| + | | 2 || HasDone |
| |- | | |- |
| + | | 3 || GetResult |
| |} | | |} |
| | | |
− | == IAsyncContext == | + | == IAsyncSaveDataMigrationPolicyInfoContext == |
− | This is "nn::migration::user::IAsyncContext" | + | This is "nn::migration::detail::IAsyncSaveDataMigrationPolicyInfoContext". |
| | | |
| {| class="wikitable" border="1" | | {| class="wikitable" border="1" |
Line 115: |
Line 182: |
| | 3 || GetResult | | | 3 || GetResult |
| |- | | |- |
| + | | 100 || GetSaveDataMigrationPolicyInfo |
| + | |} |
| + | |
| + | == IServer == |
| + | This is "nn::migration::savedata::IServer". |
| + | |
| + | This was added with [7.0.0+]. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Cmd || Name |
| + | |- |
| + | | 0 || GetUid |
| + | |- |
| + | | 1 || GetApplicationId |
| + | |- |
| + | | 2 || GetServerProfile |
| + | |- |
| + | | 3 || [17.0.0+] ListApplicationIds |
| + | |- |
| + | | 100 || [[#PrepareAsync|PrepareAsync]] |
| + | |- |
| + | | 101 || GetConnectionRequirement |
| + | |- |
| + | | 200 || WaitConnectionAsync |
| + | |- |
| + | | 201 || GetClientProfile |
| + | |- |
| + | | 210 || [8.0.0+] WaitAcceptanceAsync |
| + | |- |
| + | | 300 || ProcessTransferAsync |
| + | |- |
| + | | 400 || CompleteAsync |
| + | |- |
| + | | 500 || Abort |
| + | |- |
| + | | 510 || [19.0.0+] |
| + | |- |
| + | | 998 || [8.0.0+] DebugTryGetState |
| + | |- |
| + | | 999 || [8.0.0+] DebugWaitStateSynchronizationFinalizedAsync |
| + | |} |
| + | |
| + | === PrepareAsync === |
| + | No input, returns an [[#IAsyncContext|IAsyncContext]]. |
| + | |
| + | Besides various other functionality, the async task also uses functionality similar to [[#GetSaveDataMigrationPolicyInfoAsync|GetSaveDataMigrationPolicyInfoAsync]], throwing an error if needed. |
| + | |
| + | == IClient == |
| + | This is "nn::migration::savedata::IClient". |
| + | |
| + | This was added with [7.0.0+]. |
| + | |
| + | {| class="wikitable" border="1" |
| + | |- |
| + | ! Cmd || Name |
| + | |- |
| + | | 0 || GetClientProfile |
| + | |- |
| + | | 100 || GetConnectionRequirement |
| + | |- |
| + | | 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 || Abort |
| + | |- |
| + | | 510 || [19.0.0+] |
| + | |- |
| + | | 996 || [8.0.0+] DebugTryGetState |
| + | |- |
| + | | 997 || [8.0.0+] DebugSynchronizeStateInFinalization0Async |
| + | |- |
| + | | 998 || [8.0.0+] DebugSynchronizeStateInFinalization1Async |
| + | |- |
| + | | 999 || DebugSynchronizeStateFinalizedAsync |
| |} | | |} |
| + | |
| + | = Notes = |
| + | Savedata transfer ("nn::migration::savedata::IServer"/"nn::migration::savedata::IClient") requires that accounts are linked to the same network-account. acc:su [[NS_services#IManagerForSystemService|IManagerForSystemService]] GetAccountId is used here. The server stores this Id into state, and also stores it in the [[LDN_services|ldn]] AdvertiseData. The client also verifies the Id in AdvertiseData against the Id from GetAccountId for the account(s) being used, during ScanServersAsync. |
| | | |
| [[Category:Services]] | | [[Category:Services]] |