| /* |
| * Copyright (C) 2015 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #pragma once |
| |
| #include <stdio.h> |
| |
| #include <lk/list.h> |
| #include <trusty_ipc.h> |
| #include <uapi/trusty_uuid.h> |
| |
| struct ipc_context; |
| struct ipc_port_context; |
| struct ipc_channel_context; |
| |
| /** |
| * ipc_connect_handler_t - handler for connect events |
| * @parent: the parent port context of the channel to be created |
| * @peer_uuid: the UUID of the connecting peer |
| * @chan_handle: the handle for the connecting channel |
| * |
| * Returns a reference to an ipc_channel_context with its channel |
| * operations initialized. |
| */ |
| typedef struct ipc_channel_context* (*ipc_connect_handler_t)( |
| struct ipc_port_context* parent, |
| const uuid_t* peer_uuid, |
| handle_t chan_handle); |
| |
| /** |
| * ipc_msg_handler_t - handler for msg events |
| * @context: the channel context returned from ipc_connect_handler_t |
| * @msg: the received msg buffer |
| * @msg_size: the received msg buffer size |
| * |
| * Returns NO_ERROR on success, error code < 0 on failure. |
| * In case of error, the channel is disconnected. |
| */ |
| typedef int (*ipc_msg_handler_t)(struct ipc_channel_context* context, |
| void* msg, |
| size_t msg_size); |
| |
| /** |
| * ipc_disconnect_handler_t - handler for disconnect events |
| * @context: the context to be freed |
| * |
| * This function must not close the channel handle. |
| */ |
| typedef void (*ipc_disconnect_handler_t)(struct ipc_channel_context* context); |
| |
| typedef void (*ipc_evt_handler_t)(struct ipc_context* context, |
| const struct uevent* ev); |
| |
| /** |
| * ipc_port_ops |
| * @on_connect: required connect handler |
| */ |
| struct ipc_port_ops { |
| ipc_connect_handler_t on_connect; |
| }; |
| |
| /** |
| * ipc_channel_ops |
| * @on_handle_msg: optional msg handler |
| * @on_disconnect: required disconnect handler |
| */ |
| struct ipc_channel_ops { |
| ipc_msg_handler_t on_handle_msg; |
| ipc_disconnect_handler_t on_disconnect; |
| }; |
| |
| struct ipc_context { |
| ipc_evt_handler_t evt_handler; |
| handle_t handle; |
| }; |
| |
| struct ipc_channel_context { |
| struct ipc_context common; |
| struct ipc_channel_ops ops; |
| struct list_node node; |
| }; |
| |
| struct ipc_port_context { |
| struct ipc_context common; |
| struct ipc_port_ops ops; |
| struct list_node channels; |
| }; |
| |
| /** |
| * sync_ipc_send_msg - send IPC message |
| * @session: the session handle |
| * @tx_iovecs: the buffers to send |
| * @tx_iovec_count: the count of buffers to send |
| * @rx_iovecs: the buffers to receive |
| * @rx_iovec_count: the count of buffers to receive |
| */ |
| int sync_ipc_send_msg(handle_t session, |
| struct iovec* tx_iovecs, |
| unsigned int tx_iovec_count, |
| struct iovec* rx_iovecs, |
| unsigned int rx_iovec_count); |
| |
| int ipc_port_create(struct ipc_port_context* contextp, |
| const char* port_name, |
| size_t queue_size, |
| size_t max_buffer_size, |
| uint32_t flags); |
| int ipc_port_destroy(struct ipc_port_context* context); |
| void ipc_loop(void); |