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