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