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