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
This commit is contained in:
isiora 2018-03-15 12:18:26 +00:00
parent 188c45b620
commit d365babd21
3 changed files with 467 additions and 0 deletions

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/**
* @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 */

View File

@ -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 <string.h>
/*===========================================================================*/
/* 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;
}
}
}

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/**
* @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 */