blob: c7f1f01fb4ef6c69822bb77d2a463a9f6c87b21d [file] [log] [blame]
Julian Hallf7f84952020-11-23 17:55:51 +01001/*
Julian Hall6e02acf2022-02-22 16:25:03 +00002 * Copyright (c) 2020-2022, 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 "dummy_caller.h"
8#include <stdlib.h>
9
Imre Kise4367bb2023-07-04 13:55:14 +020010struct dummy_caller_context {
11 rpc_status_t rpc_status;
12 service_status_t service_status;
13 uint8_t *req_buf;
14};
Julian Hallf7f84952020-11-23 17:55:51 +010015
Imre Kise4367bb2023-07-04 13:55:14 +020016rpc_status_t open_session(void *context, const struct rpc_uuid *service_uuid, uint16_t endpoint_id)
Julian Hallf7f84952020-11-23 17:55:51 +010017{
Imre Kise4367bb2023-07-04 13:55:14 +020018 (void)context;
19 (void)service_uuid;
20 (void)endpoint_id;
Julian Hallf7f84952020-11-23 17:55:51 +010021
Imre Kise4367bb2023-07-04 13:55:14 +020022 return RPC_SUCCESS;
Julian Hallf7f84952020-11-23 17:55:51 +010023}
24
Imre Kise4367bb2023-07-04 13:55:14 +020025rpc_status_t find_and_open_session(void *context, const struct rpc_uuid *service_uuid)
Julian Hallf7f84952020-11-23 17:55:51 +010026{
Imre Kise4367bb2023-07-04 13:55:14 +020027 (void)context;
28 (void)service_uuid;
29
30 return RPC_SUCCESS;
Julian Hallf7f84952020-11-23 17:55:51 +010031}
32
Imre Kise4367bb2023-07-04 13:55:14 +020033static rpc_status_t close_session(void *context)
Julian Hallf7f84952020-11-23 17:55:51 +010034{
Imre Kise4367bb2023-07-04 13:55:14 +020035 struct dummy_caller_context *caller_context = (struct dummy_caller_context *)context;
Julian Hallf7f84952020-11-23 17:55:51 +010036
Imre Kise4367bb2023-07-04 13:55:14 +020037 free(caller_context->req_buf);
Julian Hallf7f84952020-11-23 17:55:51 +010038
Imre Kise4367bb2023-07-04 13:55:14 +020039 return RPC_SUCCESS;
Julian Hallf7f84952020-11-23 17:55:51 +010040}
41
Imre Kise4367bb2023-07-04 13:55:14 +020042static rpc_status_t create_shared_memory(void *context, size_t size,
43 struct rpc_caller_shared_memory *shared_memory)
Julian Hallf7f84952020-11-23 17:55:51 +010044{
Imre Kise4367bb2023-07-04 13:55:14 +020045 struct dummy_caller_context *caller_context = (struct dummy_caller_context *)context;
Julian Hall6e02acf2022-02-22 16:25:03 +000046
Imre Kise4367bb2023-07-04 13:55:14 +020047 if (caller_context->req_buf)
48 return RPC_ERROR_INVALID_STATE;
Julian Hallf7f84952020-11-23 17:55:51 +010049
Imre Kise4367bb2023-07-04 13:55:14 +020050 caller_context->req_buf = calloc(1, size);
Julian Hallf7f84952020-11-23 17:55:51 +010051
Imre Kise4367bb2023-07-04 13:55:14 +020052 shared_memory->id = 0;
53 shared_memory->buffer = caller_context->req_buf;
54 shared_memory->size = size;
Julian Hallf7f84952020-11-23 17:55:51 +010055
Imre Kise4367bb2023-07-04 13:55:14 +020056 return RPC_SUCCESS;
Julian Hallf7f84952020-11-23 17:55:51 +010057}
58
Imre Kise4367bb2023-07-04 13:55:14 +020059static rpc_status_t release_shared_memory(void *context,
60 struct rpc_caller_shared_memory *shared_memory)
Julian Hallf7f84952020-11-23 17:55:51 +010061{
Imre Kise4367bb2023-07-04 13:55:14 +020062 struct dummy_caller_context *caller_context = (struct dummy_caller_context *)context;
63
64 if (shared_memory->buffer != caller_context->req_buf)
65 return RPC_ERROR_INVALID_VALUE;
66
67 if (!caller_context->req_buf)
68 return RPC_ERROR_INVALID_STATE;
69
70 free(caller_context->req_buf);
71 caller_context->req_buf = NULL;
72
73 return RPC_ERROR_INTERNAL;
Julian Hallf7f84952020-11-23 17:55:51 +010074}
Imre Kise4367bb2023-07-04 13:55:14 +020075
76static rpc_status_t call(void *context, uint16_t opcode,
77 struct rpc_caller_shared_memory *shared_memory, size_t request_length,
78 size_t *response_length, service_status_t *service_status)
79{
80 struct dummy_caller_context *caller_context = (struct dummy_caller_context *)context;
81
82 (void)opcode;
83 (void)shared_memory;
84 (void)request_length;
85
86 *response_length = 0;
87 *service_status = caller_context->rpc_status;
88
89 return caller_context->rpc_status;
90}
91
92rpc_status_t dummy_caller_init(struct rpc_caller_interface *rpc_caller, rpc_status_t rpc_status,
93 service_status_t service_status)
94{
95 struct dummy_caller_context *context = NULL;
96
97 if (!rpc_caller || rpc_caller->context)
98 return RPC_ERROR_INVALID_VALUE;
99
100 context = (struct dummy_caller_context *)calloc(1, sizeof(struct dummy_caller_context));
101 if (!context)
102 return RPC_ERROR_INTERNAL;
103
104 context->rpc_status = rpc_status;
105 context->service_status = service_status;
106 context->req_buf = NULL;
107
108 rpc_caller->context = context;
109 rpc_caller->open_session = open_session;
110 rpc_caller->find_and_open_session = find_and_open_session;
111 rpc_caller->close_session = close_session;
112 rpc_caller->create_shared_memory = create_shared_memory;
113 rpc_caller->release_shared_memory = release_shared_memory;
114 rpc_caller->call = call;
115
116 return RPC_SUCCESS;
117}
118
119rpc_status_t dummy_caller_deinit(struct rpc_caller_interface *rpc_caller)
120{
121 if (!rpc_caller || !rpc_caller->context)
122 return RPC_ERROR_INVALID_VALUE;
123
124 free(rpc_caller->context);
125
126 return RPC_SUCCESS;
127}