diff options
author | Martin Ejdestig <martin.ejdestig@volvocars.com> | 2020-12-14 01:43:52 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-14 09:43:52 +0900 |
commit | 8f5e3dc0f3134ea2fdaffd13a16464b1a2f2ecd4 (patch) | |
tree | cd371956f6098d4d7e9e0937a929e87e5e5f0f71 /src/shared | |
parent | 329ba78deb40558df30aa8731928c9887197d30b (diff) | |
download | DLT-daemon-8f5e3dc0f3134ea2fdaffd13a16464b1a2f2ecd4.tar.gz |
Add support for logging with VSOCK (#255)
For more information about VSOCK, see "man vsock"
( https://man7.org/linux/man-pages/man7/vsock.7.html ).
Makes it possible for processes in a virtual machine to log directly in
DLT running on host without setting up a network connection between
guest and host. It is also probably more efficient. Have not done any
performance measurements (not main reason for patch), but no forwarding
is required as when running DLT in a multi-node setup.
When building dlt-daemon for host, WITH_DLT_DAEMON_VSOCK_IPC should be
enabled for daemon to listen on incoming VSOCK requests. Local
communication method between applications and daemon is still determined
with DLT_IPC. When building for guest, WITH_DLT_LIB_VSOCK_IPC should be
enabled and DLT_IPC will be ignored, which will make libdlt open a VSOCK
socket to the deamon for logging messages.
VSOCK can be tested without a virtual machine. Since VMADDR_CID_HOST is
used by libdlt when connecting, see vsock man page, clients can be run
on host to test VSOCK communication.
Some modifications has been done to be able to handle logging through
FIFO pipe and socket in the same build of dlt-daemon:
- dlt_receiver_init/free_unix_socket() is renamed to
dlt_receiver_init/free_global_buffer() and used for FIFO as well.
Also fixes memory leak since dlt_receiver_free_unix_socket() was used
regardless of whether DLT_USE_UNIX_SOCKET was defined or not.
- Pass type to dlt_receiver_init() instead of dlt_receiver_receive().
And remove preprocessor conditionals for handling
DLT_CONNECTION_APP_MSG in dlt_daemon_process_user_messages(). Also
fixes wrong enum type being passed to dlt_receiver_receive() in
dlt_client.c (DltClient::mode was used as a DltReceiverType enum but
it is a DltClientMode enum).
- Add a flag to DltDaemonApplication to indicate whether file descriptor
is "owned" by the DltDaemonApplication or not. When
dlt_daemon_application_add() is called due to message received on a
socket, fd is passed as an argument (app does not own fd). For FIFO,
a per application FIFO is opened (app owns the fd). Also fixes so that
user handle is reset for both application and all its contexts when
resetting any. Prevents fd from being used by accident after it has
been closed.
dlt_mkdir_recursive() is moved to src/daemon since it is only used in
the daemon. Minimizes use of DLT_USE_UNIX_SOCKET_IPC.
Other bugfixes:
- Call DLT_SEM_FREE() if setting socket to O_NONBLOCK fails in
src/lib/dlt_user.c:dlt_initialize_socket_connection().
- Close socket if dlt_receiver_init() fails in
src/lib/dlt_user.c:dlt_initialize_socket_connection().
Signed-off-by: Martin Ejdestig <martin.ejdestig@volvocars.com>
Diffstat (limited to 'src/shared')
-rw-r--r-- | src/shared/dlt_common.c | 58 |
1 files changed, 12 insertions, 46 deletions
diff --git a/src/shared/dlt_common.c b/src/shared/dlt_common.c index 615665c..d545fe0 100644 --- a/src/shared/dlt_common.c +++ b/src/shared/dlt_common.c @@ -66,7 +66,7 @@ const char dltSerialHeader[DLT_ID_SIZE] = { 'D', 'L', 'S', 1 }; char dltSerialHeaderChar[DLT_ID_SIZE] = { 'D', 'L', 'S', 1 }; -#ifndef DLT_USE_UNIX_SOCKET_IPC +#if defined DLT_DAEMON_USE_FIFO_IPC || defined DLT_LIB_USE_FIFO_IPC char dltFifoBaseDir[DLT_PATH_MAX] = "/tmp"; #endif @@ -1736,7 +1736,7 @@ void dlt_log_set_filename(const char *filename) logging_filename[NAME_MAX] = 0; } -#ifndef DLT_USE_UNIX_SOCKET_IPC +#if defined DLT_DAEMON_USE_FIFO_IPC || defined DLT_LIB_USE_FIFO_IPC void dlt_log_set_fifo_basedir(const char *pipe_dir) { strncpy(dltFifoBaseDir, pipe_dir, DLT_PATH_MAX); @@ -1921,12 +1921,13 @@ DltReturnValue dlt_vnlog(int prio, size_t size, const char *format, ...) return DLT_RETURN_OK; } -DltReturnValue dlt_receiver_init(DltReceiver *receiver, int fd, int buffersize) +DltReturnValue dlt_receiver_init(DltReceiver *receiver, int fd, DltReceiverType type, int buffersize) { if (NULL == receiver) return DLT_RETURN_WRONG_PARAMETER; receiver->fd = fd; + receiver->type = type; /** Reuse the receiver buffer if it exists and the buffer size * is not changed. If not, free the old one and allocate a new buffer. @@ -1957,7 +1958,7 @@ DltReturnValue dlt_receiver_init(DltReceiver *receiver, int fd, int buffersize) return DLT_RETURN_OK; } -DltReturnValue dlt_receiver_init_unix_socket(DltReceiver *receiver, int fd, char **buffer) +DltReturnValue dlt_receiver_init_global_buffer(DltReceiver *receiver, int fd, DltReceiverType type, char **buffer) { if (receiver == NULL) return DLT_RETURN_WRONG_PARAMETER; @@ -1977,6 +1978,7 @@ DltReturnValue dlt_receiver_init_unix_socket(DltReceiver *receiver, int fd, char receiver->totalBytesRcvd = 0; receiver->buffersize = DLT_RECEIVE_BUFSIZE; receiver->fd = fd; + receiver->type = type; receiver->buffer = *buffer; receiver->backup_buf = NULL; receiver->buf = receiver->buffer; @@ -2003,7 +2005,7 @@ DltReturnValue dlt_receiver_free(DltReceiver *receiver) return DLT_RETURN_OK; } -DltReturnValue dlt_receiver_free_unix_socket(DltReceiver *receiver) +DltReturnValue dlt_receiver_free_global_buffer(DltReceiver *receiver) { if (receiver == NULL) @@ -2019,7 +2021,7 @@ DltReturnValue dlt_receiver_free_unix_socket(DltReceiver *receiver) return DLT_RETURN_OK; } -int dlt_receiver_receive(DltReceiver *receiver, DltReceiverType from_src) +int dlt_receiver_receive(DltReceiver *receiver) { socklen_t addrlen; @@ -2038,19 +2040,19 @@ int dlt_receiver_receive(DltReceiver *receiver, DltReceiverType from_src) receiver->backup_buf = NULL; } - if (from_src == DLT_RECEIVE_SOCKET) + if (receiver->type == DLT_RECEIVE_SOCKET) /* wait for data from socket */ receiver->bytesRcvd = recv(receiver->fd, receiver->buf + receiver->lastBytesRcvd, receiver->buffersize - receiver->lastBytesRcvd, 0); - else if (from_src == DLT_RECEIVE_FD) + else if (receiver->type == DLT_RECEIVE_FD) /* wait for data from fd */ receiver->bytesRcvd = read(receiver->fd, receiver->buf + receiver->lastBytesRcvd, receiver->buffersize - receiver->lastBytesRcvd); - else { + else { /* receiver->type == DLT_RECEIVE_UDP_SOCKET */ /* wait for data from UDP socket */ addrlen = sizeof(receiver->addr); receiver->bytesRcvd = recvfrom(receiver->fd, @@ -3834,7 +3836,7 @@ void dlt_check_envvar() dlt_log_init(mode); } -#ifndef DLT_USE_UNIX_SOCKET_IPC +#if defined DLT_DAEMON_USE_FIFO_IPC || defined DLT_LIB_USE_FIFO_IPC char *env_pipe_dir = getenv("DLT_PIPE_DIR"); if (env_pipe_dir != NULL) @@ -3993,42 +3995,6 @@ void dlt_hex_ascii_to_binary(const char *ptr, uint8_t *binary, int *size) } } -#ifndef DLT_USE_UNIX_SOCKET_IPC -int dlt_mkdir_recursive(const char *dir) -{ - int ret = 0; - char tmp[PATH_MAX + 1]; - char *p = NULL; - char *end = NULL; - size_t len; - - strncpy(tmp, dir, PATH_MAX); - len = strlen(tmp); - - if (tmp[len - 1] == '/') - tmp[len - 1] = 0; - - end = tmp + len; - - for (p = tmp + 1; ((*p) && (ret == 0)) || ((ret == -1 && errno == EEXIST) && (p != end)); p++) - if (*p == '/') { - *p = 0; - ret = mkdir(tmp, S_IRWXU); - *p = '/'; - } - - - - if ((ret == 0) || ((ret == -1) && (errno == EEXIST))) - ret = mkdir(tmp, S_IRWXU); - - if ((ret == -1) && (errno == EEXIST)) - ret = 0; - - return ret; -} -#endif - DltReturnValue dlt_file_quick_parsing(DltFile *file, const char *filename, int type, int verbose) { |