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