blob: bb09d87abcf58d166e97364e327577fda69a6d28 [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
Balint Dobszay14c6f0d2024-01-16 15:35:25 +010012#define DIRECT_CALLER_BASE_DEFAULT_ID (0x1000)
13
Imre Kis9e466722023-07-04 13:54:34 +020014struct direct_caller_context {
15 struct rpc_service_interface *service;
Balint Dobszay14c6f0d2024-01-16 15:35:25 +010016 uint16_t endpoint_id;
Imre Kis9e466722023-07-04 13:54:34 +020017};
Julian Hallf7f84952020-11-23 17:55:51 +010018
Imre Kis9e466722023-07-04 13:54:34 +020019static rpc_status_t find_and_open_session(void *context, const struct rpc_uuid *service_uuid);
Julian Hallf7f84952020-11-23 17:55:51 +010020
Balint Dobszay14c6f0d2024-01-16 15:35:25 +010021static uint16_t allocate_caller_endpoint_id(void)
22{
23 /*
24 * By default, each caller is assigned a unique ID to represent
25 * callers operating from different security domains. This may be
26 * overridden after initialization if necessary.
27 */
28 static uint32_t next_caller_id = DIRECT_CALLER_BASE_DEFAULT_ID;
29 uint32_t assigned_id = next_caller_id++;
30 return assigned_id;
31}
32
Imre Kis9e466722023-07-04 13:54:34 +020033static rpc_status_t open_session(void *context, const struct rpc_uuid *service_uuid,
34 uint16_t endpoint_id)
Julian Hallf7f84952020-11-23 17:55:51 +010035{
Imre Kis9e466722023-07-04 13:54:34 +020036 (void)endpoint_id;
Julian Hallf7f84952020-11-23 17:55:51 +010037
Imre Kis9e466722023-07-04 13:54:34 +020038 return find_and_open_session(context, service_uuid);
Julian Hallf7f84952020-11-23 17:55:51 +010039}
40
Imre Kis9e466722023-07-04 13:54:34 +020041static rpc_status_t find_and_open_session(void *context, const struct rpc_uuid *service_uuid)
Julian Hallf7f84952020-11-23 17:55:51 +010042{
Imre Kis9e466722023-07-04 13:54:34 +020043 struct direct_caller_context *caller = (struct direct_caller_context *)context;
44
45 if (!rpc_uuid_equal(service_uuid, &caller->service->uuid))
46 return RPC_ERROR_NOT_FOUND;
47
48 return RPC_SUCCESS;
Julian Hallf7f84952020-11-23 17:55:51 +010049}
50
Imre Kis9e466722023-07-04 13:54:34 +020051static rpc_status_t close_session(void *context)
Julian Hallf7f84952020-11-23 17:55:51 +010052{
Imre Kis9e466722023-07-04 13:54:34 +020053 return RPC_SUCCESS;
Julian Hallf7f84952020-11-23 17:55:51 +010054}
55
Imre Kis9e466722023-07-04 13:54:34 +020056static rpc_status_t create_shared_memory(void *context, size_t size,
57 struct rpc_caller_shared_memory *shared_memory)
Julian Hallf7f84952020-11-23 17:55:51 +010058{
Imre Kis9e466722023-07-04 13:54:34 +020059 shared_memory->id = 0;
60 shared_memory->buffer = calloc(1, size);
61 shared_memory->size = size;
Julian Hallf7f84952020-11-23 17:55:51 +010062
Imre Kis9e466722023-07-04 13:54:34 +020063 return RPC_SUCCESS;
Julian Hallf7f84952020-11-23 17:55:51 +010064}
65
Imre Kis9e466722023-07-04 13:54:34 +020066static rpc_status_t release_shared_memory(void *context,
67 struct rpc_caller_shared_memory *shared_memory)
Julian Hallf7f84952020-11-23 17:55:51 +010068{
Imre Kis9e466722023-07-04 13:54:34 +020069 free(shared_memory->buffer);
Julian Hallf7f84952020-11-23 17:55:51 +010070
Imre Kis9e466722023-07-04 13:54:34 +020071 return RPC_SUCCESS;
Julian Hallf7f84952020-11-23 17:55:51 +010072}
73
Imre Kis9e466722023-07-04 13:54:34 +020074static rpc_status_t call(void *context, uint16_t opcode,
75 struct rpc_caller_shared_memory *shared_memory, size_t request_length,
76 size_t *response_length, service_status_t *service_status)
Julian Hallf7f84952020-11-23 17:55:51 +010077{
Imre Kis9e466722023-07-04 13:54:34 +020078 struct direct_caller_context *caller = (struct direct_caller_context *)context;
79 struct rpc_request rpc_request = { 0 };
80 rpc_status_t status = RPC_ERROR_INTERNAL;
Julian Hallf7f84952020-11-23 17:55:51 +010081
Balint Dobszay14c6f0d2024-01-16 15:35:25 +010082 rpc_request.source_id = caller->endpoint_id;
Imre Kis9e466722023-07-04 13:54:34 +020083 rpc_request.opcode = opcode;
84 rpc_request.client_id = 0;
85 rpc_request.request.data = shared_memory->buffer;
86 rpc_request.request.data_length = request_length;
87 rpc_request.request.size = shared_memory->size;
88 rpc_request.response.data = shared_memory->buffer;
89 rpc_request.response.data_length = 0;
90 rpc_request.response.size = shared_memory->size;
Julian Hallf7f84952020-11-23 17:55:51 +010091
Imre Kis9e466722023-07-04 13:54:34 +020092 status = rpc_service_receive(caller->service, &rpc_request);
93
94 *response_length = rpc_request.response.data_length;
95 *service_status = rpc_request.service_status;
96
97 return status;
98}
99
100rpc_status_t direct_caller_init(struct rpc_caller_interface *caller,
101 struct rpc_service_interface *service)
102{
103 struct direct_caller_context *context = NULL;
104
105 if (!caller || caller->context)
106 return RPC_ERROR_INVALID_VALUE;
107
108 context = (struct direct_caller_context *)calloc(1, sizeof(struct direct_caller_context));
109 if (!context)
110 return RPC_ERROR_INTERNAL;
111
112 context->service = service;
Balint Dobszay14c6f0d2024-01-16 15:35:25 +0100113 context->endpoint_id = allocate_caller_endpoint_id();
Imre Kis9e466722023-07-04 13:54:34 +0200114
115 caller->context = context;
116 caller->open_session = open_session;
117 caller->find_and_open_session = find_and_open_session;
118 caller->close_session = close_session;
119 caller->create_shared_memory = create_shared_memory;
120 caller->release_shared_memory = release_shared_memory;
121 caller->call = call;
122
123 return RPC_SUCCESS;
124}
125
126rpc_status_t direct_caller_deinit(struct rpc_caller_interface *rpc_caller)
127{
128 if (!rpc_caller || !rpc_caller->context)
129 return RPC_ERROR_INVALID_VALUE;
130
131 free(rpc_caller->context);
132
133 return RPC_SUCCESS;
Julian Hallf7f84952020-11-23 17:55:51 +0100134}