xref: /optee_os/lib/libutee/tee_socket_pta.c (revision 78b7c7c7653f8bff42fe44d31a79d7f6bbfd4d47)
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