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