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" |
| 13 | #include "protocols/service/fwu/packed-c/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 | |
| 57 | for (size_t encoding = 0; encoding < TS_RPC_ENCODING_LIMIT; ++encoding) |
| 58 | context->serializers[encoding] = NULL; |
| 59 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 60 | service_provider_init(&context->base_provider, context, &service_uuid, handler_table, |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 61 | sizeof(handler_table) / sizeof(struct service_handler)); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 62 | |
Imre Kis | 6fd73d8 | 2024-07-04 13:36:10 +0200 | [diff] [blame^] | 63 | rpc_interface = service_provider_get_rpc_interface(&context->base_provider); |
| 64 | if (!rpc_interface) |
| 65 | return NULL; |
| 66 | |
| 67 | return fwu_provider_shim_init(&context->shim, rpc_interface); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 68 | } |
| 69 | |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 70 | void fwu_provider_deinit(struct fwu_provider *context) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 71 | { |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 72 | (void)context; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 73 | } |
| 74 | |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 75 | void fwu_provider_register_serializer(struct fwu_provider *context, unsigned int encoding, |
| 76 | const struct fwu_provider_serializer *serializer) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 77 | { |
| 78 | if (encoding < TS_RPC_ENCODING_LIMIT) { |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 79 | context->serializers[encoding] = serializer; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 80 | } |
| 81 | } |
| 82 | |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 83 | static const struct fwu_provider_serializer *get_fwu_serializer(struct fwu_provider *this_instance, |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 84 | const struct rpc_request *req) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 85 | { |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 86 | const struct fwu_provider_serializer *serializer = NULL; |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 87 | unsigned int encoding = 0; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 88 | |
| 89 | if (encoding < TS_RPC_ENCODING_LIMIT) |
| 90 | serializer = this_instance->serializers[encoding]; |
| 91 | |
| 92 | return serializer; |
| 93 | } |
| 94 | |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 95 | static uint16_t generate_function_presence(const struct update_agent *agent, |
| 96 | uint8_t function_presence[FWU_FUNC_ID_COUNT]) |
| 97 | { |
| 98 | uint16_t num_func = 0; |
| 99 | |
| 100 | #define ADD_FUNC_IF_PRESENT(func, id) \ |
| 101 | do { \ |
| 102 | if (agent->interface->func != NULL) \ |
| 103 | function_presence[num_func++] = (id); \ |
| 104 | } while (0) |
| 105 | |
| 106 | ADD_FUNC_IF_PRESENT(discover, FWU_FUNC_ID_DISCOVER); |
| 107 | ADD_FUNC_IF_PRESENT(begin_staging, FWU_FUNC_ID_BEGIN_STAGING); |
| 108 | ADD_FUNC_IF_PRESENT(end_staging, FWU_FUNC_ID_END_STAGING); |
| 109 | ADD_FUNC_IF_PRESENT(cancel_staging, FWU_FUNC_ID_CANCEL_STAGING); |
| 110 | ADD_FUNC_IF_PRESENT(open, FWU_FUNC_ID_OPEN); |
| 111 | ADD_FUNC_IF_PRESENT(write_stream, FWU_FUNC_ID_WRITE_STREAM); |
| 112 | ADD_FUNC_IF_PRESENT(read_stream, FWU_FUNC_ID_READ_STREAM); |
| 113 | ADD_FUNC_IF_PRESENT(commit, FWU_FUNC_ID_COMMIT); |
| 114 | ADD_FUNC_IF_PRESENT(accept_image, FWU_FUNC_ID_ACCEPT_IMAGE); |
| 115 | ADD_FUNC_IF_PRESENT(select_previous, FWU_FUNC_ID_SELECT_PREVIOUS); |
| 116 | |
| 117 | #undef ADD_FUNC_IF_PRESENT |
| 118 | |
| 119 | return num_func; |
| 120 | } |
| 121 | |
| 122 | static rpc_status_t discover_handler(void *context, struct rpc_request *req) |
| 123 | { |
| 124 | rpc_status_t rpc_status = RPC_ERROR_INTERNAL; |
| 125 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
| 126 | const struct fwu_provider_serializer *serializer = get_fwu_serializer(this_instance, req); |
| 127 | struct fwu_discovery_result discovery_result = { 0 }; |
| 128 | struct rpc_buffer *resp_buf = &req->response; |
| 129 | |
| 130 | if (!serializer) |
| 131 | return rpc_status; |
| 132 | |
| 133 | req->service_status = update_agent_discover(this_instance->update_agent, &discovery_result); |
| 134 | |
| 135 | if (!req->service_status) { |
| 136 | uint16_t num_func = 0; |
| 137 | uint8_t function_presence[FWU_FUNC_ID_COUNT] = { 0 }; |
| 138 | |
| 139 | num_func = generate_function_presence(this_instance->update_agent, |
| 140 | function_presence); |
| 141 | |
| 142 | rpc_status = serializer->serialize_discover_resp( |
| 143 | resp_buf, discovery_result.service_status, discovery_result.version_major, |
| 144 | discovery_result.version_minor, num_func, discovery_result.max_payload_size, |
| 145 | discovery_result.flags, discovery_result.vendor_specific_flags, |
| 146 | function_presence); |
| 147 | } else { |
| 148 | /* |
| 149 | * The actual service call failed, but the request was successful on the RPC level |
| 150 | */ |
| 151 | rpc_status = RPC_SUCCESS; |
| 152 | } |
| 153 | |
| 154 | return rpc_status; |
| 155 | } |
| 156 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 157 | 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] | 158 | { |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 159 | rpc_status_t rpc_status = RPC_ERROR_INTERNAL; |
| 160 | struct rpc_buffer *req_buf = &req->request; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 161 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 162 | const struct fwu_provider_serializer *serializer = get_fwu_serializer(this_instance, req); |
| 163 | uint32_t vendor_flags = 0; |
| 164 | uint32_t partial_update_count = 0; |
| 165 | struct uuid_octets update_guid[FWU_PROVIDER_MAX_PARTIAL_UPDATE_COUNT]; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 166 | |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 167 | if (serializer) |
| 168 | rpc_status = serializer->deserialize_begin_staging_req( |
| 169 | req_buf, &vendor_flags, &partial_update_count, |
| 170 | FWU_PROVIDER_MAX_PARTIAL_UPDATE_COUNT, update_guid); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 171 | |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 172 | if (rpc_status == RPC_SUCCESS) |
| 173 | req->service_status = update_agent_begin_staging( |
| 174 | this_instance->update_agent, vendor_flags, partial_update_count, |
| 175 | update_guid); |
| 176 | |
| 177 | return rpc_status; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 178 | } |
| 179 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 180 | 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] | 181 | { |
| 182 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
| 183 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 184 | req->service_status = update_agent_end_staging(this_instance->update_agent); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 185 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 186 | return RPC_SUCCESS; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 187 | } |
| 188 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 189 | 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] | 190 | { |
| 191 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
| 192 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 193 | req->service_status = update_agent_cancel_staging(this_instance->update_agent); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 194 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 195 | return RPC_SUCCESS; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 196 | } |
| 197 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 198 | static rpc_status_t open_handler(void *context, struct rpc_request *req) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 199 | { |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 200 | rpc_status_t rpc_status = RPC_ERROR_INTERNAL; |
| 201 | struct rpc_buffer *req_buf = &req->request; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 202 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
| 203 | const struct fwu_provider_serializer *serializer = get_fwu_serializer(this_instance, req); |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 204 | struct uuid_octets image_type_uuid = { 0 }; |
| 205 | uint8_t op_type = 0; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 206 | |
| 207 | if (serializer) |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 208 | rpc_status = serializer->deserialize_open_req(req_buf, &image_type_uuid, &op_type); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 209 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 210 | if (rpc_status == RPC_SUCCESS) { |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 211 | uint32_t handle = 0; |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 212 | req->service_status = |
Imre Kis | 18b387d | 2024-07-02 13:51:07 +0200 | [diff] [blame] | 213 | update_agent_open(this_instance->update_agent, &image_type_uuid, op_type, |
Imre Kis | efadd3a | 2024-06-28 14:15:57 +0200 | [diff] [blame] | 214 | &handle); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 215 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 216 | if (!req->service_status) { |
| 217 | struct rpc_buffer *resp_buf = &req->response; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 218 | rpc_status = serializer->serialize_open_resp(resp_buf, handle); |
| 219 | } |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 220 | } |
| 221 | |
| 222 | return rpc_status; |
| 223 | } |
| 224 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 225 | 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] | 226 | { |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 227 | rpc_status_t rpc_status = RPC_ERROR_INTERNAL; |
| 228 | struct rpc_buffer *req_buf = &req->request; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 229 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
| 230 | const struct fwu_provider_serializer *serializer = get_fwu_serializer(this_instance, req); |
| 231 | uint32_t handle = 0; |
| 232 | size_t data_len = 0; |
| 233 | const uint8_t *data = NULL; |
| 234 | |
| 235 | if (serializer) |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 236 | rpc_status = serializer->deserialize_write_stream_req(req_buf, &handle, &data_len, |
| 237 | &data); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 238 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 239 | if (rpc_status == RPC_SUCCESS) { |
| 240 | req->service_status = update_agent_write_stream(this_instance->update_agent, handle, |
| 241 | data, data_len); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 242 | } |
| 243 | |
| 244 | return rpc_status; |
| 245 | } |
| 246 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 247 | 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] | 248 | { |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 249 | rpc_status_t rpc_status = RPC_ERROR_INTERNAL; |
| 250 | struct rpc_buffer *req_buf = &req->request; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 251 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
| 252 | const struct fwu_provider_serializer *serializer = get_fwu_serializer(this_instance, req); |
| 253 | uint32_t handle = 0; |
| 254 | |
| 255 | if (serializer) |
| 256 | rpc_status = serializer->deserialize_read_stream_req(req_buf, &handle); |
| 257 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 258 | if (rpc_status == RPC_SUCCESS) { |
| 259 | struct rpc_buffer *resp_buf = &req->response; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 260 | uint8_t *payload_buf; |
| 261 | size_t max_payload; |
| 262 | size_t read_len = 0; |
| 263 | size_t total_len = 0; |
| 264 | |
| 265 | serializer->read_stream_resp_payload(resp_buf, &payload_buf, &max_payload); |
| 266 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 267 | req->service_status = update_agent_read_stream(this_instance->update_agent, handle, |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 268 | payload_buf, max_payload, &read_len, |
| 269 | &total_len); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 270 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 271 | if (!req->service_status) |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 272 | rpc_status = serializer->serialize_read_stream_resp(resp_buf, read_len, |
| 273 | total_len); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 274 | |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 275 | } |
| 276 | |
| 277 | return rpc_status; |
| 278 | } |
| 279 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 280 | static rpc_status_t commit_handler(void *context, struct rpc_request *req) |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 281 | { |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 282 | rpc_status_t rpc_status = RPC_ERROR_INTERNAL; |
| 283 | struct rpc_buffer *req_buf = &req->request; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 284 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
| 285 | const struct fwu_provider_serializer *serializer = get_fwu_serializer(this_instance, req); |
| 286 | uint32_t handle = 0; |
| 287 | bool accepted = false; |
| 288 | size_t max_atomic_len = 0; |
| 289 | |
| 290 | if (serializer) |
Gyorgy Szing | 3c44624 | 2023-03-31 01:53:15 +0200 | [diff] [blame] | 291 | rpc_status = serializer->deserialize_commit_req(req_buf, &handle, &accepted, |
| 292 | &max_atomic_len); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 293 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 294 | if (rpc_status == RPC_SUCCESS) { |
Imre Kis | efadd3a | 2024-06-28 14:15:57 +0200 | [diff] [blame] | 295 | uint32_t progress = 0; |
| 296 | uint32_t total_work = 0; |
| 297 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 298 | req->service_status = update_agent_commit(this_instance->update_agent, handle, |
Imre Kis | efadd3a | 2024-06-28 14:15:57 +0200 | [diff] [blame] | 299 | accepted, 0, &progress, &total_work); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 300 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 301 | if (!req->service_status) { |
| 302 | struct rpc_buffer *resp_buf = &req->response; |
Imre Kis | efadd3a | 2024-06-28 14:15:57 +0200 | [diff] [blame] | 303 | rpc_status = serializer->serialize_commit_resp(resp_buf, progress, total_work); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 304 | } |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 305 | } |
| 306 | |
| 307 | return rpc_status; |
| 308 | } |
| 309 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 310 | 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] | 311 | { |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 312 | rpc_status_t rpc_status = RPC_ERROR_INTERNAL; |
| 313 | struct rpc_buffer *req_buf = &req->request; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 314 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
| 315 | const struct fwu_provider_serializer *serializer = get_fwu_serializer(this_instance, req); |
| 316 | struct uuid_octets image_type_uuid; |
| 317 | |
| 318 | if (serializer) |
| 319 | rpc_status = serializer->deserialize_accept_req(req_buf, &image_type_uuid); |
| 320 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 321 | if (rpc_status == RPC_SUCCESS) |
Imre Kis | efadd3a | 2024-06-28 14:15:57 +0200 | [diff] [blame] | 322 | req->service_status = update_agent_accept_image(this_instance->update_agent, |
| 323 | &image_type_uuid); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 324 | |
| 325 | return rpc_status; |
| 326 | } |
| 327 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 328 | 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] | 329 | { |
| 330 | struct fwu_provider *this_instance = (struct fwu_provider *)context; |
| 331 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 332 | req->service_status = update_agent_select_previous(this_instance->update_agent); |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 333 | |
Imre Kis | e584a98 | 2023-07-04 17:59:18 +0200 | [diff] [blame] | 334 | return RPC_SUCCESS; |
Julian Hall | 32798ff | 2022-12-19 13:33:42 +0000 | [diff] [blame] | 335 | } |