xref: /optee_os/lib/libutee/tee_socket_pta.c (revision 1bb929836182ecb96d2d9d268daa807c67596396)
1*1bb92983SJerome Forissier // SPDX-License-Identifier: BSD-2-Clause
2a32a96edSJens Wiklander /*
3a32a96edSJens Wiklander  * Copyright (c) 2016-2017, Linaro Limited
4a32a96edSJens Wiklander  * All rights reserved.
5a32a96edSJens Wiklander  *
6a32a96edSJens Wiklander  * Redistribution and use in source and binary forms, with or without
7a32a96edSJens Wiklander  * modification, are permitted provided that the following conditions are met:
8a32a96edSJens Wiklander  *
9a32a96edSJens Wiklander  * 1. Redistributions of source code must retain the above copyright notice,
10a32a96edSJens Wiklander  * this list of conditions and the following disclaimer.
11a32a96edSJens Wiklander  *
12a32a96edSJens Wiklander  * 2. Redistributions in binary form must reproduce the above copyright notice,
13a32a96edSJens Wiklander  * this list of conditions and the following disclaimer in the documentation
14a32a96edSJens Wiklander  * and/or other materials provided with the distribution.
15a32a96edSJens Wiklander  *
16a32a96edSJens Wiklander  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17a32a96edSJens Wiklander  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18a32a96edSJens Wiklander  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19a32a96edSJens Wiklander  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20a32a96edSJens Wiklander  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21a32a96edSJens Wiklander  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22a32a96edSJens Wiklander  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23a32a96edSJens Wiklander  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24a32a96edSJens Wiklander  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25a32a96edSJens Wiklander  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26a32a96edSJens Wiklander  * POSSIBILITY OF SUCH DAMAGE.
27a32a96edSJens Wiklander  */
28a32a96edSJens Wiklander 
29a32a96edSJens Wiklander #include <pta_socket.h>
30a32a96edSJens Wiklander #include <string.h>
31a32a96edSJens Wiklander #include <tee_internal_api.h>
32a32a96edSJens Wiklander #include <__tee_tcpsocket_defines.h>
33a32a96edSJens Wiklander #include <__tee_udpsocket_defines.h>
34a32a96edSJens Wiklander 
35a32a96edSJens Wiklander #include "tee_socket_private.h"
36a32a96edSJens Wiklander 
37a32a96edSJens Wiklander static TEE_Result invoke_socket_pta(uint32_t cmd_id, uint32_t param_types,
38a32a96edSJens Wiklander 				    TEE_Param params[TEE_NUM_PARAMS])
39a32a96edSJens Wiklander {
40a32a96edSJens Wiklander 	static TEE_TASessionHandle sess = TEE_HANDLE_NULL;
41a32a96edSJens Wiklander 	static const TEE_UUID socket_uuid = PTA_SOCKET_UUID;
42a32a96edSJens Wiklander 
43a32a96edSJens Wiklander 	if (sess == TEE_HANDLE_NULL) {
44a32a96edSJens Wiklander 		TEE_Result res = TEE_OpenTASession(&socket_uuid, 0, 0, NULL,
45a32a96edSJens Wiklander 						   &sess, NULL);
46a32a96edSJens Wiklander 
47a32a96edSJens Wiklander 		if (res != TEE_SUCCESS)
48a32a96edSJens Wiklander 			return res;
49a32a96edSJens Wiklander 	}
50a32a96edSJens Wiklander 
51a32a96edSJens Wiklander 	return TEE_InvokeTACommand(sess, 0, cmd_id, param_types, params, NULL);
52a32a96edSJens Wiklander }
53a32a96edSJens Wiklander 
54a32a96edSJens Wiklander TEE_Result __tee_socket_pta_open(TEE_ipSocket_ipVersion ip_vers,
55a32a96edSJens Wiklander 				 const char *addr, uint16_t port,
56a32a96edSJens Wiklander 				 uint32_t protocol, uint32_t *handle)
57a32a96edSJens Wiklander {
58a32a96edSJens Wiklander 	TEE_Result res;
59a32a96edSJens Wiklander 	uint32_t param_types;
60a32a96edSJens Wiklander 	TEE_Param params[TEE_NUM_PARAMS];
61a32a96edSJens Wiklander 
62a32a96edSJens Wiklander 	param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
63a32a96edSJens Wiklander 				      TEE_PARAM_TYPE_MEMREF_INPUT,
64a32a96edSJens Wiklander 				      TEE_PARAM_TYPE_VALUE_INPUT,
65a32a96edSJens Wiklander 				      TEE_PARAM_TYPE_VALUE_OUTPUT);
66a32a96edSJens Wiklander 	memset(params, 0, sizeof(params));
67a32a96edSJens Wiklander 
68a32a96edSJens Wiklander 	switch (ip_vers) {
69a32a96edSJens Wiklander 	case TEE_IP_VERSION_DC:
70a32a96edSJens Wiklander 	case TEE_IP_VERSION_4:
71a32a96edSJens Wiklander 	case TEE_IP_VERSION_6:
72a32a96edSJens Wiklander 		params[0].value.a = ip_vers;
73a32a96edSJens Wiklander 		break;
74a32a96edSJens Wiklander 	default:
75a32a96edSJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
76a32a96edSJens Wiklander 	}
77a32a96edSJens Wiklander 
78a32a96edSJens Wiklander 	params[0].value.b = port;
79a32a96edSJens Wiklander 
80a32a96edSJens Wiklander 	if (!addr)
81a32a96edSJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
82a32a96edSJens Wiklander 	params[1].memref.buffer = (void *)addr;
83a32a96edSJens Wiklander 	params[1].memref.size = strlen(addr) + 1;
84a32a96edSJens Wiklander 
85a32a96edSJens Wiklander 	switch (protocol) {
86a32a96edSJens Wiklander 	case TEE_ISOCKET_PROTOCOLID_TCP:
87a32a96edSJens Wiklander 	case TEE_ISOCKET_PROTOCOLID_UDP:
88a32a96edSJens Wiklander 		params[2].value.a = protocol;
89a32a96edSJens Wiklander 		break;
90a32a96edSJens Wiklander 	default:
91a32a96edSJens Wiklander 		return TEE_ERROR_BAD_PARAMETERS;
92a32a96edSJens Wiklander 	}
93a32a96edSJens Wiklander 
94a32a96edSJens Wiklander 	res = invoke_socket_pta(PTA_SOCKET_OPEN, param_types, params);
95a32a96edSJens Wiklander 	if (res == TEE_SUCCESS)
96a32a96edSJens Wiklander 		*handle = params[3].value.a;
97a32a96edSJens Wiklander 	return res;
98a32a96edSJens Wiklander }
99a32a96edSJens Wiklander 
100a32a96edSJens Wiklander TEE_Result __tee_socket_pta_close(uint32_t handle)
101a32a96edSJens Wiklander {
102a32a96edSJens Wiklander 	uint32_t param_types;
103a32a96edSJens Wiklander 	TEE_Param params[TEE_NUM_PARAMS];
104a32a96edSJens Wiklander 
105a32a96edSJens Wiklander 	param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
106a32a96edSJens Wiklander 				      TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE,
107a32a96edSJens Wiklander 				      TEE_PARAM_TYPE_NONE);
108a32a96edSJens Wiklander 	memset(params, 0, sizeof(params));
109a32a96edSJens Wiklander 
110a32a96edSJens Wiklander 	params[0].value.a = handle;
111a32a96edSJens Wiklander 	return invoke_socket_pta(PTA_SOCKET_CLOSE, param_types, params);
112a32a96edSJens Wiklander }
113a32a96edSJens Wiklander 
114a32a96edSJens Wiklander TEE_Result __tee_socket_pta_send(uint32_t handle, const void *buf,
115a32a96edSJens Wiklander 				 uint32_t *len, uint32_t timeout)
116a32a96edSJens Wiklander {
117a32a96edSJens Wiklander 	TEE_Result res;
118a32a96edSJens Wiklander 	uint32_t param_types;
119a32a96edSJens Wiklander 	TEE_Param params[TEE_NUM_PARAMS];
120a32a96edSJens Wiklander 
121a32a96edSJens Wiklander 	param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
122a32a96edSJens Wiklander 				      TEE_PARAM_TYPE_MEMREF_INPUT,
123a32a96edSJens Wiklander 				      TEE_PARAM_TYPE_VALUE_OUTPUT,
124a32a96edSJens Wiklander 				      TEE_PARAM_TYPE_NONE);
125a32a96edSJens Wiklander 	memset(params, 0, sizeof(params));
126a32a96edSJens Wiklander 
127a32a96edSJens Wiklander 	params[0].value.a = handle;
128a32a96edSJens Wiklander 	params[0].value.b = timeout;
129a32a96edSJens Wiklander 
130a32a96edSJens Wiklander 	params[1].memref.buffer = (void *)buf;
131a32a96edSJens Wiklander 	params[1].memref.size = *len;
132a32a96edSJens Wiklander 
133a32a96edSJens Wiklander 	res = invoke_socket_pta(PTA_SOCKET_SEND, param_types, params);
134a32a96edSJens Wiklander 	*len = params[2].value.a;
135a32a96edSJens Wiklander 	return res;
136a32a96edSJens Wiklander }
137a32a96edSJens Wiklander 
138a32a96edSJens Wiklander TEE_Result __tee_socket_pta_recv(uint32_t handle, void *buf, uint32_t *len,
139a32a96edSJens Wiklander 				 uint32_t timeout)
140a32a96edSJens Wiklander 
141a32a96edSJens Wiklander {
142a32a96edSJens Wiklander 	TEE_Result res;
143a32a96edSJens Wiklander 	uint32_t param_types;
144a32a96edSJens Wiklander 	TEE_Param params[TEE_NUM_PARAMS];
145a32a96edSJens Wiklander 
146a32a96edSJens Wiklander 	param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
147a32a96edSJens Wiklander 				      TEE_PARAM_TYPE_MEMREF_OUTPUT,
148a32a96edSJens Wiklander 				      TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE);
149a32a96edSJens Wiklander 	memset(params, 0, sizeof(params));
150a32a96edSJens Wiklander 
151a32a96edSJens Wiklander 	params[0].value.a = handle;
152a32a96edSJens Wiklander 	params[0].value.b = timeout;
153a32a96edSJens Wiklander 
154a32a96edSJens Wiklander 	params[1].memref.buffer = buf;
155a32a96edSJens Wiklander 	params[1].memref.size = *len;
156a32a96edSJens Wiklander 
157a32a96edSJens Wiklander 	res = invoke_socket_pta(PTA_SOCKET_RECV, param_types, params);
158a32a96edSJens Wiklander 	*len =  params[1].memref.size;
159a32a96edSJens Wiklander 	return res;
160a32a96edSJens Wiklander }
161a32a96edSJens Wiklander 
162a32a96edSJens Wiklander TEE_Result __tee_socket_pta_ioctl(uint32_t handle, uint32_t command, void *buf,
163a32a96edSJens Wiklander 				  uint32_t *len)
164a32a96edSJens Wiklander {
165a32a96edSJens Wiklander 	TEE_Result res;
166a32a96edSJens Wiklander 	uint32_t param_types;
167a32a96edSJens Wiklander 	TEE_Param params[TEE_NUM_PARAMS];
168a32a96edSJens Wiklander 
169a32a96edSJens Wiklander 	param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INPUT,
170a32a96edSJens Wiklander 				      TEE_PARAM_TYPE_MEMREF_INOUT,
171a32a96edSJens Wiklander 				      TEE_PARAM_TYPE_NONE, TEE_PARAM_TYPE_NONE);
172a32a96edSJens Wiklander 	memset(params, 0, sizeof(params));
173a32a96edSJens Wiklander 
174a32a96edSJens Wiklander 	params[0].value.a = handle;
175a32a96edSJens Wiklander 	params[0].value.b = command;
176a32a96edSJens Wiklander 
177a32a96edSJens Wiklander 	params[1].memref.buffer = buf;
178a32a96edSJens Wiklander 	params[1].memref.size = *len;
179a32a96edSJens Wiklander 
180a32a96edSJens Wiklander 	res = invoke_socket_pta(PTA_SOCKET_IOCTL, param_types, params);
181a32a96edSJens Wiklander 	*len =  params[1].memref.size;
182a32a96edSJens Wiklander 	return res;
183a32a96edSJens Wiklander }
184