blob: e534abe6e057ca96b3863d581b8736de32d0b684 [file] [log] [blame]
Julian Hallf7f84952020-11-23 17:55:51 +01001/*
julhal01c3f4e9a2020-12-15 13:39:01 +00002 * Copyright (c) 2020-2021, Arm Limited and Contributors. All rights reserved.
Julian Hallf7f84952020-11-23 17:55:51 +01003 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7#include "direct_caller.h"
Imre Kis9e466722023-07-04 13:54:34 +02008#include "components/rpc/common/endpoint/rpc_service_interface.h"
9#include "components/rpc/common/interface/rpc_uuid.h"
Julian Hallf7f84952020-11-23 17:55:51 +010010#include <stdlib.h>
11
Imre Kis9e466722023-07-04 13:54:34 +020012struct direct_caller_context {
13 struct rpc_service_interface *service;
14};
Julian Hallf7f84952020-11-23 17:55:51 +010015
Imre Kis9e466722023-07-04 13:54:34 +020016static rpc_status_t find_and_open_session(void *context, const struct rpc_uuid *service_uuid);
Julian Hallf7f84952020-11-23 17:55:51 +010017
Imre Kis9e466722023-07-04 13:54:34 +020018static rpc_status_t open_session(void *context, const struct rpc_uuid *service_uuid,
19 uint16_t endpoint_id)
Julian Hallf7f84952020-11-23 17:55:51 +010020{
Imre Kis9e466722023-07-04 13:54:34 +020021 (void)endpoint_id;
Julian Hallf7f84952020-11-23 17:55:51 +010022
Imre Kis9e466722023-07-04 13:54:34 +020023 return find_and_open_session(context, service_uuid);
Julian Hallf7f84952020-11-23 17:55:51 +010024}
25
Imre Kis9e466722023-07-04 13:54:34 +020026static rpc_status_t find_and_open_session(void *context, const struct rpc_uuid *service_uuid)
Julian Hallf7f84952020-11-23 17:55:51 +010027{
Imre Kis9e466722023-07-04 13:54:34 +020028 struct direct_caller_context *caller = (struct direct_caller_context *)context;
29
30 if (!rpc_uuid_equal(service_uuid, &caller->service->uuid))
31 return RPC_ERROR_NOT_FOUND;
32
33 return RPC_SUCCESS;
Julian Hallf7f84952020-11-23 17:55:51 +010034}
35
Imre Kis9e466722023-07-04 13:54:34 +020036static rpc_status_t close_session(void *context)
Julian Hallf7f84952020-11-23 17:55:51 +010037{
Imre Kis9e466722023-07-04 13:54:34 +020038 return RPC_SUCCESS;
Julian Hallf7f84952020-11-23 17:55:51 +010039}
40
Imre Kis9e466722023-07-04 13:54:34 +020041static rpc_status_t create_shared_memory(void *context, size_t size,
42 struct rpc_caller_shared_memory *shared_memory)
Julian Hallf7f84952020-11-23 17:55:51 +010043{
Imre Kis9e466722023-07-04 13:54:34 +020044 shared_memory->id = 0;
45 shared_memory->buffer = calloc(1, size);
46 shared_memory->size = size;
Julian Hallf7f84952020-11-23 17:55:51 +010047
Imre Kis9e466722023-07-04 13:54:34 +020048 return RPC_SUCCESS;
Julian Hallf7f84952020-11-23 17:55:51 +010049}
50
Imre Kis9e466722023-07-04 13:54:34 +020051static rpc_status_t release_shared_memory(void *context,
52 struct rpc_caller_shared_memory *shared_memory)
Julian Hallf7f84952020-11-23 17:55:51 +010053{
Imre Kis9e466722023-07-04 13:54:34 +020054 free(shared_memory->buffer);
Julian Hallf7f84952020-11-23 17:55:51 +010055
Imre Kis9e466722023-07-04 13:54:34 +020056 return RPC_SUCCESS;
Julian Hallf7f84952020-11-23 17:55:51 +010057}
58
Imre Kis9e466722023-07-04 13:54:34 +020059static rpc_status_t call(void *context, uint16_t opcode,
60 struct rpc_caller_shared_memory *shared_memory, size_t request_length,
61 size_t *response_length, service_status_t *service_status)
Julian Hallf7f84952020-11-23 17:55:51 +010062{
Imre Kis9e466722023-07-04 13:54:34 +020063 struct direct_caller_context *caller = (struct direct_caller_context *)context;
64 struct rpc_request rpc_request = { 0 };
65 rpc_status_t status = RPC_ERROR_INTERNAL;
Julian Hallf7f84952020-11-23 17:55:51 +010066
Imre Kis9e466722023-07-04 13:54:34 +020067 rpc_request.source_id = 0;
68 rpc_request.opcode = opcode;
69 rpc_request.client_id = 0;
70 rpc_request.request.data = shared_memory->buffer;
71 rpc_request.request.data_length = request_length;
72 rpc_request.request.size = shared_memory->size;
73 rpc_request.response.data = shared_memory->buffer;
74 rpc_request.response.data_length = 0;
75 rpc_request.response.size = shared_memory->size;
Julian Hallf7f84952020-11-23 17:55:51 +010076
Imre Kis9e466722023-07-04 13:54:34 +020077 status = rpc_service_receive(caller->service, &rpc_request);
78
79 *response_length = rpc_request.response.data_length;
80 *service_status = rpc_request.service_status;
81
82 return status;
83}
84
85rpc_status_t direct_caller_init(struct rpc_caller_interface *caller,
86 struct rpc_service_interface *service)
87{
88 struct direct_caller_context *context = NULL;
89
90 if (!caller || caller->context)
91 return RPC_ERROR_INVALID_VALUE;
92
93 context = (struct direct_caller_context *)calloc(1, sizeof(struct direct_caller_context));
94 if (!context)
95 return RPC_ERROR_INTERNAL;
96
97 context->service = service;
98
99 caller->context = context;
100 caller->open_session = open_session;
101 caller->find_and_open_session = find_and_open_session;
102 caller->close_session = close_session;
103 caller->create_shared_memory = create_shared_memory;
104 caller->release_shared_memory = release_shared_memory;
105 caller->call = call;
106
107 return RPC_SUCCESS;
108}
109
110rpc_status_t direct_caller_deinit(struct rpc_caller_interface *rpc_caller)
111{
112 if (!rpc_caller || !rpc_caller->context)
113 return RPC_ERROR_INVALID_VALUE;
114
115 free(rpc_caller->context);
116
117 return RPC_SUCCESS;
Julian Hallf7f84952020-11-23 17:55:51 +0100118}