1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
|
// SPDX-License-Identifier: BSD-2-Clause
/*
* Copyright (c) 2016-2017, Linaro Limited
*/
#include <pta_socket.h>
#include <string.h>
#include <tee_internal_api.h>
#include <__tee_tcpsocket_defines.h>
#include <__tee_udpsocket_defines.h>
#include "tee_socket_private.h"
static TEE_Result invoke_socket_pta(uint32_t cmd_id, uint32_t param_types,
TEE_Param params[TEE_NUM_PARAMS])
{
static TEE_TASessionHandle sess = TEE_HANDLE_NULL;
static const TEE_UUID socket_uuid = PTA_SOCKET_UUID;
if (sess == TEE_HANDLE_NULL) {
TEE_Result res = TEE_OpenTASession(&socket_uuid,
TEE_TIMEOUT_INFINITE,
0, NULL, &sess, NULL);
if (res != TEE_SUCCESS)
return res;
}
return TEE_InvokeTACommand(sess, TEE_TIMEOUT_INFINITE, cmd_id,
param_types, params, NULL);
}
TEE_Result __tee_socket_pta_open(TEE_ipSocket_ipVersion ip_vers,
const char *addr, uint16_t port,
uint32_t protocol, uint32_t *handle)
{
TEE_Result res;
uint32_t param_types;
TEE_Param params[TEE_NUM_PARAMS];
param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
TEE_PARAM_TYPE_MEMREF_INPUT,
TEE_PARAM_TYPE_VALUE_INPUT,
TEE_PARAM_TYPE_VALUE_OUTPUT);
memset(params, 0, sizeof(params));
switch (ip_vers) {
case TEE_IP_VERSION_DC:
case TEE_IP_VERSION_4:
case TEE_IP_VERSION_6:
params[0].value.a = ip_vers;
break;
default:
return TEE_ERROR_BAD_PARAMETERS;
}
params[0].value.b = port;
if (!addr)
return TEE_ERROR_BAD_PARAMETERS;
params[1].memref.buffer = (void *)addr;
params[1].memref.size = strlen(addr) + 1;
switch (protocol) {
case TEE_ISOCKET_PROTOCOLID_TCP:
case TEE_ISOCKET_PROTOCOLID_UDP:
params[2].value.a = protocol;
break;
default:
return TEE_ERROR_BAD_PARAMETERS;
}
res = invoke_socket_pta(PTA_SOCKET_OPEN, param_types, params);
if (res == TEE_SUCCESS)
*handle = params[3].value.a;
return res;
}
TEE_Result __tee_socket_pta_close(uint32_t handle)
{
uint32_t param_types;
TEE_Param params[TEE_NUM_PARAMS];
param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE,
TEE_PARAM_TYPE_NONE);
memset(params, 0, sizeof(params));
params[0].value.a = handle;
return invoke_socket_pta(PTA_SOCKET_CLOSE, param_types, params);
}
TEE_Result __tee_socket_pta_send(uint32_t handle, const void *buf,
uint32_t *len, uint32_t timeout)
{
TEE_Result res;
uint32_t param_types;
TEE_Param params[TEE_NUM_PARAMS];
param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
TEE_PARAM_TYPE_MEMREF_INPUT,
TEE_PARAM_TYPE_VALUE_OUTPUT,
TEE_PARAM_TYPE_NONE);
memset(params, 0, sizeof(params));
params[0].value.a = handle;
params[0].value.b = timeout;
params[1].memref.buffer = (void *)buf;
params[1].memref.size = *len;
res = invoke_socket_pta(PTA_SOCKET_SEND, param_types, params);
*len = params[2].value.a;
return res;
}
TEE_Result __tee_socket_pta_recv(uint32_t handle, void *buf, uint32_t *len,
uint32_t timeout)
{
TEE_Result res;
uint32_t param_types;
TEE_Param params[TEE_NUM_PARAMS];
param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
TEE_PARAM_TYPE_MEMREF_OUTPUT,
TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE);
memset(params, 0, sizeof(params));
params[0].value.a = handle;
params[0].value.b = timeout;
params[1].memref.buffer = buf;
params[1].memref.size = *len;
res = invoke_socket_pta(PTA_SOCKET_RECV, param_types, params);
*len = params[1].memref.size;
return res;
}
TEE_Result __tee_socket_pta_ioctl(uint32_t handle, uint32_t command, void *buf,
uint32_t *len)
{
TEE_Result res;
uint32_t param_types;
TEE_Param params[TEE_NUM_PARAMS];
param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
TEE_PARAM_TYPE_MEMREF_INOUT,
TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE);
memset(params, 0, sizeof(params));
params[0].value.a = handle;
params[0].value.b = command;
params[1].memref.buffer = buf;
params[1].memref.size = *len;
res = invoke_socket_pta(PTA_SOCKET_IOCTL, param_types, params);
*len = params[1].memref.size;
return res;
}
|