Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 1 | /* |
Imre Kis | efadd3a | 2024-06-28 14:15:57 +0200 | [diff] [blame] | 2 | * Copyright (c) 2022-2024, Arm Limited and Contributors. All rights reserved. |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 3 | * |
| 4 | * SPDX-License-Identifier: BSD-3-Clause |
| 5 | */ |
| 6 | |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 7 | #include "fwu_provider.h" |
| 8 | |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 9 | #include <stddef.h> |
| 10 | |
| 11 | #include "common/uuid/uuid.h" |
| 12 | #include "protocols/rpc/common/packed-c/status.h" |
Imre Kis | 7554c47 | 2024-07-04 10:09:31 +0200 | [diff] [blame] | 13 | #include "protocols/service/fwu/opcodes.h" |
Imre Kis | efadd3a | 2024-06-28 14:15:57 +0200 | [diff] [blame] | 14 | #include "service/fwu/common/update_agent_interface.h" |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 15 | #include "service/fwu/provider/serializer/fwu_provider_serializer.h" |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 16 | #include "fwu_uuid.h" |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 17 | |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 18 | #ifndef FWU_PROVIDER_MAX_PARTIAL_UPDATE_COUNT |
| 19 | #define FWU_PROVIDER_MAX_PARTIAL_UPDATE_COUNT (4) |
| 20 | #endif /* FWU_PROVIDER_MAX_PARTIAL_UPDATE_COUNT */ |
| 21 | |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 22 | /* Service request handlers */ |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 23 | static rpc_status_t discover_handler(void *context, struct rpc_request *req); |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 24 | static rpc_status_t begin_staging_handler(void *context, struct rpc_request *req); |
| 25 | static rpc_status_t end_staging_handler(void *context, struct rpc_request *req); |
| 26 | static rpc_status_t cancel_staging_handler(void *context, struct rpc_request *req); |
| 27 | static rpc_status_t open_handler(void *context, struct rpc_request *req); |
| 28 | static rpc_status_t write_stream_handler(void *context, struct rpc_request *req); |
| 29 | static rpc_status_t read_stream_handler(void *context, struct rpc_request *req); |
| 30 | static rpc_status_t commit_handler(void *context, struct rpc_request *req); |
| 31 | static rpc_status_t accept_image_handler(void *context, struct rpc_request *req); |
| 32 | static rpc_status_t select_previous_handler(void *context, struct rpc_request *req); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 33 | |
| 34 | /* Handler mapping table for service */ |
| 35 | static const struct service_handler handler_table[] = { |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 36 | { FWU_FUNC_ID_DISCOVER, discover_handler }, |
| 37 | { FWU_FUNC_ID_BEGIN_STAGING, begin_staging_handler }, |
| 38 | { FWU_FUNC_ID_END_STAGING, end_staging_handler }, |
| 39 | { FWU_FUNC_ID_CANCEL_STAGING, cancel_staging_handler }, |
| 40 | { FWU_FUNC_ID_OPEN, open_handler }, |
| 41 | { FWU_FUNC_ID_WRITE_STREAM, write_stream_handler }, |
| 42 | { FWU_FUNC_ID_READ_STREAM, read_stream_handler }, |
| 43 | { FWU_FUNC_ID_COMMIT, commit_handler }, |
| 44 | { FWU_FUNC_ID_ACCEPT_IMAGE, accept_image_handler }, |
| 45 | { FWU_FUNC_ID_SELECT_PREVIOUS, select_previous_handler } |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 46 | }; |
| 47 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 48 | struct rpc_service_interface *fwu_provider_init(struct fwu_provider *context, |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 49 | struct update_agent *update_agent) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 50 | { |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 51 | const struct rpc_uuid service_uuid = { .uuid = TS_FWU_SERVICE_UUID }; |
Imre Kis | 6fd73d8 | 2024-07-04 13:36:10 +0200 | [diff] [blame] | 52 | struct rpc_service_interface *rpc_interface = NULL; |
| 53 | |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 54 | /* Initialise the fwu_provider */ |
| 55 | context->update_agent = update_agent; |
| 56 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 57 | service_provider_init(&context->base_provider, context, &service_uuid, handler_table, |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 58 | sizeof(handler_table) / sizeof(struct service_handler)); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 59 | |
Imre Kis | 6fd73d8 | 2024-07-04 13:36:10 +0200 | [diff] [blame] | 60 | rpc_interface = service_provider_get_rpc_interface(&context->base_provider); |
| 61 | if (!rpc_interface) |
| 62 | return NULL; |
| 63 | |
| 64 | return fwu_provider_shim_init(&context->shim, rpc_interface); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 65 | } |
| 66 | |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 67 | void fwu_provider_deinit(struct fwu_provider *context) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 68 | { |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 69 | (void)context; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 70 | } |
| 71 | |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 72 | static uint16_t generate_function_presence(const struct update_agent *agent, |
| 73 | uint8_t function_presence[FWU_FUNC_ID_COUNT]) |
| 74 | { |
| 75 | uint16_t num_func = 0; |
| 76 | |
| 77 | #define ADD_FUNC_IF_PRESENT(func, id) \ |
| 78 | do { \ |
| 79 | if (agent->interface->func != NULL) \ |
| 80 | function_presence[num_func++] = (id); \ |
| 81 | } while (0) |
| 82 | |
| 83 | ADD_FUNC_IF_PRESENT(discover, FWU_FUNC_ID_DISCOVER); |
| 84 | ADD_FUNC_IF_PRESENT(begin_staging, FWU_FUNC_ID_BEGIN_STAGING); |
| 85 | ADD_FUNC_IF_PRESENT(end_staging, FWU_FUNC_ID_END_STAGING); |
| 86 | ADD_FUNC_IF_PRESENT(cancel_staging, FWU_FUNC_ID_CANCEL_STAGING); |
| 87 | ADD_FUNC_IF_PRESENT(open, FWU_FUNC_ID_OPEN); |
| 88 | ADD_FUNC_IF_PRESENT(write_stream, FWU_FUNC_ID_WRITE_STREAM); |
| 89 | ADD_FUNC_IF_PRESENT(read_stream, FWU_FUNC_ID_READ_STREAM); |
| 90 | ADD_FUNC_IF_PRESENT(commit, FWU_FUNC_ID_COMMIT); |
| 91 | ADD_FUNC_IF_PRESENT(accept_image, FWU_FUNC_ID_ACCEPT_IMAGE); |
| 92 | ADD_FUNC_IF_PRESENT(select_previous, FWU_FUNC_ID_SELECT_PREVIOUS); |
| 93 | |
| 94 | #undef ADD_FUNC_IF_PRESENT |
| 95 | |
| 96 | return num_func; |
| 97 | } |
| 98 | |
| 99 | static rpc_status_t discover_handler(void *context, struct rpc_request *req) |
| 100 | { |
| 101 | rpc_status_t rpc_status = RPC_ERROR_INTERNAL; |
| 102 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 103 | struct fwu_discovery_result discovery_result = { 0 }; |
| 104 | struct rpc_buffer *resp_buf = &req->response; |
| 105 | |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 106 | req->service_status = update_agent_discover(this_instance->update_agent, &discovery_result); |
| 107 | |
| 108 | if (!req->service_status) { |
| 109 | uint16_t num_func = 0; |
| 110 | uint8_t function_presence[FWU_FUNC_ID_COUNT] = { 0 }; |
| 111 | |
| 112 | num_func = generate_function_presence(this_instance->update_agent, |
| 113 | function_presence); |
| 114 | |
Imre Kis | 86b1d67 | 2024-07-15 13:15:58 +0200 | [diff] [blame] | 115 | rpc_status = fwu_serialize_discover_resp( |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 116 | resp_buf, discovery_result.service_status, discovery_result.version_major, |
| 117 | discovery_result.version_minor, num_func, discovery_result.max_payload_size, |
| 118 | discovery_result.flags, discovery_result.vendor_specific_flags, |
| 119 | function_presence); |
| 120 | } else { |
| 121 | /* |
| 122 | * The actual service call failed, but the request was successful on the RPC level |
| 123 | */ |
| 124 | rpc_status = RPC_SUCCESS; |
| 125 | } |
| 126 | |
| 127 | return rpc_status; |
| 128 | } |
| 129 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 130 | static rpc_status_t begin_staging_handler(void *context, struct rpc_request *req) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 131 | { |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 132 | rpc_status_t rpc_status = RPC_ERROR_INTERNAL; |
| 133 | struct rpc_buffer *req_buf = &req->request; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 134 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 135 | uint32_t vendor_flags = 0; |
| 136 | uint32_t partial_update_count = 0; |
| 137 | struct uuid_octets update_guid[FWU_PROVIDER_MAX_PARTIAL_UPDATE_COUNT]; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 138 | |
Imre Kis | 86b1d67 | 2024-07-15 13:15:58 +0200 | [diff] [blame] | 139 | rpc_status = fwu_deserialize_begin_staging_req( |
| 140 | req_buf, &vendor_flags, &partial_update_count, |
| 141 | FWU_PROVIDER_MAX_PARTIAL_UPDATE_COUNT, update_guid); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 142 | |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 143 | if (rpc_status == RPC_SUCCESS) |
| 144 | req->service_status = update_agent_begin_staging( |
| 145 | this_instance->update_agent, vendor_flags, partial_update_count, |
| 146 | update_guid); |
| 147 | |
| 148 | return rpc_status; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 149 | } |
| 150 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 151 | static rpc_status_t end_staging_handler(void *context, struct rpc_request *req) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 152 | { |
| 153 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
| 154 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 155 | req->service_status = update_agent_end_staging(this_instance->update_agent); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 156 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 157 | return RPC_SUCCESS; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 158 | } |
| 159 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 160 | static rpc_status_t cancel_staging_handler(void *context, struct rpc_request *req) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 161 | { |
| 162 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
| 163 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 164 | req->service_status = update_agent_cancel_staging(this_instance->update_agent); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 165 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 166 | return RPC_SUCCESS; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 167 | } |
| 168 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 169 | static rpc_status_t open_handler(void *context, struct rpc_request *req) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 170 | { |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 171 | rpc_status_t rpc_status = RPC_ERROR_INTERNAL; |
| 172 | struct rpc_buffer *req_buf = &req->request; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 173 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 174 | struct uuid_octets image_type_uuid = { 0 }; |
| 175 | uint8_t op_type = 0; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 176 | |
Imre Kis | 86b1d67 | 2024-07-15 13:15:58 +0200 | [diff] [blame] | 177 | rpc_status = fwu_deserialize_open_req(req_buf, &image_type_uuid, &op_type); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 178 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 179 | if (rpc_status == RPC_SUCCESS) { |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 180 | uint32_t handle = 0; |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 181 | req->service_status = |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 182 | update_agent_open(this_instance->update_agent, &image_type_uuid, op_type, |
Imre Kis | efadd3a | 2024-06-28 14:15:57 +0200 | [diff] [blame] | 183 | &handle); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 184 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 185 | if (!req->service_status) { |
| 186 | struct rpc_buffer *resp_buf = &req->response; |
Imre Kis | 86b1d67 | 2024-07-15 13:15:58 +0200 | [diff] [blame] | 187 | rpc_status = fwu_serialize_open_resp(resp_buf, handle); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 188 | } |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 189 | } |
| 190 | |
| 191 | return rpc_status; |
| 192 | } |
| 193 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 194 | static rpc_status_t write_stream_handler(void *context, struct rpc_request *req) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 195 | { |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 196 | rpc_status_t rpc_status = RPC_ERROR_INTERNAL; |
| 197 | struct rpc_buffer *req_buf = &req->request; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 198 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 199 | uint32_t handle = 0; |
| 200 | size_t data_len = 0; |
| 201 | const uint8_t *data = NULL; |
| 202 | |
Imre Kis | 86b1d67 | 2024-07-15 13:15:58 +0200 | [diff] [blame] | 203 | rpc_status = fwu_deserialize_write_stream_req(req_buf, &handle, &data_len, &data); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 204 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 205 | if (rpc_status == RPC_SUCCESS) { |
| 206 | req->service_status = update_agent_write_stream(this_instance->update_agent, handle, |
| 207 | data, data_len); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 208 | } |
| 209 | |
| 210 | return rpc_status; |
| 211 | } |
| 212 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 213 | static rpc_status_t read_stream_handler(void *context, struct rpc_request *req) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 214 | { |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 215 | rpc_status_t rpc_status = RPC_ERROR_INTERNAL; |
| 216 | struct rpc_buffer *req_buf = &req->request; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 217 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 218 | uint32_t handle = 0; |
| 219 | |
Imre Kis | 86b1d67 | 2024-07-15 13:15:58 +0200 | [diff] [blame] | 220 | rpc_status = fwu_deserialize_read_stream_req(req_buf, &handle); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 221 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 222 | if (rpc_status == RPC_SUCCESS) { |
| 223 | struct rpc_buffer *resp_buf = &req->response; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 224 | uint8_t *payload_buf; |
| 225 | size_t max_payload; |
| 226 | size_t read_len = 0; |
| 227 | size_t total_len = 0; |
| 228 | |
Imre Kis | 86b1d67 | 2024-07-15 13:15:58 +0200 | [diff] [blame] | 229 | fwu_read_stream_resp_payload(resp_buf, &payload_buf, &max_payload); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 230 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 231 | req->service_status = update_agent_read_stream(this_instance->update_agent, handle, |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 232 | payload_buf, max_payload, &read_len, |
| 233 | &total_len); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 234 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 235 | if (!req->service_status) |
Imre Kis | 86b1d67 | 2024-07-15 13:15:58 +0200 | [diff] [blame] | 236 | rpc_status = fwu_serialize_read_stream_resp(resp_buf, read_len, total_len); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 237 | |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 238 | } |
| 239 | |
| 240 | return rpc_status; |
| 241 | } |
| 242 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 243 | static rpc_status_t commit_handler(void *context, struct rpc_request *req) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 244 | { |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 245 | rpc_status_t rpc_status = RPC_ERROR_INTERNAL; |
| 246 | struct rpc_buffer *req_buf = &req->request; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 247 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 248 | uint32_t handle = 0; |
| 249 | bool accepted = false; |
| 250 | size_t max_atomic_len = 0; |
| 251 | |
Imre Kis | 86b1d67 | 2024-07-15 13:15:58 +0200 | [diff] [blame] | 252 | rpc_status = fwu_deserialize_commit_req(req_buf, &handle, &accepted, &max_atomic_len); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 253 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 254 | if (rpc_status == RPC_SUCCESS) { |
Imre Kis | efadd3a | 2024-06-28 14:15:57 +0200 | [diff] [blame] | 255 | uint32_t progress = 0; |
| 256 | uint32_t total_work = 0; |
| 257 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 258 | req->service_status = update_agent_commit(this_instance->update_agent, handle, |
Imre Kis | efadd3a | 2024-06-28 14:15:57 +0200 | [diff] [blame] | 259 | accepted, 0, &progress, &total_work); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 260 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 261 | if (!req->service_status) { |
| 262 | struct rpc_buffer *resp_buf = &req->response; |
Imre Kis | 86b1d67 | 2024-07-15 13:15:58 +0200 | [diff] [blame] | 263 | rpc_status = fwu_serialize_commit_resp(resp_buf, progress, total_work); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 264 | } |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 265 | } |
| 266 | |
| 267 | return rpc_status; |
| 268 | } |
| 269 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 270 | static rpc_status_t accept_image_handler(void *context, struct rpc_request *req) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 271 | { |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 272 | rpc_status_t rpc_status = RPC_ERROR_INTERNAL; |
| 273 | struct rpc_buffer *req_buf = &req->request; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 274 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 275 | struct uuid_octets image_type_uuid; |
| 276 | |
Imre Kis | 86b1d67 | 2024-07-15 13:15:58 +0200 | [diff] [blame] | 277 | rpc_status = fwu_deserialize_accept_req(req_buf, &image_type_uuid); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 278 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 279 | if (rpc_status == RPC_SUCCESS) |
Imre Kis | efadd3a | 2024-06-28 14:15:57 +0200 | [diff] [blame] | 280 | req->service_status = update_agent_accept_image(this_instance->update_agent, |
| 281 | &image_type_uuid); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 282 | |
| 283 | return rpc_status; |
| 284 | } |
| 285 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 286 | static rpc_status_t select_previous_handler(void *context, struct rpc_request *req) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 287 | { |
| 288 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
| 289 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 290 | req->service_status = update_agent_select_previous(this_instance->update_agent); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 291 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 292 | return RPC_SUCCESS; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 293 | } |