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:
parent
188c45b620
commit
d365babd21
|
@ -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 */
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 */
|
Loading…
Reference in New Issue