1*61c4878aSAndroid Build Coastguard Worker// Copyright 2021 The Pigweed Authors 2*61c4878aSAndroid Build Coastguard Worker// 3*61c4878aSAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); you may not 4*61c4878aSAndroid Build Coastguard Worker// use this file except in compliance with the License. You may obtain a copy of 5*61c4878aSAndroid Build Coastguard Worker// the License at 6*61c4878aSAndroid Build Coastguard Worker// 7*61c4878aSAndroid Build Coastguard Worker// https://www.apache.org/licenses/LICENSE-2.0 8*61c4878aSAndroid Build Coastguard Worker// 9*61c4878aSAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*61c4878aSAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11*61c4878aSAndroid Build Coastguard Worker// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12*61c4878aSAndroid Build Coastguard Worker// License for the specific language governing permissions and limitations under 13*61c4878aSAndroid Build Coastguard Worker// the License. 14*61c4878aSAndroid Build Coastguard Workersyntax = "proto3"; 15*61c4878aSAndroid Build Coastguard Worker 16*61c4878aSAndroid Build Coastguard Workerpackage pw.software_update; 17*61c4878aSAndroid Build Coastguard Worker 18*61c4878aSAndroid Build Coastguard Workerimport "google/protobuf/any.proto"; 19*61c4878aSAndroid Build Coastguard Workerimport "pw_protobuf_protos/common.proto"; 20*61c4878aSAndroid Build Coastguard Workerimport "pw_tokenizer_proto/options.proto"; 21*61c4878aSAndroid Build Coastguard Worker 22*61c4878aSAndroid Build Coastguard Workeroption java_multiple_files = true; 23*61c4878aSAndroid Build Coastguard Workeroption java_package = "dev.pigweed.pw_software_update"; 24*61c4878aSAndroid Build Coastguard Worker 25*61c4878aSAndroid Build Coastguard Workermessage BundledUpdateState { 26*61c4878aSAndroid Build Coastguard Worker enum Enum { 27*61c4878aSAndroid Build Coastguard Worker UNKNOWN = 0; // Not an expected state in the OTA system; only for proto. 28*61c4878aSAndroid Build Coastguard Worker 29*61c4878aSAndroid Build Coastguard Worker // Valid methods in this state: Start() 30*61c4878aSAndroid Build Coastguard Worker // 31*61c4878aSAndroid Build Coastguard Worker // Transition: 32*61c4878aSAndroid Build Coastguard Worker // Start() succeeds --> TRANSFERRING 33*61c4878aSAndroid Build Coastguard Worker // Start() fails --> FINISHED 34*61c4878aSAndroid Build Coastguard Worker INACTIVE = 1; 35*61c4878aSAndroid Build Coastguard Worker 36*61c4878aSAndroid Build Coastguard Worker // Valid methods in this state: GetStatus(), Abort(). 37*61c4878aSAndroid Build Coastguard Worker // 38*61c4878aSAndroid Build Coastguard Worker // Transitions: 39*61c4878aSAndroid Build Coastguard Worker // Transfer completes --> TRANSFERRED 40*61c4878aSAndroid Build Coastguard Worker // Transfer fails --> FINISHED 41*61c4878aSAndroid Build Coastguard Worker // Abort() called --> ABORTING 42*61c4878aSAndroid Build Coastguard Worker TRANSFERRING = 2; 43*61c4878aSAndroid Build Coastguard Worker 44*61c4878aSAndroid Build Coastguard Worker // Valid methods in this state: GetStatus(), Abort(), Verify(). 45*61c4878aSAndroid Build Coastguard Worker // 46*61c4878aSAndroid Build Coastguard Worker // Transitions: 47*61c4878aSAndroid Build Coastguard Worker // Verify() called --> VERIFYING 48*61c4878aSAndroid Build Coastguard Worker // Apply() called --> VERIFYING 49*61c4878aSAndroid Build Coastguard Worker // Abort() called --> ABORTING 50*61c4878aSAndroid Build Coastguard Worker TRANSFERRED = 3; 51*61c4878aSAndroid Build Coastguard Worker 52*61c4878aSAndroid Build Coastguard Worker // Valid methods in this state: GetStatus(), Abort(). 53*61c4878aSAndroid Build Coastguard Worker // 54*61c4878aSAndroid Build Coastguard Worker // Transitions: 55*61c4878aSAndroid Build Coastguard Worker // Verifying finished --> VERIFIED 56*61c4878aSAndroid Build Coastguard Worker // Verifying failed --> FINISHED 57*61c4878aSAndroid Build Coastguard Worker // Abort() called --> ABORTING 58*61c4878aSAndroid Build Coastguard Worker VERIFYING = 4; 59*61c4878aSAndroid Build Coastguard Worker 60*61c4878aSAndroid Build Coastguard Worker // Valid methods in this state: GetStatus(), Abort(), Apply(). 61*61c4878aSAndroid Build Coastguard Worker // 62*61c4878aSAndroid Build Coastguard Worker // Transitions: 63*61c4878aSAndroid Build Coastguard Worker // Apply() called --> APPLYING 64*61c4878aSAndroid Build Coastguard Worker // Abort() called --> ABORTING 65*61c4878aSAndroid Build Coastguard Worker VERIFIED = 5; 66*61c4878aSAndroid Build Coastguard Worker 67*61c4878aSAndroid Build Coastguard Worker // Valid methods in this state: GetStatus(). 68*61c4878aSAndroid Build Coastguard Worker // 69*61c4878aSAndroid Build Coastguard Worker // Transitions: 70*61c4878aSAndroid Build Coastguard Worker // Apply() finished --> FINISHED; may require persisting across a reboot. 71*61c4878aSAndroid Build Coastguard Worker // Apply() failed --> FINISHED; with error set. 72*61c4878aSAndroid Build Coastguard Worker APPLYING = 6; 73*61c4878aSAndroid Build Coastguard Worker 74*61c4878aSAndroid Build Coastguard Worker // Valid methods in this state: GetStatus(). 75*61c4878aSAndroid Build Coastguard Worker // 76*61c4878aSAndroid Build Coastguard Worker // Transitions: 77*61c4878aSAndroid Build Coastguard Worker // Abort finishes --> FINISHED 78*61c4878aSAndroid Build Coastguard Worker // Abort fails --> FINISHED 79*61c4878aSAndroid Build Coastguard Worker ABORTING = 7; 80*61c4878aSAndroid Build Coastguard Worker 81*61c4878aSAndroid Build Coastguard Worker // Valid methods in this state: GetStatus(), Reset(). 82*61c4878aSAndroid Build Coastguard Worker // 83*61c4878aSAndroid Build Coastguard Worker // Terminal state indicating a finished update; whether successful or 84*61c4878aSAndroid Build Coastguard Worker // not. Additional termination information available in completion_state 85*61c4878aSAndroid Build Coastguard Worker // and possibly note. 86*61c4878aSAndroid Build Coastguard Worker // 87*61c4878aSAndroid Build Coastguard Worker // Transitions: 88*61c4878aSAndroid Build Coastguard Worker // Reset() succeeds --> INACTIVE 89*61c4878aSAndroid Build Coastguard Worker // Reset() fails --> FINISHED 90*61c4878aSAndroid Build Coastguard Worker FINISHED = 8; 91*61c4878aSAndroid Build Coastguard Worker } 92*61c4878aSAndroid Build Coastguard Worker} 93*61c4878aSAndroid Build Coastguard Worker 94*61c4878aSAndroid Build Coastguard Workermessage BundledUpdateResult { 95*61c4878aSAndroid Build Coastguard Worker enum Enum { 96*61c4878aSAndroid Build Coastguard Worker UNKNOWN = 0; 97*61c4878aSAndroid Build Coastguard Worker SUCCESS = 1; 98*61c4878aSAndroid Build Coastguard Worker UNKNOWN_ERROR = 2; 99*61c4878aSAndroid Build Coastguard Worker ABORTED = 3; 100*61c4878aSAndroid Build Coastguard Worker TRANSFER_FAILED = 4; 101*61c4878aSAndroid Build Coastguard Worker VERIFY_FAILED = 5; 102*61c4878aSAndroid Build Coastguard Worker APPLY_FAILED = 6; 103*61c4878aSAndroid Build Coastguard Worker } 104*61c4878aSAndroid Build Coastguard Worker} 105*61c4878aSAndroid Build Coastguard Worker 106*61c4878aSAndroid Build Coastguard Workermessage BundledUpdateStatus { 107*61c4878aSAndroid Build Coastguard Worker BundledUpdateState.Enum state = 1; 108*61c4878aSAndroid Build Coastguard Worker 109*61c4878aSAndroid Build Coastguard Worker optional BundledUpdateResult.Enum result = 2; 110*61c4878aSAndroid Build Coastguard Worker 111*61c4878aSAndroid Build Coastguard Worker // This is the percentage of estimated progress for the current update 112*61c4878aSAndroid Build Coastguard Worker // state in hundreths of a percent. (e.g. 5.00% = 500u) 113*61c4878aSAndroid Build Coastguard Worker optional uint32 current_state_progress_hundreth_percent = 3; 114*61c4878aSAndroid Build Coastguard Worker 115*61c4878aSAndroid Build Coastguard Worker // If present, the active transfer ID for the update. 116*61c4878aSAndroid Build Coastguard Worker optional uint32 transfer_id = 4; 117*61c4878aSAndroid Build Coastguard Worker 118*61c4878aSAndroid Build Coastguard Worker // The name of the update bundle. Not present when in INACTIVE state. This is 119*61c4878aSAndroid Build Coastguard Worker // useful for enabling resuming of transfers across reboots or disconnects, 120*61c4878aSAndroid Build Coastguard Worker // without transferring an expensive manifest. 121*61c4878aSAndroid Build Coastguard Worker optional string bundle_filename = 5; 122*61c4878aSAndroid Build Coastguard Worker 123*61c4878aSAndroid Build Coastguard Worker // Additional information related to the state may be provided here. 124*61c4878aSAndroid Build Coastguard Worker // Examples: "Failed verifying: ml_model.bin", "Flash partition couldn't be 125*61c4878aSAndroid Build Coastguard Worker // acquired and was busy", etc. Can provide more granular information than 126*61c4878aSAndroid Build Coastguard Worker // just the completion result. 127*61c4878aSAndroid Build Coastguard Worker optional bytes note = 6 [(tokenizer.format) = TOKENIZATION_OPTIONAL]; 128*61c4878aSAndroid Build Coastguard Worker 129*61c4878aSAndroid Build Coastguard Worker // Custom application data. 130*61c4878aSAndroid Build Coastguard Worker optional google.protobuf.Any extended_status = 7; 131*61c4878aSAndroid Build Coastguard Worker} 132*61c4878aSAndroid Build Coastguard Worker 133*61c4878aSAndroid Build Coastguard Workermessage StartRequest { 134*61c4878aSAndroid Build Coastguard Worker // If present, the filename for the staged file. This should persist across 135*61c4878aSAndroid Build Coastguard Worker // reboots, and will be returned from GetStatus() until either the update 136*61c4878aSAndroid Build Coastguard Worker // applies or is aborted. 137*61c4878aSAndroid Build Coastguard Worker optional string bundle_filename = 1; 138*61c4878aSAndroid Build Coastguard Worker} 139*61c4878aSAndroid Build Coastguard Worker 140*61c4878aSAndroid Build Coastguard Worker// TODO: b/235273688 - Add documentation and details of the API contract. 141*61c4878aSAndroid Build Coastguard Workerservice BundledUpdate { 142*61c4878aSAndroid Build Coastguard Worker // TODO(keir): Offer GetCurrentManifest & GetStagedManifest() methods that 143*61c4878aSAndroid Build Coastguard Worker // leverage pw_transfer to upload the manifest off the device, to enable host 144*61c4878aSAndroid Build Coastguard Worker // logic. 145*61c4878aSAndroid Build Coastguard Worker 146*61c4878aSAndroid Build Coastguard Worker // Get current status of software update. 147*61c4878aSAndroid Build Coastguard Worker rpc GetStatus(pw.protobuf.Empty) returns (BundledUpdateStatus); 148*61c4878aSAndroid Build Coastguard Worker 149*61c4878aSAndroid Build Coastguard Worker // Start a software update. Do any device-specific tasks needed to be ready 150*61c4878aSAndroid Build Coastguard Worker // for update. Open pw_transfer channel used for staging bundle. 151*61c4878aSAndroid Build Coastguard Worker // Returned status includes the transfer ID to use for bundle transfer. 152*61c4878aSAndroid Build Coastguard Worker // 153*61c4878aSAndroid Build Coastguard Worker // Precondition: Device update state must be INACTIVE. 154*61c4878aSAndroid Build Coastguard Worker rpc Start(StartRequest) returns (BundledUpdateStatus); 155*61c4878aSAndroid Build Coastguard Worker 156*61c4878aSAndroid Build Coastguard Worker // Manually set the bundle status as transferred. It can be used to recover 157*61c4878aSAndroid Build Coastguard Worker // a previously finished transfer or used when transfer happens on a side 158*61c4878aSAndroid Build Coastguard Worker // channel without involvement of pw_transfer 159*61c4878aSAndroid Build Coastguard Worker // 160*61c4878aSAndroid Build Coastguard Worker // Precondition: Device update state must be INACTIVE or TRANSFERRING 161*61c4878aSAndroid Build Coastguard Worker rpc SetTransferred(pw.protobuf.Empty) returns (BundledUpdateStatus); 162*61c4878aSAndroid Build Coastguard Worker 163*61c4878aSAndroid Build Coastguard Worker // Verify the bundle in the staging area. Returns immediately, but 164*61c4878aSAndroid Build Coastguard Worker // verification runs asynchronously. Poll for completion with GetStatus(). 165*61c4878aSAndroid Build Coastguard Worker // 166*61c4878aSAndroid Build Coastguard Worker // Precondition: Device update state must be TRANSFERRED. 167*61c4878aSAndroid Build Coastguard Worker rpc Verify(pw.protobuf.Empty) returns (BundledUpdateStatus); 168*61c4878aSAndroid Build Coastguard Worker 169*61c4878aSAndroid Build Coastguard Worker // Apply the staged update. The update process will verify the staged bundle 170*61c4878aSAndroid Build Coastguard Worker // or ensure that it was verified, apply the bundle, and in some cases reboot 171*61c4878aSAndroid Build Coastguard Worker // the device. During this process, the device may be slow to respond. 172*61c4878aSAndroid Build Coastguard Worker // 173*61c4878aSAndroid Build Coastguard Worker // The RPC is async; callers must fetch status with GetStatus(). 174*61c4878aSAndroid Build Coastguard Worker // 175*61c4878aSAndroid Build Coastguard Worker // Precondition: Device update state must be TRANSFERRED or VERIFIED. 176*61c4878aSAndroid Build Coastguard Worker rpc Apply(pw.protobuf.Empty) returns (BundledUpdateStatus); 177*61c4878aSAndroid Build Coastguard Worker 178*61c4878aSAndroid Build Coastguard Worker // Abort any current software update in progress. 179*61c4878aSAndroid Build Coastguard Worker // Precondition: Device update state must not be INACTIVE or FINISHED. 180*61c4878aSAndroid Build Coastguard Worker rpc Abort(pw.protobuf.Empty) returns (BundledUpdateStatus); 181*61c4878aSAndroid Build Coastguard Worker 182*61c4878aSAndroid Build Coastguard Worker // Reset after a finished update. Device goes into INACTIVE state after. 183*61c4878aSAndroid Build Coastguard Worker // 184*61c4878aSAndroid Build Coastguard Worker // Precondition: Device update state must be FINISHED. 185*61c4878aSAndroid Build Coastguard Worker rpc Reset(pw.protobuf.Empty) returns (BundledUpdateStatus); 186*61c4878aSAndroid Build Coastguard Worker} 187