summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrederic Berat <fberat@de.adit-jv.com>2015-12-01 11:13:12 +0100
committerGernot Wirschal <gernot.wirschal@bmw.de>2016-04-28 13:17:43 +0200
commita9a43701138c99b3211ded8d388666161f7cde67 (patch)
tree4d63ee965a87395b470c624033a08e2856526522
parent3563d0c799fb24153dfa8ed3f425deb24d56274a (diff)
downloadDLT-daemon-a9a43701138c99b3211ded8d388666161f7cde67.tar.gz
dlt-daemon: receiver rework
The receiver structures have been removed from the dlt-daemon structure, they are now part of the connection. The overall usage of the receiver structrure has also been reviewed in the daemon. Signed-off-by: Frederic Berat <fberat@de.adit-jv.com> Change-Id: I7cf80d79ed73bd6d4f370bb3f278d26ccc9d8d7a
-rw-r--r--include/dlt/dlt_common.h13
-rw-r--r--src/daemon/dlt-daemon.c1210
-rw-r--r--src/daemon/dlt-daemon.h37
-rw-r--r--src/daemon/dlt_daemon_client.c2
-rw-r--r--src/daemon/dlt_daemon_connection.c140
-rw-r--r--src/daemon/dlt_daemon_connection_types.h12
-rw-r--r--src/daemon/dlt_daemon_event_handler.c37
-rw-r--r--src/shared/dlt_common.c39
-rw-r--r--src/shared/dlt_user_shared_cfg.h1
9 files changed, 755 insertions, 736 deletions
diff --git a/include/dlt/dlt_common.h b/include/dlt/dlt_common.h
index 2a87ade..b6a83a8 100644
--- a/include/dlt/dlt_common.h
+++ b/include/dlt/dlt_common.h
@@ -1085,6 +1085,19 @@ extern "C"
DltReturnValue dlt_receiver_move_to_begin(DltReceiver *receiver);
/**
+ * Check whether to_get amount of data is available in receiver and
+ * copy it to dest. Skip the DltUserHeader if skip_header is set to 1.
+ * @param receiver pointer to dlt receiver structure
+ * @param dest pointer to the destination buffer
+ * @param to_get size of the data to copy in dest
+ * @skip_header whether if the DltUserHeader must be skipped.
+ */
+ int dlt_receiver_check_and_get(DltReceiver *receiver,
+ void *dest,
+ unsigned int to_get,
+ unsigned int skip_header);
+
+ /**
* Fill out storage header of a dlt message
* @param storageheader pointer to storage header of a dlt message
* @param ecu name of ecu to be set in storage header
diff --git a/src/daemon/dlt-daemon.c b/src/daemon/dlt-daemon.c
index 804b36b..674ece5 100644
--- a/src/daemon/dlt-daemon.c
+++ b/src/daemon/dlt-daemon.c
@@ -562,6 +562,9 @@ int main(int argc, char* argv[])
DltDaemon daemon;
int back = 0;
+ memset(&daemon_local, 0, sizeof(DltDaemonLocal));
+ memset(&daemon, 0, sizeof(DltDaemon));
+
/* Command line option handling */
if ((back = option_handling(&daemon_local,argc,argv))<0)
{
@@ -657,27 +660,18 @@ int main(int argc, char* argv[])
create_timer_fd(&daemon_local,
watchdogTimeoutSeconds,
watchdogTimeoutSeconds,
- &daemon_local.timer_wd.fd,
DLT_TIMER_SYSTEMD);
}
#endif
// create fd for timer timing packets
- create_timer_fd(&daemon_local,
- 1,
- 1,
- &daemon_local.timer_one_s.fd,
- DLT_TIMER_PACKET);
+ create_timer_fd(&daemon_local, 1, 1, DLT_TIMER_PACKET);
// create fd for timer ecu version
if((daemon_local.flags.sendECUSoftwareVersion > 0) ||
(daemon_local.flags.sendTimezone > 0))
{
- create_timer_fd(&daemon_local,
- 60,
- 60,
- &daemon_local.timer_sixty_s.fd,
- DLT_TIMER_ECU);
+ create_timer_fd(&daemon_local, 60, 60, DLT_TIMER_ECU);
}
/* initiate gateway */
@@ -693,15 +687,8 @@ int main(int argc, char* argv[])
create_timer_fd(&daemon_local,
DLT_GATEWAY_TIMER_INTERVAL,
DLT_GATEWAY_TIMER_INTERVAL,
- &daemon_local.timer_gateway.fd,
DLT_TIMER_GATEWAY);
}
- if (dlt_connection_create_remaining(&daemon_local) == -1)
- {
- /* TODO: Perform clean-up */
- dlt_log(LOG_CRIT,"Fail to create remaining connection handler!\n");
- return -1;
- }
// For offline tracing we still can use the same states
// as for socket sending. Using this trick we see the traces
@@ -879,31 +866,6 @@ int dlt_daemon_local_init_p2(DltDaemon *daemon, DltDaemonLocal *daemon_local, in
return -1;
}
- if (dlt_receiver_init(&(daemon_local->receiver),daemon_local->fp,DLT_DAEMON_RCVBUFSIZE) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_ERR,"Could not initialize receiver\n");
- return -1;
- }
- if (dlt_receiver_init(&(daemon_local->receiverSock),daemon_local->sock,DLT_DAEMON_RCVBUFSIZESOCK) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_ERR,"Could not initialize receiver for socket\n");
- return -1;
- }
- if (dlt_receiver_init(&(daemon_local->receiverCtrlSock),
- daemon_local->ctrlsock, DLT_DAEMON_RCVBUFSIZESOCK)==-1)
- {
- dlt_log(LOG_ERR,"Could not initialize receiver for control socket\n");
- return -1;
- }
- if (daemon_local->flags.yvalue[0])
- {
- if (dlt_receiver_init(&(daemon_local->receiverSerial),daemon_local->fdserial,DLT_DAEMON_RCVBUFSIZESERIAL) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_ERR,"Could not initialize receiver for serial connection\n");
- return -1;
- }
- }
-
/* configure sending timing packets */
if (daemon_local->flags.sendMessageTime)
{
@@ -934,17 +896,16 @@ int dlt_daemon_local_init_p2(DltDaemon *daemon, DltDaemonLocal *daemon_local, in
static int dlt_daemon_init_serial(DltDaemonLocal *daemon_local)
{
- if (!daemon_local->flags.yvalue[0])
- {
- /* Nothing to do here. */
- daemon_local->fdserial = -1;
+ /* create and open serial connection from/to client */
+ /* open serial connection */
+ int fd = -1;
+
+ if (daemon_local->flags.yvalue[0] == '\0') {
return 0;
}
- /* create and open serial connection from/to client */
- /* open serial connection */
- daemon_local->fdserial = open(daemon_local->flags.yvalue, O_RDWR);
- if (daemon_local->fdserial < 0)
+ fd = open(daemon_local->flags.yvalue, O_RDWR);
+ if (fd < 0)
{
snprintf(str,
DLT_DAEMON_TEXTBUFSIZE,
@@ -956,7 +917,7 @@ static int dlt_daemon_init_serial(DltDaemonLocal *daemon_local)
return -1;
}
- if (isatty(daemon_local->fdserial))
+ if (isatty(fd))
{
int speed = DLT_DAEMON_SERIAL_DEFAULT_BAUDRATE;
@@ -967,10 +928,9 @@ static int dlt_daemon_init_serial(DltDaemonLocal *daemon_local)
daemon_local->baudrate = dlt_convert_serial_speed(speed);
- if (dlt_setup_serial(daemon_local->fdserial,
- daemon_local->baudrate) < 0)
+ if (dlt_setup_serial(fd, daemon_local->baudrate) < 0)
{
- close(daemon_local->fdserial);
+ close(fd);
daemon_local->flags.yvalue[0] = 0;
snprintf(str,
@@ -990,7 +950,7 @@ static int dlt_daemon_init_serial(DltDaemonLocal *daemon_local)
}
else
{
- close(daemon_local->fdserial);
+ close(fd);
fprintf(stderr,
"Device is not a serial device, device = %s (%s) \n",
daemon_local->flags.yvalue,
@@ -999,12 +959,17 @@ static int dlt_daemon_init_serial(DltDaemonLocal *daemon_local)
return -1;
}
- return 0;
+ return dlt_connection_create(daemon_local,
+ &daemon_local->pEvent,
+ fd,
+ EPOLLIN,
+ DLT_CONNECTION_CLIENT_MSG_SERIAL);
}
static int dlt_daemon_init_fifo(DltDaemonLocal *daemon_local)
{
int ret;
+ int fd = -1;
char local_str[DLT_DAEMON_TEXTBUFSIZE];
/* open named pipe(FIFO) to receive DLT messages from users */
@@ -1026,8 +991,8 @@ static int dlt_daemon_init_fifo(DltDaemonLocal *daemon_local)
return -1;
} /* if */
- daemon_local->fp = open(tmpFifo, O_RDWR);
- if (daemon_local->fp == -1)
+ fd = open(tmpFifo, O_RDWR);
+ if (fd == -1)
{
snprintf(local_str,
DLT_DAEMON_TEXTBUFSIZE,
@@ -1044,7 +1009,7 @@ static int dlt_daemon_init_fifo(DltDaemonLocal *daemon_local)
*/
return dlt_connection_create(daemon_local,
&daemon_local->pEvent,
- daemon_local->fp,
+ fd,
EPOLLIN,
DLT_CONNECTION_APP_MSG);
}
@@ -1054,6 +1019,7 @@ int dlt_daemon_local_connection_init(DltDaemon *daemon,
int verbose)
{
char local_str[DLT_DAEMON_TEXTBUFSIZE];
+ int fd = -1;
PRINT_FUNCTION_VERBOSE(verbose);
if ((daemon == NULL) || (daemon_local == NULL))
@@ -1075,7 +1041,12 @@ int dlt_daemon_local_connection_init(DltDaemon *daemon,
/* create and open socket to receive incoming connections from client */
daemon_local->client_connections = 0;
- if(dlt_daemon_socket_open(&(daemon_local->sock),daemon_local->flags.port))
+ if(dlt_daemon_socket_open(&fd, daemon_local->flags.port) ||
+ dlt_connection_create(daemon_local,
+ &daemon_local->pEvent,
+ fd,
+ EPOLLIN,
+ DLT_CONNECTION_CLIENT_CONNECT))
{
dlt_log(LOG_ERR,"Could not initialize main socket.\n");
return -1;
@@ -1083,9 +1054,12 @@ int dlt_daemon_local_connection_init(DltDaemon *daemon,
/* create and open unix socket to receive incoming connections from
* control application */
- if (dlt_daemon_unix_socket_open(
- &(daemon_local->ctrlsock),
- daemon_local->flags.ctrlSockPath))
+ if (dlt_daemon_unix_socket_open(&fd, daemon_local->flags.ctrlSockPath) ||
+ dlt_connection_create(daemon_local,
+ &daemon_local->pEvent,
+ fd,
+ EPOLLIN,
+ DLT_CONNECTION_CONTROL_CONNECT))
{
dlt_log(LOG_ERR, "Could not initialize control socket.\n");
return -1;
@@ -1183,32 +1157,14 @@ void dlt_daemon_local_cleanup(DltDaemon *daemon, DltDaemonLocal *daemon_local, i
return;
}
- /* Ignore result */
- dlt_receiver_free(&(daemon_local->receiver));
- /* Ignore result */
- dlt_receiver_free(&(daemon_local->receiverSock));
+ /* Don't receive event anymore */
+ dlt_event_handler_cleanup_connections(&daemon_local->pEvent);
- /* Ignore result */
- dlt_receiver_free(&(daemon_local->receiverCtrlSock));
- /* Ignore result */
- if (daemon_local->flags.yvalue[0])
- {
- /* Ignore result */
- dlt_receiver_free(&(daemon_local->receiverSerial));
- }
- /* Ignore result */
dlt_message_free(&(daemon_local->msg),daemon_local->flags.vflag);
- close(daemon_local->fp);
/* free shared memory */
if(daemon_local->flags.offlineTraceDirectory[0])
dlt_offline_trace_free(&(daemon_local->offlineTrace));
-#if 0
- if (daemon_local->flags.ovalue[0])
- {
- close(daemon_local->ohandle);
- } /* if */
-#endif
/* free ringbuffer */
dlt_buffer_free_dynamic(&(daemon->client_ringbuffer));
@@ -1242,10 +1198,8 @@ void dlt_daemon_local_cleanup(DltDaemon *daemon, DltDaemonLocal *daemon_local, i
free(daemon->ECUVersionString);
}
- dlt_daemon_unix_socket_close(daemon_local->ctrlsock);
unlink(daemon_local->flags.ctrlSockPath);
- dlt_event_handler_cleanup_connections(&daemon_local->pEvent);
}
void dlt_daemon_signal_handler(int sig)
@@ -1595,6 +1549,7 @@ int dlt_daemon_process_client_messages(DltDaemon *daemon,
int verbose)
{
int bytes_to_be_removed=0;
+ int must_close_socket = -1;
PRINT_FUNCTION_VERBOSE(verbose);
@@ -1606,17 +1561,15 @@ int dlt_daemon_process_client_messages(DltDaemon *daemon,
return -1;
}
- if (dlt_receiver_receive_socket(receiver) <= 0)
+ must_close_socket = dlt_receiver_receive_socket(receiver);
+ if (must_close_socket < 0)
{
dlt_daemon_close_socket(receiver->fd,
daemon,
daemon_local,
verbose);
receiver->fd = -1;
- /* FIXME: Why the hell do we need to close the socket
- * on control message reception ??
- */
- //return 0;
+ return -1;
}
/* Process all received messages */
@@ -1665,6 +1618,16 @@ int dlt_daemon_process_client_messages(DltDaemon *daemon,
return -1;
}
+ if (must_close_socket == 0) {
+ /* FIXME: Why the hell do we need to close the socket
+ * on control message reception ??
+ */
+ dlt_daemon_close_socket(receiver->fd,
+ daemon,
+ daemon_local,
+ verbose);
+ }
+
return 0;
}
@@ -1884,6 +1847,57 @@ int dlt_daemon_process_control_messages(
return 0;
}
+static int dlt_daemon_process_user_message_not_sup(DltDaemon *daemon,
+ DltDaemonLocal *daemon_local,
+ DltReceiver *receiver,
+ int verbose)
+{
+ char local_str[DLT_DAEMON_TEXTBUFSIZE] = { '\0' };
+ DltUserHeader *userheader = (DltUserHeader*) (receiver->buf);
+ (void)daemon;
+ (void)daemon_local;
+
+ PRINT_FUNCTION_VERBOSE(verbose);
+
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Invalid user message type received: %d!\n",
+ userheader->message);
+ dlt_log(LOG_ERR, local_str);
+
+ /* remove user header */
+ if (dlt_receiver_remove(receiver, sizeof(DltUserHeader)) == -1)
+ {
+ dlt_log(LOG_WARNING,
+ "Can't remove bytes from receiver for user messages\n");
+ }
+
+ return -1;
+}
+
+static dlt_daemon_process_user_message_func process_user_func[DLT_USER_MESSAGE_NOT_SUPPORTED] = {
+ dlt_daemon_process_user_message_not_sup,
+ dlt_daemon_process_user_message_log,
+ dlt_daemon_process_user_message_register_application,
+ dlt_daemon_process_user_message_unregister_application,
+ dlt_daemon_process_user_message_register_context,
+ dlt_daemon_process_user_message_unregister_context,
+ dlt_daemon_process_user_message_not_sup,
+ dlt_daemon_process_user_message_not_sup,
+ dlt_daemon_process_user_message_overflow,
+ dlt_daemon_process_user_message_set_app_ll_ts,
+#ifdef DLT_SHM_ENABLE
+ dlt_daemon_process_user_message_log_shm,
+#else
+ dlt_daemon_process_user_message_not_sup,
+#endif
+ dlt_daemon_process_user_message_not_sup,
+ dlt_daemon_process_user_message_not_sup,
+ dlt_daemon_process_user_message_marker,
+ dlt_daemon_process_user_message_not_sup,
+ dlt_daemon_process_user_message_not_sup
+};
+
int dlt_daemon_process_user_messages(DltDaemon *daemon,
DltDaemonLocal *daemon_local,
DltReceiver *receiver,
@@ -1891,6 +1905,7 @@ int dlt_daemon_process_user_messages(DltDaemon *daemon,
{
int offset = 0;
int run_loop = 1;
+ int32_t min_size = (int32_t)sizeof(DltUserHeader);
DltUserHeader *userheader;
PRINT_FUNCTION_VERBOSE(verbose);
@@ -1912,31 +1927,23 @@ int dlt_daemon_process_user_messages(DltDaemon *daemon,
}
/* look through buffer as long as data is in there */
- do
+ while ((receiver->bytesRcvd > min_size) && run_loop)
{
- if (receiver->bytesRcvd < (int32_t)sizeof(DltUserHeader))
- {
- break;
- }
+ dlt_daemon_process_user_message_func func = NULL;
- /* resync if necessary */
offset = 0;
- do
- {
- userheader = (DltUserHeader*) (receiver->buf+offset);
-
- /* Check for user header pattern */
- if (dlt_user_check_userheader(userheader))
- {
- break;
- }
+ userheader = (DltUserHeader*) (receiver->buf + offset);
+ while (!dlt_user_check_userheader(userheader) &&
+ (offset + min_size < receiver->bytesRcvd))
+ /* resync if necessary */
+ {
+ userheader = (DltUserHeader*) (receiver->buf + offset);
offset++;
- } while ((int32_t)(sizeof(DltUserHeader) + offset) <=
- receiver->bytesRcvd);
+ }
/* Check for user header pattern */
- if (dlt_user_check_userheader(userheader) == 0)
+ if (!dlt_user_check_userheader(userheader))
{
break;
}
@@ -1944,147 +1951,27 @@ int dlt_daemon_process_user_messages(DltDaemon *daemon,
/* Set new start offset */
if (offset > 0)
{
- receiver->buf += offset;
- receiver->bytesRcvd -= offset;
+ dlt_receiver_remove(receiver, offset);
}
- switch (userheader->message)
- {
- case DLT_USER_MESSAGE_OVERFLOW:
- {
- if (dlt_daemon_process_user_message_overflow(
- daemon,
- daemon_local,
- daemon_local->flags.vflag) == -1)
- {
- run_loop = 0;
- }
- break;
- }
- case DLT_USER_MESSAGE_REGISTER_CONTEXT:
- {
- if (dlt_daemon_process_user_message_register_context(
- daemon,
- daemon_local,
- daemon_local->flags.vflag) == -1)
- {
- run_loop = 0;
- }
- break;
- }
- case DLT_USER_MESSAGE_UNREGISTER_CONTEXT:
- {
- if (dlt_daemon_process_user_message_unregister_context(
- daemon,
- daemon_local,
- daemon_local->flags.vflag) == -1)
- {
- run_loop = 0;
- }
- break;
- }
- case DLT_USER_MESSAGE_LOG:
- {
- if (dlt_daemon_process_user_message_log(
- daemon,
- daemon_local,
- daemon_local->flags.vflag) == -1)
- {
- run_loop = 0;
- }
- break;
- }
-#ifdef DLT_SHM_ENABLE
- case DLT_USER_MESSAGE_LOG_SHM:
- {
- if (dlt_daemon_process_user_message_log_shm(
- daemon,
- daemon_local,
- daemon_local->flags.vflag) == -1)
- {
- run_loop = 0;
- }
- break;
- }
-#endif
- case DLT_USER_MESSAGE_REGISTER_APPLICATION:
- {
- if (dlt_daemon_process_user_message_register_application(
- daemon,
- daemon_local,
- daemon_local->flags.vflag) == -1)
- {
- run_loop = 0;
- }
- break;
- }
- case DLT_USER_MESSAGE_UNREGISTER_APPLICATION:
- {
- if (dlt_daemon_process_user_message_unregister_application(
- daemon,
- daemon_local,
- daemon_local->flags.vflag) == -1)
- {
- run_loop = 0;
- }
- break;
- }
- case DLT_USER_MESSAGE_APP_LL_TS:
- {
- if (dlt_daemon_process_user_message_set_app_ll_ts(
- daemon,
- daemon_local,
- daemon_local->flags.vflag) == -1)
- {
- run_loop = 0;
- }
- break;
- }
- case DLT_USER_MESSAGE_LOG_MODE:
+
+ if (userheader->message >= DLT_USER_MESSAGE_NOT_SUPPORTED)
{
- if (dlt_daemon_process_user_message_log_mode(daemon, daemon_local, daemon_local->flags.vflag)==-1)
- {
- run_loop=0;
- }
- break;
+ func = dlt_daemon_process_user_message_not_sup;
}
- case DLT_USER_MESSAGE_MARKER:
+ else
{
- if (dlt_daemon_process_user_message_marker(
- daemon,
- daemon_local,
- daemon_local->flags.vflag) == -1)
- {
- run_loop = 0;
- }
- break;
+ func = process_user_func[userheader->message];
}
- default:
- {
- snprintf(str,
- DLT_DAEMON_TEXTBUFSIZE,
- "Invalid user message type received: %d!\n",
- userheader->message);
- dlt_log(LOG_ERR,str);
-
- /* remove user header */
- if (dlt_receiver_remove(receiver, sizeof(DltUserHeader)) == -1)
- {
- dlt_log(LOG_WARNING,
- "Can't remove bytes from receiver for user messages\n");
- return -1;
- }
- /* In next invocation of do-while loop, a resync will be triggered
- * if additional data was received */
+ if (func(daemon,
+ daemon_local,
+ receiver,
+ daemon_local->flags.vflag) == -1)
+ {
run_loop = 0;
-
- break;
- }
}
-
}
- while (run_loop);
/* keep not read data in buffer */
if (dlt_receiver_move_to_begin(receiver) == -1)
@@ -2098,42 +1985,46 @@ int dlt_daemon_process_user_messages(DltDaemon *daemon,
return 0;
}
-int dlt_daemon_process_user_message_overflow(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose)
+int dlt_daemon_process_user_message_overflow(DltDaemon *daemon,
+ DltDaemonLocal *daemon_local,
+ DltReceiver *rec,
+ int verbose)
{
- int ret;
- DltUserControlMsgBufferOverflow *userpayload;
+ uint32_t len = sizeof(DltUserControlMsgBufferOverflow);
+ char local_str[DLT_DAEMON_TEXTBUFSIZE] = { '\0' };
+ DltUserControlMsgBufferOverflow userpayload;
PRINT_FUNCTION_VERBOSE(verbose);
- if ((daemon==0) || (daemon_local==0))
+ if ((daemon == NULL) || (daemon_local == NULL) || (rec == NULL))
{
- dlt_log(LOG_WARNING, "Invalid function parameters used for function dlt_daemon_process_user_message_overflow()\n");
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Invalid function parameters used for %s\n",
+ __func__);
+
+ dlt_log(LOG_ERR, local_str);
return -1;
}
- if (daemon_local->receiver.bytesRcvd < (int32_t)(sizeof(DltUserHeader)+sizeof(DltUserControlMsgBufferOverflow)))
+ if (dlt_receiver_check_and_get(rec, &userpayload, len, 1) < 0)
{
/* Not enough bytes received */
return -1;
}
- /* get the payload of the user message */
- userpayload = (DltUserControlMsgBufferOverflow*) (daemon_local->receiver.buf+sizeof(DltUserHeader));
-
/* Store in daemon, that a message buffer overflow has occured */
/* look if TCP connection to client is available or it least message can be put into buffer */
- if((ret=dlt_daemon_control_message_buffer_overflow(DLT_DAEMON_SEND_TO_ALL, daemon,daemon_local, userpayload->overflow_counter,userpayload->apid,verbose)))
+ if(dlt_daemon_control_message_buffer_overflow(DLT_DAEMON_SEND_TO_ALL,
+ daemon,
+ daemon_local,
+ userpayload.overflow_counter,
+ userpayload.apid,
+ verbose))
{
/* there was an error when storing message */
/* add the counter of lost messages to the daemon counter */
- daemon->overflow_counter+=userpayload->overflow_counter;
- }
-
- /* keep not read data in buffer */
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgBufferOverflow)) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message overflow\n");
- return -1;
+ daemon->overflow_counter += userpayload.overflow_counter;
}
return 0;
@@ -2159,180 +2050,212 @@ int dlt_daemon_send_message_overflow(DltDaemon *daemon, DltDaemonLocal *daemon_l
return DLT_DAEMON_ERROR_OK;
}
-int dlt_daemon_process_user_message_register_application(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose)
+int dlt_daemon_process_user_message_register_application(DltDaemon *daemon,
+ DltDaemonLocal *daemon_local,
+ DltReceiver *rec,
+ int verbose)
{
- uint32_t len=0;
- DltDaemonApplication *application;
- char description[DLT_DAEMON_DESCSIZE+1];
- DltUserControlMsgRegisterApplication *usercontext;
+ uint32_t len = sizeof(DltUserControlMsgRegisterApplication);
+ DltDaemonApplication *application = NULL;
+ char local_str[DLT_DAEMON_TEXTBUFSIZE] = { '\0' };
+ char description[DLT_DAEMON_DESCSIZE + 1] = { '\0' };
+ DltUserControlMsgRegisterApplication userapp;
PRINT_FUNCTION_VERBOSE(verbose);
- if ((daemon==0) || (daemon_local==0))
+ if ((daemon == NULL) || (daemon_local == NULL) || (rec == NULL))
{
- dlt_log(LOG_ERR, "Invalid function parameters used for function dlt_daemon_process_user_message_register_application()\n");
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Invalid function parameters used for %s\n",
+ __func__);
+
+ dlt_log(LOG_ERR, local_str);
return -1;
}
- if (daemon_local->receiver.bytesRcvd < (int32_t)(sizeof(DltUserHeader)+sizeof(DltUserControlMsgRegisterApplication)))
+ if (dlt_receiver_check_and_get(rec, &userapp, len, 1) < 0)
{
/* Not enough bytes received */
return -1;
}
- usercontext = (DltUserControlMsgRegisterApplication*) (daemon_local->receiver.buf+sizeof(DltUserHeader));
+ len = userapp.description_length;
- memset(description,0,sizeof(description));
-
- len=usercontext->description_length;
- if ((len>0) && (len<=DLT_DAEMON_DESCSIZE))
+ if ((len > DLT_DAEMON_DESCSIZE) ||
+ (dlt_receiver_check_and_get(rec, description, len, 0) < 0))
{
- /* Read and store application description */
- strncpy(description, (daemon_local->receiver.buf+sizeof(DltUserHeader)+sizeof(DltUserControlMsgRegisterApplication)), len);
- description[sizeof(description)-1]=0;
-
+ dlt_log(LOG_ERR, "Unable to get application description\n");
+ return -1;
}
- application=dlt_daemon_application_add(daemon,usercontext->apid,usercontext->pid,description,verbose);
+ application = dlt_daemon_application_add(daemon,
+ userapp.apid,
+ userapp.pid,
+ description,
+ verbose);
/* send log state to new application */
- dlt_daemon_user_send_log_state(daemon,application,verbose);
+ dlt_daemon_user_send_log_state(daemon, application, verbose);
- /* keep not read data in buffer */
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgRegisterApplication)+len) == DLT_RETURN_ERROR)
+ if (application == NULL)
{
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message register application\n");
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Can't add ApplicationID '%.4s' for PID %d\n",
+ userapp.apid,
+ userapp.pid);
+ dlt_log(LOG_WARNING,local_str);
return -1;
}
-
- if (application==0)
- {
- snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "Can't add ApplicationID '%.4s' for PID %d\n", usercontext->apid, usercontext->pid);
- dlt_log(LOG_WARNING,str);
- return -1;
- } else
+ else
{
- snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "ApplicationID '%.4s' registered for PID %d, Description=%s\n", application->apid, application->pid, application->application_description);
- dlt_daemon_log_internal(daemon, daemon_local, str, daemon_local->flags.vflag);
- dlt_log(LOG_DEBUG,str);
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "ApplicationID '%.4s' registered for PID %d, Description=%s\n",
+ application->apid,
+ application->pid,
+ application->application_description);
+ dlt_daemon_log_internal(daemon,
+ daemon_local,
+ local_str,
+ daemon_local->flags.vflag);
+ dlt_log(LOG_DEBUG, local_str);
}
return 0;
}
-int dlt_daemon_process_user_message_register_context(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose)
+int dlt_daemon_process_user_message_register_context(DltDaemon *daemon,
+ DltDaemonLocal *daemon_local,
+ DltReceiver *rec,
+ int verbose)
{
- uint32_t len=0;
- int8_t loglevel, tracestatus;
- DltUserControlMsgRegisterContext *usercontext;
- char description[DLT_DAEMON_DESCSIZE+1];
- DltDaemonApplication *application;
- DltDaemonContext *context;
- DltServiceGetLogInfoRequest *req;
+ char local_str[DLT_DAEMON_TEXTBUFSIZE] = { '\0' };
+ uint32_t len = sizeof(DltUserControlMsgRegisterContext);
+ DltUserControlMsgRegisterContext userctxt;
+ char description[DLT_DAEMON_DESCSIZE + 1] = { '\0' };
+ DltDaemonApplication *application = NULL;
+ DltDaemonContext *context = NULL;
+ DltServiceGetLogInfoRequest *req = NULL;
DltMessage msg;
PRINT_FUNCTION_VERBOSE(verbose);
- if ((daemon==0) || (daemon_local==0))
+ if ((daemon == NULL) || (daemon_local == NULL) || (rec == NULL))
{
- dlt_log(LOG_ERR, "Invalid function parameters used for function dlt_daemon_process_user_message_register_context()\n");
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Invalid function parameters used for %s\n",
+ __func__);
+
+ dlt_log(LOG_ERR, local_str);
return -1;
}
- if (daemon_local->receiver.bytesRcvd < (int32_t)(sizeof(DltUserHeader)+sizeof(DltUserControlMsgRegisterContext)))
+ memset(&userctxt, 0, len);
+ if (dlt_receiver_check_and_get(rec, &userctxt, len, 1) < 0)
{
/* Not enough bytes received */
return -1;
}
- usercontext = (DltUserControlMsgRegisterContext*) (daemon_local->receiver.buf+sizeof(DltUserHeader));
-
- memset(description,0,sizeof(description));
+ len = userctxt.description_length;
- len=usercontext->description_length;
- if ((len>0) && (len<=DLT_DAEMON_DESCSIZE))
+ if ((len > DLT_DAEMON_DESCSIZE) ||
+ (dlt_receiver_check_and_get(rec, description, len, 0) < 0))
{
- /* Read and store context description */
- strncpy(description, (daemon_local->receiver.buf+sizeof(DltUserHeader)+sizeof(DltUserControlMsgRegisterContext)), len);
- description[sizeof(description)-1]=0;
+ dlt_log(LOG_ERR, "Unable to get application description\n");
+ return -1;
}
- application = dlt_daemon_application_find(daemon,usercontext->apid,verbose);
+ application = dlt_daemon_application_find(daemon, userctxt.apid, verbose);
- if (application==0)
+ if (application == 0)
{
- snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "ApplicationID '%.4s' not found while registering ContextID '%.4s' in dlt_daemon_process_user_message_register_context()\n", usercontext->apid, usercontext->ctid);
- dlt_log(LOG_WARNING, str);
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgRegisterContext)+len) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message register context\n");
- return -1;
- }
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "ApID '%.4s' not found for new ContextID '%.4s' in %s\n",
+ userctxt.apid,
+ userctxt.ctid,
+ __func__);
+ dlt_log(LOG_WARNING, local_str);
+
return 0;
}
- /* Pre-set loglevel */
- if (usercontext->log_level == DLT_USER_LOG_LEVEL_NOT_SET)
+ /* Set log level */
+ if (userctxt.log_level == DLT_USER_LOG_LEVEL_NOT_SET)
{
- loglevel=DLT_LOG_DEFAULT;
+ userctxt.log_level = DLT_LOG_DEFAULT;
}
else
{
- loglevel=usercontext->log_level;
/* Plausibility check */
- if ((loglevel<DLT_LOG_DEFAULT) || (loglevel>DLT_LOG_VERBOSE))
+ if ((userctxt.log_level < DLT_LOG_DEFAULT) ||
+ (userctxt.log_level > DLT_LOG_VERBOSE))
{
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgRegisterContext)+len) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message register context\n");
- }
return -1;
}
}
- /* Pre-set tracestatus */
- if (usercontext->trace_status == DLT_USER_TRACE_STATUS_NOT_SET)
+ /* Set trace status */
+ if (userctxt.trace_status == DLT_USER_TRACE_STATUS_NOT_SET)
{
- tracestatus=DLT_TRACE_STATUS_DEFAULT;
+ userctxt.trace_status = DLT_TRACE_STATUS_DEFAULT;
}
else
{
- tracestatus=usercontext->trace_status;
-
/* Plausibility check */
- if ((tracestatus<DLT_TRACE_STATUS_DEFAULT) || (tracestatus>DLT_TRACE_STATUS_ON))
+ if ((userctxt.trace_status < DLT_TRACE_STATUS_DEFAULT) ||
+ (userctxt.trace_status > DLT_TRACE_STATUS_ON))
{
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgRegisterContext)+len) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message register context\n");
- }
return -1;
}
}
- context = dlt_daemon_context_add(daemon,usercontext->apid,usercontext->ctid, loglevel, tracestatus, usercontext->log_level_pos,application->user_handle,description,verbose);
+ context = dlt_daemon_context_add(daemon,
+ userctxt.apid,
+ userctxt.ctid,
+ userctxt.log_level,
+ userctxt.trace_status,
+ userctxt.log_level_pos,
+ application->user_handle,
+ description,
+ verbose);
if (context==0)
{
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgRegisterContext)+len) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message register context\n");
- }
-
- snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "Can't add ContextID '%.4s' for ApplicationID '%.4s'\n", usercontext->ctid, usercontext->apid);
- dlt_log(LOG_WARNING,str);
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Can't add ContextID '%.4s' for ApID '%.4s'\n in %s",
+ userctxt.ctid,
+ userctxt.apid,
+ __func__);
+ dlt_log(LOG_WARNING, local_str);
return -1;
- } else
+ }
+ else
{
- snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "ContextID '%.4s' registered for ApplicationID '%.4s', Description=%s\n", context->ctid, context->apid, context->context_description);
- dlt_daemon_log_internal(daemon, daemon_local, str, daemon_local->flags.vflag);
- dlt_log(LOG_DEBUG,str);
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "ContextID '%.4s' registered for ApID '%.4s', Description=%s\n",
+ context->ctid,
+ context->apid,
+ context->context_description);
+ dlt_daemon_log_internal(daemon, daemon_local, local_str, verbose);
+ dlt_log(LOG_DEBUG, local_str);
}
+
if(daemon_local->flags.offlineLogstorageMaxDevices)
{
/* Store log level set for offline logstorage into context structure*/
- context->storage_log_level = dlt_daemon_logstorage_get_loglevel(daemon, daemon_local->flags.offlineLogstorageMaxDevices, usercontext->apid, usercontext->ctid);
+ context->storage_log_level =
+ dlt_daemon_logstorage_get_loglevel(daemon,
+ daemon_local->flags.offlineLogstorageMaxDevices,
+ userctxt.apid,
+ userctxt.ctid);
}
else
{
@@ -2342,13 +2265,8 @@ int dlt_daemon_process_user_message_register_context(DltDaemon *daemon, DltDaemo
if (daemon_local->flags.rflag)
{
/* Prepare request for get log info with one application and one context */
- if (dlt_message_init(&msg, verbose) == DLT_RETURN_ERROR)
+ if (dlt_message_init(&msg, verbose)==-1)
{
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgRegisterContext)+len) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message register context\n");
- return -1;
- }
dlt_log(LOG_WARNING,"Can't initialize message");
return -1;
}
@@ -2365,11 +2283,6 @@ int dlt_daemon_process_user_message_register_context(DltDaemon *daemon, DltDaemo
}
if (msg.databuffer==0)
{
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgRegisterContext)+len) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message register context\n");
- return -1;
- }
dlt_log(LOG_WARNING,"Can't allocate buffer for get log info message\n");
return -1;
}
@@ -2378,8 +2291,8 @@ int dlt_daemon_process_user_message_register_context(DltDaemon *daemon, DltDaemo
req->service_id = DLT_SERVICE_ID_GET_LOG_INFO;
req->options = 7;
- dlt_set_id(req->apid, usercontext->apid);
- dlt_set_id(req->ctid, usercontext->ctid);
+ dlt_set_id(req->apid, userctxt.apid);
+ dlt_set_id(req->ctid, userctxt.ctid);
dlt_set_id(req->com,"remo");
dlt_daemon_control_get_log_info(DLT_DAEMON_SEND_TO_ALL , daemon,daemon_local, &msg, verbose);
@@ -2392,54 +2305,59 @@ int dlt_daemon_process_user_message_register_context(DltDaemon *daemon, DltDaemo
/* This call also replaces the default values with the values defined for default */
if (dlt_daemon_user_send_log_level(daemon, context, verbose)==-1)
{
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgRegisterContext)+len) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message register context\n");
- return -1;
- }
- snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "Can't send current log level as response to user message register context for (%.4s;%.4s)\n", context->apid, context->ctid);
- dlt_log(LOG_WARNING,str);
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Can't send current log level as response to %s for (%.4s;%.4s)\n",
+ __func__,
+ context->apid,
+ context->ctid);
+ dlt_log(LOG_WARNING, local_str);
return -1;
}
}
- /* keep not read data in buffer */
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgRegisterContext)+len) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message register context\n");
- return -1;
- }
-
return 0;
}
-int dlt_daemon_process_user_message_unregister_application(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose)
+int dlt_daemon_process_user_message_unregister_application(DltDaemon *daemon,
+ DltDaemonLocal *daemon_local,
+ DltReceiver *rec,
+ int verbose)
{
- DltUserControlMsgUnregisterApplication *usercontext;
- DltDaemonApplication *application;
+ uint32_t len = sizeof(DltUserControlMsgUnregisterApplication);
+ DltUserControlMsgUnregisterApplication userapp;
+ char local_str[DLT_DAEMON_TEXTBUFSIZE] = { '\0' };
+ DltDaemonApplication *application = NULL;
DltDaemonContext *context;
int i, offset_base;
PRINT_FUNCTION_VERBOSE(verbose);
- if ((daemon==0) || (daemon_local==0))
+ if ((daemon == NULL) || (daemon_local == NULL) || (rec == NULL))
{
- dlt_log(LOG_ERR, "Invalid function parameters used for function dlt_daemon_process_user_message_unregister_application()\n");
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Invalid function parameters used for %s\n",
+ __func__);
+
+ dlt_log(LOG_ERR, local_str);
return -1;
}
- if (daemon_local->receiver.bytesRcvd < (int32_t)(sizeof(DltUserHeader)+sizeof(DltUserControlMsgUnregisterApplication)))
+ if (dlt_receiver_check_and_get(rec, &userapp, len, 1) < 0)
{
/* Not enough bytes received */
return -1;
}
- if (daemon->num_applications>0)
+ if (daemon->num_applications > 0)
{
- usercontext = (DltUserControlMsgUnregisterApplication*) (daemon_local->receiver.buf+sizeof(DltUserHeader));
-
- /* Delete this application and all corresponding contexts for this application from internal table */
- application = dlt_daemon_application_find(daemon,usercontext->apid, verbose);
+ /* Delete this application and all corresponding contexts
+ * for this application from internal table.
+ */
+ application = dlt_daemon_application_find(daemon,
+ userapp.apid,
+ verbose);
if (application)
{
@@ -2456,15 +2374,15 @@ int dlt_daemon_process_user_message_unregister_application(DltDaemon *daemon, Dl
if (context)
{
/* Delete context */
- if (dlt_daemon_context_del(daemon, context, verbose)==-1)
+ if (dlt_daemon_context_del(daemon, context, verbose) == -1)
{
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgUnregisterApplication)) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message unregister application\n");
- return -1;
- }
- snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "Can't delete ContextID '%.4s' in ApplicationID '%.4s' for user message unregister application\n", context->ctid, context->apid);
- dlt_log(LOG_WARNING,str);
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Can't delete CtID '%.4s' for ApID '%.4s' in %s\n",
+ context->ctid,
+ context->apid,
+ __func__);
+ dlt_log(LOG_WARNING, local_str);
return -1;
}
}
@@ -2473,93 +2391,114 @@ int dlt_daemon_process_user_message_unregister_application(DltDaemon *daemon, Dl
/* Delete this application entry from internal table*/
if (dlt_daemon_application_del(daemon, application, verbose)==-1)
{
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgUnregisterApplication)) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message unregister application\n");
- return -1;
- }
- snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "Can't delete ApplicationID '%.4s' for user message unregister application\n", application->apid);
- dlt_log(LOG_WARNING,str);
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Can't delete ApID '%.4s' in %s\n",
+ application->apid,
+ __func__);
+ dlt_log(LOG_WARNING, local_str);
return -1;
- } else
+ }
+ else
{
- snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "Unregistered ApplicationID '%.4s'\n", usercontext->apid);
- dlt_daemon_log_internal(daemon, daemon_local, str, daemon_local->flags.vflag);
- dlt_log(LOG_DEBUG,str);
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Unregistered ApID '%.4s'\n",
+ userapp.apid);
+ dlt_daemon_log_internal(daemon,
+ daemon_local,
+ local_str,
+ verbose);
+ dlt_log(LOG_DEBUG, local_str);
}
}
}
- /* keep not read data in buffer */
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgUnregisterApplication)) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message unregister application\n");
- return -1;
- }
-
return 0;
}
-int dlt_daemon_process_user_message_unregister_context(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose)
+int dlt_daemon_process_user_message_unregister_context(DltDaemon *daemon,
+ DltDaemonLocal *daemon_local,
+ DltReceiver *rec,
+ int verbose)
{
- DltUserControlMsgUnregisterContext *usercontext;
+ char local_str[DLT_DAEMON_TEXTBUFSIZE] = { '\0' };
+ uint32_t len = sizeof(DltUserControlMsgUnregisterContext);
+ DltUserControlMsgUnregisterContext userctxt;
DltDaemonContext *context;
PRINT_FUNCTION_VERBOSE(verbose);
- if ((daemon==0) || (daemon_local==0))
+ if ((daemon == NULL) || (daemon_local == NULL) || (rec == NULL))
{
- dlt_log(LOG_ERR, "Invalid function parameters used for function dlt_daemon_process_user_message_unregister_context()\n");
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Invalid function parameters used for %s\n",
+ __func__);
+
+ dlt_log(LOG_ERR, local_str);
return -1;
}
- if (daemon_local->receiver.bytesRcvd < (int32_t)(sizeof(DltUserHeader)+sizeof(DltUserControlMsgUnregisterContext)))
+ if (dlt_receiver_check_and_get(rec, &userctxt, len, 1) < 0)
{
/* Not enough bytes received */
return -1;
}
- usercontext = (DltUserControlMsgUnregisterContext*) (daemon_local->receiver.buf+sizeof(DltUserHeader));
- context = dlt_daemon_context_find(daemon,usercontext->apid, usercontext->ctid, verbose);
+ context = dlt_daemon_context_find(daemon,
+ userctxt.apid,
+ userctxt.ctid,
+ verbose);
if (context)
{
/* Delete this connection entry from internal table*/
if (dlt_daemon_context_del(daemon, context, verbose)==-1)
{
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgUnregisterContext)) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message unregister context\n");
- return -1;
- }
- snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "Can't delete ContextID '%.4s' for ApplicationID '%.4s' for user message unregister context\n", usercontext->ctid, usercontext->apid);
- dlt_log(LOG_WARNING,str);
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Can't delete CtID '%.4s' for ApID '%.4s' in %s\n",
+ userctxt.ctid,
+ userctxt.apid,
+ __func__);
+ dlt_log(LOG_WARNING, local_str);
return -1;
- } else
+ }
+ else
{
- snprintf(str, DLT_DAEMON_TEXTBUFSIZE, "Unregistered ContextID '%.4s' for ApplicationID '%.4s'\n", usercontext->ctid, usercontext->apid);
- dlt_daemon_log_internal(daemon, daemon_local, str, daemon_local->flags.vflag);
- dlt_log(LOG_DEBUG,str);
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Unregistered CtID '%.4s' for ApID '%.4s'\n",
+ userctxt.ctid,
+ userctxt.apid);
+ dlt_daemon_log_internal(daemon,
+ daemon_local,
+ local_str,
+ verbose);
+ dlt_log(LOG_DEBUG, local_str);
}
}
/* Create automatic unregister context response for unregistered context */
if (daemon_local->flags.rflag)
{
- dlt_daemon_control_message_unregister_context(DLT_DAEMON_SEND_TO_ALL,daemon,daemon_local,usercontext->apid, usercontext->ctid, "remo",verbose);
- }
-
- /* keep not read data in buffer */
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgUnregisterContext)) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message unregister context\n");
- return -1;
+ dlt_daemon_control_message_unregister_context(DLT_DAEMON_SEND_TO_ALL,
+ daemon,
+ daemon_local,
+ userctxt.apid,
+ userctxt.ctid,
+ "remo",
+ verbose);
}
return 0;
}
-int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose)
+int dlt_daemon_process_user_message_log(DltDaemon *daemon,
+ DltDaemonLocal *daemon_local,
+ DltReceiver *rec,
+ int verbose)
{
int ret;
int bytes_to_be_removed;
@@ -2568,13 +2507,17 @@ int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemo
PRINT_FUNCTION_VERBOSE(verbose);
- if ((daemon==0) || (daemon_local==0))
+ if ((daemon == NULL) || (daemon_local == NULL) || (rec == NULL))
{
dlt_log(LOG_ERR, "Invalid function parameters used for function dlt_daemon_process_user_message_log()\n");
- return DLT_DAEMON_ERROR_UNKNOWN;
+ return -DLT_DAEMON_ERROR_UNKNOWN;
}
- ret=dlt_message_read(&(daemon_local->msg),(unsigned char*)daemon_local->receiver.buf+sizeof(DltUserHeader),daemon_local->receiver.bytesRcvd-sizeof(DltUserHeader),0,verbose);
+ ret = dlt_message_read(&(daemon_local->msg),
+ (unsigned char*)rec->buf + sizeof(DltUserHeader),
+ rec->bytesRcvd - sizeof(DltUserHeader),
+ 0,
+ verbose);
if(ret!=DLT_MESSAGE_ERROR_OK)
{
if(ret!=DLT_MESSAGE_ERROR_SIZE)
@@ -2588,7 +2531,7 @@ int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemo
or the headers are corrupted (error case). */
dlt_log(LOG_DEBUG,"Can't read messages from receiver\n");
}
- return DLT_DAEMON_ERROR_UNKNOWN;
+ return -DLT_DAEMON_ERROR_UNKNOWN;
}
/* set overwrite ecu id */
@@ -2600,7 +2543,7 @@ int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemo
if (dlt_message_set_extraparameters(&(daemon_local->msg),0) == DLT_RETURN_ERROR)
{
dlt_log(LOG_WARNING,"Can't set message extra parameters in process user message log\n");
- return DLT_DAEMON_ERROR_UNKNOWN;
+ return -DLT_DAEMON_ERROR_UNKNOWN;
}
/* Correct value of timestamp, this was changed by dlt_message_set_extraparameters() */
@@ -2613,7 +2556,7 @@ int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemo
if (dlt_set_storageheader(daemon_local->msg.storageheader,daemon_local->msg.headerextra.ecu) == DLT_RETURN_ERROR)
{
dlt_log(LOG_WARNING,"Can't set storage header in process user message log\n");
- return DLT_DAEMON_ERROR_UNKNOWN;
+ return -DLT_DAEMON_ERROR_UNKNOWN;
}
}
else
@@ -2621,7 +2564,7 @@ int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemo
if (dlt_set_storageheader(daemon_local->msg.storageheader,daemon->ecuid) == DLT_RETURN_ERROR)
{
dlt_log(LOG_WARNING,"Can't set storage header in process user message log\n");
- return DLT_DAEMON_ERROR_UNKNOWN;
+ return -DLT_DAEMON_ERROR_UNKNOWN;
}
}
@@ -2680,136 +2623,160 @@ int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemo
bytes_to_be_removed += sizeof(dltSerialHeader);
}
- if (dlt_receiver_remove(&(daemon_local->receiver),bytes_to_be_removed) == DLT_RETURN_ERROR)
+ if (dlt_receiver_remove(rec, bytes_to_be_removed) == -1)
{
dlt_log(LOG_WARNING,"Can't remove bytes from receiver\n");
- return DLT_DAEMON_ERROR_UNKNOWN;
+ return -DLT_DAEMON_ERROR_UNKNOWN;
}
return DLT_DAEMON_ERROR_OK;
}
#ifdef DLT_SHM_ENABLE
-int dlt_daemon_process_user_message_log_shm(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose)
+#define DLT_SHM_RCV_BUFFER_SIZE 10000
+int dlt_daemon_process_user_message_log_shm(DltDaemon *daemon,
+ DltDaemonLocal *daemon_local,
+ DltReceiver *rec,
+ int verbose)
{
- int bytes_to_be_removed=0;
+ char local_str[DLT_DAEMON_TEXTBUFSIZE] = { '\0' };
int j,sent,third_value;
ssize_t ret;
- uint8_t rcv_buffer[10000];
+ uint8_t *rcv_buffer = NULL;
int size;
- DltUserHeader *userheader;
+ uint32_t len = sizeof(DltUserHeader);
+ DltUserHeader userheader;
static char text[DLT_DAEMON_TEXTSIZE];
PRINT_FUNCTION_VERBOSE(verbose);
- if ((daemon==0) || (daemon_local==0))
+ if ((daemon == NULL) || (daemon_local == NULL) || (rec == NULL))
{
- dlt_log(LOG_ERR, "Invalid function parameters used for function dlt_daemon_process_user_message_log()\n");
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Invalid function parameters used for %s\n",
+ __func__);
+
+ dlt_log(LOG_ERR, local_str);
return -1;
}
- userheader = (DltUserHeader*) (daemon_local->receiver.buf);
+ rcv_buffer = calloc(1, DLT_SHM_RCV_BUFFER_SIZE);
- //dlt_shm_status(&(daemon_local->dlt_shm));
- while (1)
+ if (!rcv_buffer)
{
- /* log message in SHM */
- if((size = dlt_shm_copy(&(daemon_local->dlt_shm),rcv_buffer,10000)) <= 0)
- break;
- if (dlt_message_read(&(daemon_local->msg),rcv_buffer,size,0,verbose)!=0) {
- break;
- dlt_log(LOG_WARNING,"Can't read messages from shm\n");
- return -1;
- }
- bytes_to_be_removed = daemon_local->msg.headersize+daemon_local->msg.datasize-sizeof(DltStorageHeader)+sizeof(DltUserHeader);
- if (daemon_local->msg.found_serialheader)
- {
- bytes_to_be_removed += sizeof(dltSerialHeader);
- }
-
- /* set overwrite ecu id */
- if (daemon_local->flags.evalue[0])
- {
- /* Set header extra parameters */
- dlt_set_id(daemon_local->msg.headerextra.ecu, daemon->ecuid );
- //msg.headerextra.seid = 0;
- if (dlt_message_set_extraparameters(&(daemon_local->msg),0)==-1)
- {
- dlt_log(LOG_WARNING,"Can't set message extra parameters in process user message log\n");
- dlt_shm_remove(&(daemon_local->dlt_shm));
- return -1;
- }
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "No memory to allocate receiver buffer in %s.\n",
+ __func__);
- /* Correct value of timestamp, this was changed by dlt_message_set_extraparameters() */
- daemon_local->msg.headerextra.tmsp = DLT_BETOH_32(daemon_local->msg.headerextra.tmsp);
- }
+ dlt_log(LOG_ERR, local_str);
- /* prepare storage header */
- if (DLT_IS_HTYP_WEID(daemon_local->msg.standardheader->htyp))
- {
- if (dlt_set_storageheader(daemon_local->msg.storageheader,daemon_local->msg.headerextra.ecu)==-1)
- {
- dlt_log(LOG_WARNING,"Can't set storage header in process user message log\n");
- dlt_shm_remove(&(daemon_local->dlt_shm));
- return -1;
- }
- }
- else
- {
- if (dlt_set_storageheader(daemon_local->msg.storageheader,daemon->ecuid)==-1)
- {
- dlt_log(LOG_WARNING,"Can't set storage header in process user message log\n");
- dlt_shm_remove(&(daemon_local->dlt_shm));
- return -1;
- }
- }
+ return -1;
+ }
- /* display message */
- if (daemon_local->flags.xflag)
- {
- if (dlt_message_print_hex(&(daemon_local->msg),text,DLT_DAEMON_TEXTSIZE,verbose)==-1)
- {
- dlt_log(LOG_WARNING,"dlt_message_print_hex() failed!\n");
- }
- } /* if */
- else if (daemon_local->flags.aflag)
- {
- if (dlt_message_print_ascii(&(daemon_local->msg),text,DLT_DAEMON_TEXTSIZE,verbose)==-1)
- {
- dlt_log(LOG_WARNING,"dlt_message_print_ascii() failed!\n");
- }
- } /* if */
- else if (daemon_local->flags.sflag)
- {
- if (dlt_message_print_header(&(daemon_local->msg),text,DLT_DAEMON_TEXTSIZE,verbose)==-1)
- {
- dlt_log(LOG_WARNING,"dlt_message_print_header() failed!\n");
- }
- /* print message header only */
- } /* if */
+ memset(&userheader, 0, len);
- sent=0;
+ if (dlt_receiver_check_and_get(rec, &userheader, len, 0) < 0)
+ {
+ /* Not enough bytes received */
+ return -1;
+ }
- /* write message to offline trace */
- if(((daemon->mode == DLT_USER_MODE_INTERNAL) || (daemon->mode == DLT_USER_MODE_BOTH)) && daemon_local->flags.offlineTraceDirectory[0])
- {
- dlt_offline_trace_write(&(daemon_local->offlineTrace),daemon_local->msg.headerbuffer,daemon_local->msg.headersize,
- daemon_local->msg.databuffer,daemon_local->msg.datasize,0,0);
- sent = 1;
- }
+ //dlt_shm_status(&(daemon_local->dlt_shm));
+ while (1)
+ {
+ /* log message in SHM */
+ size = dlt_shm_copy(&(daemon_local->dlt_shm),
+ rcv_buffer,
+ DLT_SHM_RCV_BUFFER_SIZE);
+ if(size <= 0)
+ break;
- /* look if TCP connection to client is available */
- if((daemon->mode == DLT_USER_MODE_EXTERNAL) ||
- (daemon->mode == DLT_USER_MODE_BOTH))
- {
- sent = dlt_daemon_client_send_all(daemon, daemon_local, verbose);
- }
+ if (dlt_message_read(&(daemon_local->msg),rcv_buffer,size,0,verbose)!=0) {
+ break;
+ dlt_log(LOG_WARNING,"Can't read messages from shm\n");
+ return -1;
+ }
+
+ /* set overwrite ecu id */
+ if (daemon_local->flags.evalue[0])
+ {
+ /* Set header extra parameters */
+ dlt_set_id(daemon_local->msg.headerextra.ecu, daemon->ecuid );
+ //msg.headerextra.seid = 0;
+ if (dlt_message_set_extraparameters(&(daemon_local->msg),0)==-1)
+ {
+ dlt_log(LOG_WARNING,"Can't set message extra parameters in process user message log\n");
+ dlt_shm_remove(&(daemon_local->dlt_shm));
+ return -1;
+ }
+
+ /* Correct value of timestamp, this was changed by dlt_message_set_extraparameters() */
+ daemon_local->msg.headerextra.tmsp = DLT_BETOH_32(daemon_local->msg.headerextra.tmsp);
+ }
+
+ /* prepare storage header */
+ if (DLT_IS_HTYP_WEID(daemon_local->msg.standardheader->htyp))
+ {
+ if (dlt_set_storageheader(daemon_local->msg.storageheader,daemon_local->msg.headerextra.ecu)==-1)
+ {
+ dlt_log(LOG_WARNING,"Can't set storage header in process user message log\n");
+ dlt_shm_remove(&(daemon_local->dlt_shm));
+ return -1;
+ }
+ }
+ else
+ {
+ if (dlt_set_storageheader(daemon_local->msg.storageheader,daemon->ecuid)==-1)
+ {
+ dlt_log(LOG_WARNING,"Can't set storage header in process user message log\n");
+ dlt_shm_remove(&(daemon_local->dlt_shm));
+ return -1;
+ }
+ }
+
+ /* display message */
+ if (daemon_local->flags.xflag)
+ {
+ if (dlt_message_print_hex(&(daemon_local->msg),text,DLT_DAEMON_TEXTSIZE,verbose)==-1)
+ {
+ dlt_log(LOG_WARNING,"dlt_message_print_hex() failed!\n");
+ }
+ } /* if */
+ else if (daemon_local->flags.aflag)
+ {
+ if (dlt_message_print_ascii(&(daemon_local->msg),text,DLT_DAEMON_TEXTSIZE,verbose)==-1)
+ {
+ dlt_log(LOG_WARNING,"dlt_message_print_ascii() failed!\n");
+ }
+ } /* if */
+ else if (daemon_local->flags.sflag)
+ {
+ if (dlt_message_print_header(&(daemon_local->msg),text,DLT_DAEMON_TEXTSIZE,verbose)==-1)
+ {
+ dlt_log(LOG_WARNING,"dlt_message_print_header() failed!\n");
+ }
+ /* print message header only */
+ } /* if */
+
+ sent=0;
+
+ /* write message to offline trace */
+ if(daemon_local->flags.offlineTraceDirectory[0])
+ {
+ dlt_offline_trace_write(&(daemon_local->offlineTrace),daemon_local->msg.headerbuffer,daemon_local->msg.headersize,
+ daemon_local->msg.databuffer,daemon_local->msg.datasize,0,0);
+ sent = 1;
+ }
+
+ sent = dlt_daemon_client_send_all(daemon, daemon_local, verbose);
/* Message was not sent to client, so store it in client ringbuffer */
- if (sent==1 || (daemon->mode == DLT_USER_MODE_OFF))
+ if (sent == 1)
{
- if(userheader->message == DLT_USER_MESSAGE_LOG_SHM) {
+ if(userheader.message == DLT_USER_MESSAGE_LOG_SHM) {
/* dlt message was sent, remove from buffer if log message from shm */
dlt_shm_remove(&(daemon_local->dlt_shm));
}
@@ -2819,23 +2786,21 @@ int dlt_daemon_process_user_message_log_shm(DltDaemon *daemon, DltDaemonLocal *d
/* dlt message was not sent, keep in buffer */
break;
}
-
- }
-
- /* keep not read data in buffer */
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader))==-1)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message overflow\n");
- return -1;
}
return 0;
}
+#undef DLT_SHM_RCV_BUFFER_SIZE
#endif
-int dlt_daemon_process_user_message_set_app_ll_ts(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose)
+int dlt_daemon_process_user_message_set_app_ll_ts(DltDaemon *daemon,
+ DltDaemonLocal *daemon_local,
+ DltReceiver *rec,
+ int verbose)
{
- DltUserControlMsgAppLogLevelTraceStatus *usercontext;
+ char local_str[DLT_DAEMON_TEXTBUFSIZE] = { '\0' };
+ uint32_t len = sizeof(DltUserControlMsgAppLogLevelTraceStatus);
+ DltUserControlMsgAppLogLevelTraceStatus userctxt;
DltDaemonApplication *application;
DltDaemonContext *context;
int i, offset_base;
@@ -2843,24 +2808,30 @@ int dlt_daemon_process_user_message_set_app_ll_ts(DltDaemon *daemon, DltDaemonLo
PRINT_FUNCTION_VERBOSE(verbose);
- if ((daemon==0) || (daemon_local==0))
+ if ((daemon == NULL) || (daemon_local == NULL) || (rec == NULL))
{
- dlt_log(LOG_ERR, "Invalid function parameters used for function dlt_daemon_process_user_message_set_app_ll_ts()\n");
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Invalid function parameters used for %s\n",
+ __func__);
+
+ dlt_log(LOG_ERR, local_str);
return -1;
}
- if (daemon_local->receiver.bytesRcvd < (int32_t)(sizeof(DltUserHeader)+sizeof(DltUserControlMsgAppLogLevelTraceStatus )))
+ memset(&userctxt, 0, len);
+ if (dlt_receiver_check_and_get(rec, &userctxt, len, 1) < 0)
{
- /* Not enough bytes receeived */
+ /* Not enough bytes received */
return -1;
}
if (daemon->num_applications>0)
{
- usercontext = (DltUserControlMsgAppLogLevelTraceStatus*) (daemon_local->receiver.buf+sizeof(DltUserHeader));
-
/* Get all contexts with application id matching the received application id */
- application = dlt_daemon_application_find(daemon, usercontext->apid, verbose);
+ application = dlt_daemon_application_find(daemon,
+ userctxt.apid,
+ verbose);
if (application)
{
/* Calculate start offset within contexts[] */
@@ -2876,10 +2847,10 @@ int dlt_daemon_process_user_message_set_app_ll_ts(DltDaemon *daemon, DltDaemonLo
if (context)
{
old_log_level = context->log_level;
- context->log_level = usercontext->log_level; /* No endianess conversion necessary*/
+ context->log_level = userctxt.log_level; /* No endianess conversion necessary*/
old_trace_status = context->trace_status;
- context->trace_status = usercontext->trace_status; /* No endianess conversion necessary */
+ context->trace_status = userctxt.trace_status; /* No endianess conversion necessary */
/* The folowing function sends also the trace status */
if (context->user_handle >= DLT_FD_MINIMUM && dlt_daemon_user_send_log_level(daemon, context, verbose)!=0)
@@ -2892,19 +2863,16 @@ int dlt_daemon_process_user_message_set_app_ll_ts(DltDaemon *daemon, DltDaemonLo
}
}
- /* keep not read data in buffer */
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgAppLogLevelTraceStatus)) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver\n");
- return -1;
- }
-
return 0;
}
-int dlt_daemon_process_user_message_log_mode(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose)
+int dlt_daemon_process_user_message_log_mode(DltDaemon *daemon,
+ DltDaemonLocal *daemon_local,
+ DltReceiver *rec,
+ int verbose)
{
- DltUserControlMsgLogMode *logmode;
+ DltUserControlMsgLogMode userctxt;
+ uint32_t len = sizeof(DltUserControlMsgLogMode);
PRINT_FUNCTION_VERBOSE(verbose);
@@ -2914,41 +2882,45 @@ int dlt_daemon_process_user_message_log_mode(DltDaemon *daemon, DltDaemonLocal *
return -1;
}
- if (daemon_local->receiver.bytesRcvd < (int32_t)(sizeof(DltUserHeader)+sizeof(DltUserControlMsgLogMode)))
+ memset(&userctxt, 0, len);
+ if (dlt_receiver_check_and_get(rec, &userctxt, len, 1) < 0)
{
/* Not enough bytes received */
return -1;
}
- logmode = (DltUserControlMsgLogMode*) (daemon_local->receiver.buf+sizeof(DltUserHeader));
-
/* set the new log mode */
- daemon->mode = logmode->log_mode;
+ daemon->mode = userctxt.log_mode;
/* write configuration persistantly */
dlt_daemon_configuration_save(daemon, daemon->runtime_configuration, verbose);
- /* keep not read data in buffer */
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgLogMode)) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_WARNING,"Can't remove bytes from receiver for user message log mode\n");
- return -1;
- }
-
return 0;
}
-int dlt_daemon_process_user_message_marker(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose)
+int dlt_daemon_process_user_message_marker(DltDaemon *daemon,
+ DltDaemonLocal *daemon_local,
+ DltReceiver *rec,
+ int verbose)
{
+ char local_str[DLT_DAEMON_TEXTBUFSIZE] = { '\0' };
+ uint32_t len = sizeof(DltUserControlMsgLogMode);
+ DltUserControlMsgLogMode userctxt;
PRINT_FUNCTION_VERBOSE(verbose);
- if ((daemon==0) || (daemon_local==0))
+ if ((daemon == NULL) || (daemon_local == NULL) || (rec == NULL))
{
- dlt_log(LOG_ERR, "Invalid function parameters used for function dlt_daemon_process_user_message_marker()\n");
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Invalid function parameters used for %s\n",
+ __func__);
+
+ dlt_log(LOG_ERR, local_str);
return -1;
}
- if (daemon_local->receiver.bytesRcvd < (int32_t)(sizeof(DltUserHeader)))
+ memset(&userctxt, 0, len);
+ if (dlt_receiver_check_and_get(rec, &userctxt, len, 1) < 0)
{
/* Not enough bytes received */
return -1;
@@ -2957,13 +2929,6 @@ int dlt_daemon_process_user_message_marker(DltDaemon *daemon, DltDaemonLocal *da
/* Create automatic unregister context response for unregistered context */
dlt_daemon_control_message_marker(DLT_DAEMON_SEND_TO_ALL,daemon,daemon_local,verbose);
- /* keep not read data in buffer */
- if (dlt_receiver_remove(&(daemon_local->receiver),sizeof(DltUserHeader)+sizeof(DltUserControlMsgLogMode)) == DLT_RETURN_ERROR)
- {
- dlt_log(LOG_ERR,"Can't remove bytes from receiver for user message log mode\n");
- return -1;
- }
-
return 0;
}
@@ -3028,49 +2993,58 @@ int dlt_daemon_send_ringbuffer_to_client(DltDaemon *daemon, DltDaemonLocal *daem
return DLT_DAEMON_ERROR_OK;
}
+static char dlt_timer_conn_types[DLT_TIMER_UNKNOWN + 1] = {
+ [DLT_TIMER_PACKET] = DLT_CONNECTION_ONE_S_TIMER,
+ [DLT_TIMER_ECU] = DLT_CONNECTION_SIXTY_S_TIMER,
+#ifdef DLT_SYSTEMD_WATCHDOG_ENABLE
+ [DLT_TIMER_SYSTEMD] = DLT_CONNECTION_SYSTEMD_TIMER,
+#endif
+ [DLT_TIMER_GATEWAY] = DLT_CONNECTION_GATEWAY_TIMER,
+ [DLT_TIMER_UNKNOWN] = DLT_CONNECTION_TYPE_MAX
+};
+
static char dlt_timer_names[DLT_TIMER_UNKNOWN + 1][32] = {
[DLT_TIMER_PACKET] = "Timing packet",
[DLT_TIMER_ECU] = "ECU version",
#ifdef DLT_SYSTEMD_WATCHDOG_ENABLE
[DLT_TIMER_SYSTEMD] = "Systemd watchdog",
#endif
+ [DLT_TIMER_GATEWAY] = "Gateway",
[DLT_TIMER_UNKNOWN] = "Unknown timer"
};
int create_timer_fd(DltDaemonLocal *daemon_local,
int period_sec,
int starts_in,
- int* fd,
DltTimers timer_id)
{
int local_fd = -1;
struct itimerspec l_timer_spec;
- char *timer_name = dlt_timer_names[timer_id];
+ char *timer_name = NULL;
- if(timer_name == NULL)
- {
- timer_name = "timer_not_named";
+ if (timer_id >= DLT_TIMER_UNKNOWN) {
+ dlt_log(DLT_LOG_ERROR, "Unknown timer.");
+ return -1;
}
+ timer_name = dlt_timer_names[timer_id];
+
if(daemon_local == NULL)
{
dlt_log(DLT_LOG_ERROR, "Daemaon local structure is NULL");
return -1;
}
- if( fd == NULL )
- {
- snprintf(str, sizeof(str), "<%s> fd is NULL pointer\n", timer_name );
- dlt_log(LOG_WARNING, str);
- return -1;
- }
-
- if( period_sec > 0 ) {
+ if(period_sec > 0) {
#ifdef linux
local_fd = timerfd_create(CLOCK_MONOTONIC, 0);
if( local_fd < 0)
{
- snprintf(str, sizeof(str), "<%s> timerfd_create failed: %s\n", timer_name, strerror(errno));
+ snprintf(str,
+ sizeof(str),
+ "<%s> timerfd_create failed: %s\n",
+ timer_name,
+ strerror(errno));
dlt_log(LOG_WARNING, str);
}
@@ -3079,9 +3053,13 @@ int create_timer_fd(DltDaemonLocal *daemon_local,
l_timer_spec.it_value.tv_sec = starts_in;
l_timer_spec.it_value.tv_nsec = 0;
- if( timerfd_settime( local_fd, 0, &l_timer_spec, NULL) < 0)
+ if( timerfd_settime(local_fd, 0, &l_timer_spec, NULL) < 0)
{
- snprintf(str, sizeof(str), "<%s> timerfd_settime failed: %s\n", timer_name, strerror(errno));
+ snprintf(str,
+ sizeof(str),
+ "<%s> timerfd_settime failed: %s\n",
+ timer_name,
+ strerror(errno));
dlt_log(LOG_WARNING, str);
local_fd = -1;
}
@@ -3107,9 +3085,11 @@ int create_timer_fd(DltDaemonLocal *daemon_local,
dlt_log(LOG_INFO, str);
}
- *fd = local_fd;
-
- return local_fd;
+ return dlt_connection_create(daemon_local,
+ &daemon_local->pEvent,
+ local_fd,
+ EPOLLIN,
+ dlt_timer_conn_types[timer_id]);
}
/* Close connection function */
diff --git a/src/daemon/dlt-daemon.h b/src/daemon/dlt-daemon.h
index 7f26d82..ad169fc 100644
--- a/src/daemon/dlt-daemon.h
+++ b/src/daemon/dlt-daemon.h
@@ -134,18 +134,10 @@ typedef struct
typedef struct
{
DltDaemonFlags flags; /**< flags of the daemon */
- int fp; /**< handle for own fifo */
- int sock; /**< handle for tcp connection to client */
- int fdserial; /**< handle for serial connection */
- int ctrlsock; /**< handle for control socket connection */
DltFile file; /**< struct for file access */
DltEventHandler pEvent; /**< struct for message producer event handling */
DltGateway pGateway; /**< struct for passive node connection handling */
DltMessage msg; /**< one dlt message */
- DltReceiver receiver; /**< receiver for fifo connection */
- DltReceiver receiverSock; /**< receiver for socket connection */
- DltReceiver receiverSerial; /**< receiver for serial connection */
- DltReceiver receiverCtrlSock; /**< receiver for control socket */
int client_connections; /**< counter for nr. of client connections */
size_t baudrate; /**< Baudrate of serial connection */
#ifdef DLT_SHM_ENABLE
@@ -156,12 +148,6 @@ typedef struct
unsigned long RingbufferMinSize;
unsigned long RingbufferMaxSize;
unsigned long RingbufferStepSize;
- DltReceiver timer_one_s;
- DltReceiver timer_sixty_s;
-#if defined(DLT_SYSTEMD_WATCHDOG_ENABLE)
- DltReceiver timer_wd; /**< file descriptor for watchdog timer */
-#endif
- DltReceiver timer_gateway; /**< timer for gateway reconnection handling */
} DltDaemonLocal;
typedef struct
@@ -204,19 +190,20 @@ int dlt_daemon_process_systemd_timer(DltDaemon *daemon, DltDaemonLocal *daemon_l
int dlt_daemon_process_control_connect(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *recv, int verbose);
int dlt_daemon_process_control_messages(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *recv, int verbose);
-int dlt_daemon_process_user_message_overflow(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose);
+typedef int (*dlt_daemon_process_user_message_func)(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *rec, int verbose);
+
+int dlt_daemon_process_user_message_overflow(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *rec, int verbose);
int dlt_daemon_send_message_overflow(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose);
-int dlt_daemon_process_user_message_register_application(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose);
-int dlt_daemon_process_user_message_unregister_application(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose);
-int dlt_daemon_process_user_message_register_context(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose);
-int dlt_daemon_process_user_message_unregister_context(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose);
-int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose);
+int dlt_daemon_process_user_message_register_application(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *rec, int verbose);
+int dlt_daemon_process_user_message_unregister_application(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *rec, int verbose);
+int dlt_daemon_process_user_message_register_context(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *rec, int verbose);
+int dlt_daemon_process_user_message_unregister_context(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *rec, int verbose);
+int dlt_daemon_process_user_message_log(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *rec, int verbose);
#ifdef DLT_SHM_ENABLE
-int dlt_daemon_process_user_message_log_shm(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose);
+int dlt_daemon_process_user_message_log_shm(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *rec, int verbose);
#endif
-int dlt_daemon_process_user_message_set_app_ll_ts(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose);
-int dlt_daemon_process_user_message_log_mode(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose);
-int dlt_daemon_process_user_message_marker(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose);
+int dlt_daemon_process_user_message_set_app_ll_ts(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *rec, int verbose);
+int dlt_daemon_process_user_message_marker(DltDaemon *daemon, DltDaemonLocal *daemon_local, DltReceiver *rec, int verbose);
int dlt_daemon_send_ringbuffer_to_client(DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose);
void dlt_daemon_timingpacket_thread(void *ptr);
@@ -225,7 +212,7 @@ void dlt_daemon_ecu_version_thread(void *ptr);
void dlt_daemon_systemd_watchdog_thread(void *ptr);
#endif
-int create_timer_fd(DltDaemonLocal *daemon_local, int period_sec, int starts_in, int* fd, DltTimers timer);
+int create_timer_fd(DltDaemonLocal *daemon_local, int period_sec, int starts_in, DltTimers timer);
int dlt_daemon_close_socket(int sock, DltDaemon *daemon, DltDaemonLocal *daemon_local, int verbose);
diff --git a/src/daemon/dlt_daemon_client.c b/src/daemon/dlt_daemon_client.c
index 55413c5..efd8dae 100644
--- a/src/daemon/dlt_daemon_client.c
+++ b/src/daemon/dlt_daemon_client.c
@@ -133,7 +133,7 @@ static int dlt_daemon_client_send_all_multiple(DltDaemon *daemon,
if((ret != DLT_DAEMON_ERROR_OK) &&
DLT_CONNECTION_CLIENT_MSG_TCP == temp->type)
{
- dlt_daemon_close_socket(temp->fd,
+ dlt_daemon_close_socket(temp->receiver->fd,
daemon,
daemon_local,
verbose);
diff --git a/src/daemon/dlt_daemon_connection.c b/src/daemon/dlt_daemon_connection.c
index 1629cc3..755e76a 100644
--- a/src/daemon/dlt_daemon_connection.c
+++ b/src/daemon/dlt_daemon_connection.c
@@ -67,7 +67,7 @@ static int dlt_connection_send(DltConnection *conn,
{
DltConnectionType type = DLT_CONNECTION_TYPE_MAX;
- if (conn != NULL)
+ if ((conn != NULL) && (conn->receiver != NULL))
{
type = conn->type;
}
@@ -75,9 +75,9 @@ static int dlt_connection_send(DltConnection *conn,
switch (type)
{
case DLT_CONNECTION_CLIENT_MSG_SERIAL:
- return write(conn->fd, msg, msg_size);
+ return write(conn->receiver->fd, msg, msg_size);
case DLT_CONNECTION_CLIENT_MSG_TCP:
- return send(conn->fd, msg, msg_size, 0);
+ return send(conn->receiver->fd, msg, msg_size, 0);
default:
return -1;
}
@@ -158,6 +158,23 @@ DltConnection *dlt_connection_get_next(DltConnection *current, int type_mask)
return current;
}
+static void dlt_connection_destroy_receiver(DltConnection *con)
+{
+ if (!con)
+ return;
+
+ switch (con->type)
+ {
+ case DLT_CONNECTION_GATEWAY:
+ /* We rely on the gateway for clean-up */
+ break;
+ default:
+ (void) dlt_receiver_free(con->receiver);
+ free(con->receiver);
+ break;
+ }
+}
+
/** @brief Get the receiver structure associated to a connection.
*
* The receiver structure is sometimes needed while handling the event.
@@ -168,56 +185,56 @@ DltConnection *dlt_connection_get_next(DltConnection *current, int type_mask)
*
* @param dameon_local Structure where to take the DltReceiver pointer from.
* @param type Type of the connection.
+ * @param fd File descriptor
*
* @return DltReceiver structure or NULL if none corresponds to the type.
*/
static DltReceiver *dlt_connection_get_receiver(DltDaemonLocal *daemon_local,
- DltConnectionType type,
- int fd)
+ DltConnectionType type,
+ int fd)
{
DltReceiver *ret = NULL;
switch (type)
{
+ case DLT_CONNECTION_CONTROL_CONNECT:
+ /* FALL THROUGH */
+ case DLT_CONNECTION_CONTROL_MSG:
+ /* FALL THROUGH */
case DLT_CONNECTION_CLIENT_CONNECT:
/* FALL THROUGH */
- /* There must be the same structure for this case */
case DLT_CONNECTION_CLIENT_MSG_TCP:
- ret = &daemon_local->receiverSock;
+ ret = calloc(1, sizeof(DltReceiver));
+ if (ret) {
+ dlt_receiver_init(ret, fd, DLT_DAEMON_RCVBUFSIZESOCK);
+ }
break;
case DLT_CONNECTION_CLIENT_MSG_SERIAL:
- ret = &daemon_local->receiverSerial;
+ ret = calloc(1, sizeof(DltReceiver));
+ if (ret) {
+ dlt_receiver_init(ret, fd, DLT_DAEMON_RCVBUFSIZESERIAL);
+ }
break;
case DLT_CONNECTION_APP_MSG:
- ret = &daemon_local->receiver;
- break;
+ /* FALL THROUGH */
case DLT_CONNECTION_ONE_S_TIMER:
- ret = &daemon_local->timer_one_s;
- break;
+ /* FALL THROUGH */
case DLT_CONNECTION_SIXTY_S_TIMER:
- ret = &daemon_local->timer_sixty_s;
- break;
#ifdef DLT_SYSTEMD_WATCHDOG_ENABLE
+ /* FALL THROUGH */
case DLT_CONNECTION_SYSTEMD_TIMER:
- ret = &daemon_local->timer_wd;
- break;
#endif
- case DLT_CONNECTION_CONTROL_CONNECT:
/* FALL THROUGH */
- /* There must be the same structure for this case */
- case DLT_CONNECTION_CONTROL_MSG:
- ret = &daemon_local->receiverCtrlSock;
+ case DLT_CONNECTION_GATEWAY_TIMER:
+ ret = calloc(1, sizeof(DltReceiver));
+ if (ret) {
+ dlt_receiver_init(ret, fd, DLT_DAEMON_RCVBUFSIZE);
+ }
break;
case DLT_CONNECTION_GATEWAY:
- /* FIXME: This is complete different approach compared to having the
- * receiver as part of daemon_local structure. Approaches need
- * to be harmonized.
- */
+ /* We rely on the gateway for init */
ret = dlt_gateway_get_connection_receiver(&daemon_local->pGateway, fd);
break;
- case DLT_CONNECTION_GATEWAY_TIMER:
- ret = &daemon_local->timer_gateway;
- break;
default:
ret = NULL;
}
@@ -301,7 +318,8 @@ void *dlt_connection_get_callback(DltConnection *con)
*/
void dlt_connection_destroy(DltConnection *to_destroy)
{
- close(to_destroy->fd);
+ close(to_destroy->receiver->fd);
+ dlt_connection_destroy_receiver(to_destroy);
free(to_destroy);
}
@@ -328,6 +346,11 @@ int dlt_connection_create(DltDaemonLocal *daemon_local,
{
DltConnection *temp = NULL;
+ if (fd < 0) {
+ /* Nothing to do */
+ return 0;
+ }
+
if (dlt_event_handler_find_connection(evh, fd) != NULL)
{
/* No need for the same client to be registered twice
@@ -348,57 +371,24 @@ int dlt_connection_create(DltDaemonLocal *daemon_local,
memset(temp, 0, sizeof(DltConnection));
- temp->fd = fd;
- temp->type = type;
temp->receiver = dlt_connection_get_receiver(daemon_local, type, fd);
+ if (!temp->receiver) {
+ char local_str[DLT_DAEMON_TEXTBUFSIZE];
+ snprintf(local_str,
+ DLT_DAEMON_TEXTBUFSIZE,
+ "Unable to get receiver from %d connection.\n",
+ type);
+
+ dlt_log(LOG_CRIT, local_str);
+ free(temp);
+ return -1;
+ }
+
+ temp->type = type;
+ temp->status = ACTIVE;
/* Now give the ownership of the newly created connection
* to the event handler, by registering for events.
*/
return dlt_event_handler_register_connection(evh, daemon_local, temp, mask);
}
-
-/** @brief Creates connection from all types.
- *
- * This functions run through all connection types and tries to register
- * on the event handler the one that were not already registered.
- *
- * @param daemon_local Structure to retrieve information from.
- *
- * @return 0 on success, -1 if a failure occurs.
- */
-int dlt_connection_create_remaining(DltDaemonLocal *daemon_local)
-{
- DltConnectionType i = 0;
- DltEventHandler *ev = &daemon_local->pEvent;
- char local_str[DLT_DAEMON_TEXTBUFSIZE];
-
- for (i = 0 ; i < DLT_CONNECTION_TYPE_MAX ; i++)
- {
- int fd = 0;
- DltReceiver *rec = dlt_connection_get_receiver(daemon_local, i, fd);
-
- if (rec == NULL)
- {
- /* We are not interested if there is no receiver available */
- continue;
- }
-
- fd = rec->fd;
-
- /* Already created connections are ignored here */
- if ((fd > 0) && dlt_connection_create(daemon_local, ev, fd, EPOLLIN, i))
- {
- snprintf(local_str,
- DLT_DAEMON_TEXTBUFSIZE,
- "Unable to register type %i event handler.\n",
- i);
-
- dlt_log(LOG_ERR, local_str);
-
- return -1;
- }
- }
-
- return 0;
-}
diff --git a/src/daemon/dlt_daemon_connection_types.h b/src/daemon/dlt_daemon_connection_types.h
index 5edb875..353889c 100644
--- a/src/daemon/dlt_daemon_connection_types.h
+++ b/src/daemon/dlt_daemon_connection_types.h
@@ -32,6 +32,14 @@
#include "dlt_common.h"
typedef enum {
+ UNDEFINED, /* Undefined status */
+ INACTIVE, /* Connection is inactive, excluded from epoll handling */
+ ACTIVE, /* Connection is actively handled by epoll */
+ DEACTIVATE,/* Request for deactivation of the connection */
+ ACTIVATE /* Request for activation of the connection */
+} DltConnectionStatus;
+
+typedef enum {
DLT_CONNECTION_CLIENT_CONNECT = 0,
DLT_CONNECTION_CLIENT_MSG_TCP,
DLT_CONNECTION_CLIENT_MSG_SERIAL,
@@ -63,9 +71,9 @@ typedef enum {
* and remove any other duplicates of FDs
*/
typedef struct DltConnection {
- int fd; /**< File descriptor */
+ DltReceiver *receiver; /**< Receiver structure for this connection */
DltConnectionType type; /**< Represents what type of handle is this (like FIFO, serial, client, server) */
- DltReceiver *receiver; /**< Pointer to the affected receiver structure */
+ DltConnectionStatus status; /**< Status of connection */
struct DltConnection *next; /**< For multiple client connection using linked list */
} DltConnection;
diff --git a/src/daemon/dlt_daemon_event_handler.c b/src/daemon/dlt_daemon_event_handler.c
index b149ea6..23288f6 100644
--- a/src/daemon/dlt_daemon_event_handler.c
+++ b/src/daemon/dlt_daemon_event_handler.c
@@ -120,13 +120,14 @@ int dlt_daemon_handle_event(DltEventHandler *pEvent,
for (i = 0 ; i < nfds ; i++)
{
struct epoll_event *ev = &pEvent->events[i];
+ DltConnection *con = (DltConnection *)ev->data.ptr;
int fd = 0;
DltConnectionType type = DLT_CONNECTION_TYPE_MAX;
- if ((DltConnection *)ev->data.ptr)
+ if (con && con->receiver)
{
- type = ((DltConnection *)ev->data.ptr)->type;
- fd = ((DltConnection *)ev->data.ptr)->fd;
+ type = con->type;
+ fd = con->receiver->fd;
}
/* First of all handle epoll error events
@@ -142,8 +143,9 @@ int dlt_daemon_handle_event(DltEventHandler *pEvent,
type);
continue;
}
+
/* Get the function to be used to handle the event */
- callback = dlt_connection_get_callback((DltConnection *)ev->data.ptr);
+ callback = dlt_connection_get_callback(con);
if (!callback)
{
@@ -155,14 +157,10 @@ int dlt_daemon_handle_event(DltEventHandler *pEvent,
return -1;
}
- /* TODO: Review the design to clean-up this line.
- * fd are currently wrongly duplicated which may lead to errors. */
- ((DltConnection *)ev->data.ptr)->receiver->fd = fd;
-
/* From now on, callback is correct */
if (callback(daemon,
daemon_local,
- ((DltConnection *)ev->data.ptr)->receiver,
+ con->receiver,
daemon_local->flags.vflag) == -1)
{
snprintf(str,
@@ -192,7 +190,7 @@ DltConnection *dlt_event_handler_find_connection(DltEventHandler *ev,
{
DltConnection *temp = ev->connections;
- while ((temp != NULL) && (temp->fd != fd))
+ while ((temp != NULL) && (temp->receiver->fd != fd))
{
temp = temp->next;
}
@@ -300,13 +298,21 @@ int dlt_event_handler_register_connection(DltEventHandler *evhdl,
int mask)
{
struct epoll_event ev; /* Content will be copied by the kernel */
+ int fd = -1;
+
+ if (!evhdl || !connection || !connection->receiver) {
+ dlt_log(LOG_ERR, "Wrong parameters when registering connection.\n");
+ return -1;
+ }
+
+ fd = connection->receiver->fd;
dlt_daemon_add_connection(evhdl, connection);
ev.events = mask;
ev.data.ptr = (void *)connection;
- if (epoll_ctl(evhdl->epfd, EPOLL_CTL_ADD, connection->fd, &ev) == -1)
+ if (epoll_ctl(evhdl->epfd, EPOLL_CTL_ADD, fd, &ev) == -1)
{
dlt_log(LOG_ERR, "epoll_ctl() failed!\n");
dlt_daemon_remove_connection(evhdl, connection);
@@ -352,13 +358,8 @@ int dlt_event_handler_unregister_connection(DltEventHandler *evhdl,
return -1;
}
- if (epoll_ctl(evhdl->epfd, EPOLL_CTL_DEL, fd, NULL) < 0)
- {
- dlt_log(LOG_ERR, "Unable to unregister event.\n");
- return -1;
- }
-
- if ((type == DLT_CONNECTION_CLIENT_MSG_TCP) || (type == DLT_CONNECTION_CLIENT_MSG_SERIAL))
+ if ((type == DLT_CONNECTION_CLIENT_MSG_TCP) ||
+ (type == DLT_CONNECTION_CLIENT_MSG_SERIAL))
{
daemon_local->client_connections--;
diff --git a/src/shared/dlt_common.c b/src/shared/dlt_common.c
index 2448e70..1eee17d 100644
--- a/src/shared/dlt_common.c
+++ b/src/shared/dlt_common.c
@@ -38,6 +38,7 @@
#include <errno.h>
#include <sys/stat.h> /* for mkdir() */
+#include "dlt_user_shared.h"
#include "dlt_common.h"
#include "dlt_common_cfg.h"
@@ -2266,6 +2267,44 @@ DltReturnValue dlt_receiver_move_to_begin(DltReceiver *receiver)
return DLT_RETURN_OK;
}
+int dlt_receiver_check_and_get(DltReceiver *receiver,
+ void *dest,
+ unsigned int to_get,
+ unsigned int skip_header)
+{
+ unsigned int min_size = to_get;
+ void *src = NULL;
+
+ if (skip_header) {
+ min_size += sizeof(DltUserHeader);
+ }
+
+ if (!receiver ||
+ (receiver->bytesRcvd < (int32_t)min_size) ||
+ !receiver->buf ||
+ !dest) {
+ return -1;
+ }
+
+ src = (void *)receiver->buf;
+
+ if (skip_header) {
+ src += sizeof(DltUserHeader);
+ }
+
+ memset(dest, 0, to_get);
+
+ memcpy(dest, src, to_get);
+
+ if (dlt_receiver_remove(receiver, min_size) == -1)
+ {
+ dlt_log(LOG_WARNING,"Can't remove bytes from receiver\n");
+ return -1;
+ }
+
+ return to_get;
+}
+
DltReturnValue dlt_set_storageheader(DltStorageHeader *storageheader, const char *ecu)
{
diff --git a/src/shared/dlt_user_shared_cfg.h b/src/shared/dlt_user_shared_cfg.h
index dc31e4d..5bfdba7 100644
--- a/src/shared/dlt_user_shared_cfg.h
+++ b/src/shared/dlt_user_shared_cfg.h
@@ -92,6 +92,7 @@
#define DLT_USER_MESSAGE_LOG_MODE 11
#define DLT_USER_MESSAGE_LOG_STATE 12
#define DLT_USER_MESSAGE_MARKER 13
+#define DLT_USER_MESSAGE_NOT_SUPPORTED 16
/* Internal defined values */