xref: /aosp_15_r20/external/pigweed/pw_software_update/bundled_update.proto (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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