blob: 6d67870ffa73accec66ec3ba393f4869fcdd8de8 [file] [log] [blame]
Imre Kis6fd73d82024-07-04 13:36:10 +02001/*
2 * Copyright (c) 2024, Arm Limited and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include "fwu_provider_shim.h"
Imre Kis7554c472024-07-04 10:09:31 +02008#include "protocols/service/fwu/fwu_proto.h"
Imre Kis6fd73d82024-07-04 13:36:10 +02009#include "util.h"
10
11static rpc_status_t receive(void *context, struct rpc_request *req)
12{
13 struct rpc_service_interface *fwu_rpc_interface = (struct rpc_service_interface *)context;
Imre Kis7554c472024-07-04 10:09:31 +020014 struct fwu_request_header *req_header = NULL;
15 struct fwu_response_header *resp_header = NULL;
Imre Kis6fd73d82024-07-04 13:36:10 +020016 rpc_status_t rpc_status = RPC_ERROR_INTERNAL;
17 struct rpc_request fwu_req = { 0 };
18
19 if (req->request.data_length < sizeof(*req_header))
20 return RPC_ERROR_INVALID_REQUEST_BODY;
21
22 if (req->response.size < sizeof(*resp_header))
23 return RPC_ERROR_INVALID_RESPONSE_BODY;
24
Imre Kis7554c472024-07-04 10:09:31 +020025 req_header = (struct fwu_request_header *)req->request.data;
26 resp_header = (struct fwu_response_header *)req->response.data;
Imre Kis6fd73d82024-07-04 13:36:10 +020027
28 /* Build new RPC request without the request headers */
29 fwu_req = *req;
30 fwu_req.opcode = req_header->func_id & 0xffff;
31 fwu_req.request.data = req_header->payload;
32 fwu_req.request.data_length -= sizeof(*req_header);
33 fwu_req.request.size -= sizeof(*req_header);
34 fwu_req.response.data = resp_header->payload;
35 fwu_req.response.size -= sizeof(*resp_header);
36
37 rpc_status = rpc_service_receive(fwu_rpc_interface, &fwu_req);
38 if (rpc_status != RPC_SUCCESS)
39 return rpc_status;
40
41 /* Insert service status into response buffer */
42 resp_header->status = fwu_req.service_status;
43
44 req->service_status = fwu_req.service_status;
45
46 /* Update response data length */
47 if (ADD_OVERFLOW(fwu_req.response.data_length, sizeof(uint32_t),
48 &req->response.data_length))
49 return RPC_ERROR_INVALID_RESPONSE_BODY;
50
51 if (req->response.data_length > req->response.size)
52 return RPC_ERROR_INVALID_RESPONSE_BODY;
53
54 return rpc_status;
55}
56
57struct rpc_service_interface *
58fwu_provider_shim_init(struct fwu_provider_shim *shim,
59 struct rpc_service_interface *fwu_rpc_interface)
60{
61 shim->shim_rpc_interface.receive = receive;
62 shim->shim_rpc_interface.context = fwu_rpc_interface;
63 shim->shim_rpc_interface.uuid = fwu_rpc_interface->uuid;
64
65 return &shim->shim_rpc_interface;
66}
67
68void fwu_provider_shim_deinit(struct fwu_provider_shim *shim)
69{
70 (void)shim;
71}