From d365babd21c47946c5ece525fd6ea86cab2b5326 Mon Sep 17 00:00:00 2001 From: isiora Date: Thu, 15 Mar 2018 12:18:26 +0000 Subject: Added the daemons feature. Added sockets skeleton. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11766 110e8d01-0319-4d1e-a829-52ad28d1bb01 --- .../RT-SAMA5D2-XPLAINED-NSEC/daemons/tscommon.h | 84 ++++++ .../RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.c | 306 +++++++++++++++++++++ .../RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.h | 77 ++++++ 3 files changed, 467 insertions(+) create mode 100644 demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tscommon.h create mode 100644 demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.c create mode 100644 demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.h (limited to 'demos/ATSAMA5D2') diff --git a/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tscommon.h b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tscommon.h new file mode 100644 index 000000000..29216a92c --- /dev/null +++ b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tscommon.h @@ -0,0 +1,84 @@ +/* + ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file tscommon.h + * @brief Common, shared defines and macros between secure and non secure + * environment. + * + */ + +#ifndef TSCOMMON_H +#define TSCOMMON_H + +#include "ch.h" +#include "ccportab.h" + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ +#define SKEL_REQ_GETOP 1 +#define SKEL_REQ_CPYPRMS 2 +#define SKEL_REQ_PUTRES 3 + +#define STUB_OP_SOCKET 0 +#define STUB_OP_CLOSE 1 +#define STUB_OP_CONNECT 2 +#define STUB_OP_RECV 3 +#define STUB_OP_SEND 4 +#define STUB_OP_SELECT 5 +#define STUB_OP_BIND 6 + +#define EVT_F_SOCK_NEW_OP 1 + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ +#define METHOD_MAX_PARAMS 6 + +#define L_FD_SETSIZE 64 + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ +typedef struct skel_req { + uint32_t req; /* getop, cpyprms, putres */ + uint32_t stub_op; + uint32_t stub_op_code; + uint32_t stub_op_result; + uint32_t stub_op_p[METHOD_MAX_PARAMS]; +} skel_req_t; + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +#endif /* TSCOMMON_H */ diff --git a/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.c b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.c new file mode 100644 index 000000000..8ca60ad59 --- /dev/null +++ b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.c @@ -0,0 +1,306 @@ +/* + ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +/** + * @file tssockskel.c + * @brief Sockets skeleton daemon for trusted clients. + * + */ + +#include "ch.h" +#include "tsclient.h" +#include "tssockskel.h" +#include + +/*===========================================================================*/ +/* Module local definitions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local variables. */ +/*===========================================================================*/ + +static ts_service_t tsStubsService; + +/*===========================================================================*/ +/* Module local functions. */ +/*===========================================================================*/ + +/** + * @brief Invoke the stubs service in order to copy the 'in' + * parameters in the non secure memory space. + */ +static void paramsInFromRemote(skel_req_t *skreqp) { + msg_t r; + + skreqp->req = SKEL_REQ_CPYPRMS; + while (TRUE) { + r = tsInvokeServiceNoYield(tsStubsService, + (ts_params_area_t)skreqp, sizeof *skreqp); + if (r != SMC_SVC_BUSY) + break; + chThdSleepMicroseconds(TS_GRANTED_TIMESLICE); + } +} + +/** + * @brief Invoke the stubs service in order to copy the 'out' + * parameters in the secure memory space and set the + * remote call result. + */ +static void returnToRemote(skel_req_t *skreqp, uint32_t res) { + msg_t r; + + skreqp->stub_op_result = res; + skreqp->req = SKEL_REQ_PUTRES; + + while (TRUE) { + r = tsInvokeServiceNoYield(tsStubsService, + (ts_params_area_t)skreqp, sizeof *skreqp); + if (r != SMC_SVC_BUSY) + break; + chThdSleepMicroseconds(TS_GRANTED_TIMESLICE); + } +} + +/** + * @name Sockets API skeletons. + * @{ + */ + +/** + * @brief int socket(int domain, int type, int protocol) + */ +static void l_socket(skel_req_t *skreqp) { + int result; + + /* call the api exposed by the TCP/IP stack.*/ + result = socket((int)skreqp->stub_op_p[0], + (int)skreqp->stub_op_p[1], + (int)skreqp->stub_op_p[2]); + + /* report the result and copy the 'out' parameters.*/ + returnToRemote(skreqp, result); +} + +/** + * @brief int connect(int s, const struct sockaddr *name, socklen_t namelen) + */ +static void l_connect(skel_req_t *skreqp) { + int s, result, socklen; + struct sockaddr sockaddr; + + s = (int)skreqp->stub_op_p[0]; + skreqp->stub_op_p[1] = (uint32_t)&sockaddr; + socklen = (int)skreqp->stub_op_p[2]; + + /* Call the stub service in order to copy the 'in' parameter + sockaddr.*/ + paramsInFromRemote(skreqp); + + /* Call the api exposed by the TCP/IP stack.*/ + result = connect(s, &sockaddr, socklen); + + /* Report the result.*/ + returnToRemote(skreqp, result); +} + +/** + * @brief int close(int s) + */ +static void l_close(skel_req_t *skreqp) { + int result; + + /* Call the api exposed by the TCP/IP stack.*/ + result = close((int)skreqp->stub_op_p[0]); + + /* report the result.*/ + returnToRemote(skreqp, result); +} + + +/** + * @brief int recv(int s, void *mem, size_t len, int flags) + */ +static void l_recv(skel_req_t *skreqp) { + int result; + void *mem; + size_t len; + + len = skreqp->stub_op_p[2]; + + /* Allocate the space for the receive buffer.*/ + mem = chHeapAlloc(NULL, len); + if (NULL == mem) { + result = ENOMEM; + } else { + + /* call the api exposed by the TCP/IP stack.*/ + result = recv((int)skreqp->stub_op_p[0], mem, len, + (int)skreqp->stub_op_p[3]); + } + + /* report the result and copy 'out' parameter mem.*/ + returnToRemote(skreqp, result); + if (NULL != mem) + chHeapFree(mem); +} + +/** + * @brief int send(int s, const void *dataptr, size_t size, int flags) + */ +static void l_send(skel_req_t *skreqp) { + int result; + void *dataptr; + size_t size; + + size = skreqp->stub_op_p[2]; + + /* Allocate the space for the send buffer.*/ + dataptr = chHeapAlloc(NULL, size); + if (NULL == dataptr) { + result = ENOMEM; + } else { + skreqp->stub_op_p[1] = (uint32_t)dataptr; + + /* call the stub service in order to copy the + 'in' parameter dataptr.*/ + paramsInFromRemote(skreqp); + + /* call the api exposed by the TCP/IP stack.*/ + result = send((int)skreqp->stub_op_p[0], dataptr, size, + (int)skreqp->stub_op_p[3]); + chHeapFree(dataptr); + } + + /* report the result.*/ + returnToRemote(skreqp, result); +} + + +/** + * @brief int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, + * struct timeval *timeout) + */ +static void l_select(skel_req_t *skreqp) { + int result; + int maxfdpl; + fd_set readset, writeset, exceptset; + struct timeval timeout; + + maxfdpl = skreqp->stub_op_p[0]; + + skreqp->stub_op_p[1] = (uint32_t)&readset; + skreqp->stub_op_p[2] = (uint32_t)&writeset; + skreqp->stub_op_p[3] = (uint32_t)&exceptset; + skreqp->stub_op_p[4] = (uint32_t)&timeout; + + /* call the stub service in order to copy the + 'in' parameter readset, writeset, exceptset and timeout.*/ + paramsInFromRemote(skreqp); + + /* call the api exposed by the TCP/IP stack.*/ + result = select(maxfdpl, &readset, &writeset, &exceptset, &timeout); + + /* report the result and the parameters readset, writeset and exceptset.*/ + returnToRemote(skreqp, result); +} + +/** + * @brief bind(int s, const struct sockaddr *name, socklen_t namelen); + */ +static void l_bind(skel_req_t *skreqp) { + int s, result, socklen; + struct sockaddr sockaddr; + + s = (int)skreqp->stub_op_p[0]; + skreqp->stub_op_p[1] = (uint32_t)&sockaddr; + socklen = (int)skreqp->stub_op_p[2]; + + /* Call the stub service in order to copy the 'in' parameter + sockaddr.*/ + paramsInFromRemote(skreqp); + + /* Call the api exposed by the TCP/IP stack.*/ + result = bind(s, &sockaddr, socklen); + + /* Report the result.*/ + returnToRemote(skreqp, result); +} + +/** @} */ + +/*===========================================================================*/ +/* Module exported functions. */ +/*===========================================================================*/ +THD_WORKING_AREA(waTsSockSkelDaemon, 2048); +THD_FUNCTION(TsSockSkelDaemon, arg) { + (void)arg; + + event_listener_t el; + skel_req_t skel_req; + msg_t r; + + tsStubsService = (ts_service_t)tsInvokeServiceNoYield(TS_HND_DISCOVERY, + (ts_params_area_t)"TsStubsService", sizeof "TsStubsService"); + chEvtRegisterMaskWithFlags(&stubsEventSource, &el, ALL_EVENTS, EVT_F_SOCK_NEW_OP); + for (;/* ever */;) { + chEvtWaitAny(ALL_EVENTS); + (void)chEvtGetAndClearFlags(&el); + skel_req.req = SKEL_REQ_GETOP; + while ((r = tsInvokeServiceNoYield(tsStubsService, + (ts_params_area_t)&skel_req, sizeof skel_req)) != SMC_SVC_NHND) { + if (r == SMC_SVC_BUSY) { + chThdSleepMicroseconds(TS_GRANTED_TIMESLICE); + continue; + } + switch (skel_req.stub_op_code) { + case STUB_OP_SOCKET: + l_socket(&skel_req); + break; + case STUB_OP_CONNECT: + l_connect(&skel_req); + break; + case STUB_OP_CLOSE: + l_close(&skel_req); + break; + case STUB_OP_RECV: + l_recv(&skel_req); + break; + case STUB_OP_SEND: + l_send(&skel_req); + break; + case STUB_OP_SELECT: + l_select(&skel_req); + break; + case STUB_OP_BIND: + l_bind(&skel_req); + break; + default: + break; + } + skel_req.req = SKEL_REQ_GETOP; + } + } +} diff --git a/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.h b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.h new file mode 100644 index 000000000..e7408f908 --- /dev/null +++ b/demos/ATSAMA5D2/RT-SAMA5D2-XPLAINED-NSEC/daemons/tssockskel.h @@ -0,0 +1,77 @@ +/* + ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file tssockskel.h + * @brief Sockets skeleton module macros and structures. + * + */ + +#ifndef TSSOCKSKEL_H +#define TSSOCKSKEL_H + +#include "ch.h" +#include "ccportab.h" +#include "lwip/sockets.h" +#include "tscommon.h" + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ +#if (L_FD_SETSIZE) != (FD_SETSIZE) +#error "Configuration error of L_FD_SETSIZE, it must be set to FD_SETSIZE " +#define VALUE(x) #x +#define VAR_NAME_VALUE(var) #var "=" VALUE(var) +#pragma message(VAR_NAME_VALUE(FD_SETSIZE)) +#endif + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +#ifdef __cplusplus +extern "C" { +#endif + THD_FUNCTION(TsSockSkelDaemon, tsstate); + extern THD_WORKING_AREA(waTsSockSkelDaemon, 2048); +#ifdef __cplusplus +} +#endif + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +#endif /* TSSOCKSKEL_H */ -- cgit v1.2.3