/* * Copyright (c) 2023, Arm Limited and Contributors. All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #ifndef RPC_CALLER_SESSION_H #define RPC_CALLER_SESSION_H #include "rpc_caller.h" #include "rpc_status.h" #include "rpc_uuid.h" #include #include #include #ifdef __cplusplus extern "C" { #endif typedef void *rpc_call_handle; enum rpc_caller_memory_policy { alloc_for_each_call = 0, alloc_for_session, }; /** * @brief RPC caller session * * Builds a session on top of the rpc_caller_interface. It provides high level functions for service * caller implementations and for prior service discovery. */ struct rpc_caller_session { /** Caller interface */ struct rpc_caller_interface *caller; /** Shared memory instance for the exchanging of RPC request and response parameters. */ struct rpc_caller_shared_memory shared_memory; /** Controls how and when the shared memory is allocated for the RPC calls. */ enum rpc_caller_memory_policy shared_memory_policy; /** * Indicates if a call transaction has been started by the begin function but was not * finished yet (i.e. end was not called). */ bool is_call_transaction_in_progress; /** * Stores the request length of the current transaction. Its value is set by the begin * function and then used in the invoke step. */ size_t request_length; }; /** * @brief * * @param session * @param caller * @param service_uuid * @param endpoint_id * @param shared_memory_size * @return RPC_CALLER_EXPORTED */ RPC_CALLER_EXPORTED rpc_status_t rpc_caller_session_open(struct rpc_caller_session *session, struct rpc_caller_interface *caller, const struct rpc_uuid *service_uuid, uint16_t endpoint_id, size_t shared_memory_size); /** * @brief * * @param session * @param caller * @param service_uuid * @param shared_memory_size * @return RPC_CALLER_EXPORTED */ RPC_CALLER_EXPORTED rpc_status_t rpc_caller_session_find_and_open(struct rpc_caller_session *session, struct rpc_caller_interface *caller, const struct rpc_uuid *service_uuid, size_t shared_memory_size); /** * @brief Closes the RPC caller session * * @param session Caller session instance * @return RPC_CALLER_EXPORTED */ RPC_CALLER_EXPORTED rpc_status_t rpc_caller_session_close(struct rpc_caller_session *session); /** * @brief Begins an RPC call * * The function returns a buffer where the service caller can build the request. * * @param session Caller session instance * @param request_buffer Pointer of the request buffer * @param request_length Request length * @param response_max_length Expected maximal length of the response * @return rpc_call_handle Handle of the started call */ RPC_CALLER_EXPORTED rpc_call_handle rpc_caller_session_begin(struct rpc_caller_session *session, uint8_t **request_buffer, size_t request_length, size_t response_max_length); /** * @brief Invoke phase of the RPC call * * Invokes the call on the remote side and returns the response buffer and service status. The * service caller can parse the response from the response buffer. * After this call the request buffer is not available for the service caller. * * @param handle RPC call handle * @param opcode The opcode of the remote function * @param response_buffer Pointer of the response buffer * @param response_length Length of the response buffer * @param service_status Service specific status code * @return RPC_CALLER_EXPORTED */ RPC_CALLER_EXPORTED rpc_status_t rpc_caller_session_invoke(rpc_call_handle handle, uint32_t opcode, uint8_t **response_buffer, size_t *response_length, service_status_t *service_status); /** * @brief Ends the RPC call * * Indicates if the response has been parsed by the service calls and the RPC session can free the * response buffer. * * @param handle RPC call handle * @return RPC_CALLER_EXPORTED */ RPC_CALLER_EXPORTED rpc_status_t rpc_caller_session_end(rpc_call_handle handle); #ifdef __cplusplus } #endif #endif /* RPC_CALLER_SESSION_H */