diff --git a/src/Makefile b/src/Makefile index 253e5e1c4fa025e5e2ecba3c2f78469b3b90bf32..1ab5a524c5f0d94fda8e46d1e508955db7f1b2ff 100644 --- a/src/Makefile +++ b/src/Makefile @@ -37,6 +37,11 @@ OBJS += reboots.o PROG_CFLAGS += -DSYSMNGR_REBOOTS endif +ifeq ($(SYSMNGR_NETWORK_PROPERTIES),y) +OBJS += network.o +PROG_CFLAGS += -DSYSMNGR_NETWORK_PROPERTIES +endif + ifeq ($(SYSMNGR_VENDOR_EXTENSIONS),y) PROG_CFLAGS += -DSYSMNGR_VENDOR_EXTENSIONS endif diff --git a/src/deviceinfo.c b/src/deviceinfo.c index db8ea6c4002fcc69204c3877625154a3ff6b94a2..d6c0ad978838f1c8b8f2c68d97a7ccad91a7b762 100644 --- a/src/deviceinfo.c +++ b/src/deviceinfo.c @@ -35,6 +35,10 @@ #include "supported_dm.h" #endif +#ifdef SYSMNGR_NETWORK_PROPERTIES +#include "network.h" +#endif + /************************************************************* * GET & SET PARAM **************************************************************/ @@ -238,6 +242,10 @@ DMOBJ tDeviceInfoObj[] = { {"ProcessStatus", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, tDeviceInfoProcessStatusObj, tDeviceInfoProcessStatusParams, NULL, BBFDM_BOTH}, #endif +#ifdef SYSMNGR_NETWORK_PROPERTIES +{"NetworkProperties", &DMREAD, NULL, NULL, NULL, NULL, NULL, NULL, NULL, tDeviceInfoNetworkPropertiesParams, NULL, BBFDM_BOTH}, +#endif + #ifdef SYSMNGR_SUPPORTED_DATA_MODEL {"SupportedDataModel", &DMREAD, NULL, NULL, NULL, browseDeviceInfoSupportedDataModelInst, NULL, NULL, NULL, tDeviceInfoSupportedDataModelParams, NULL, BBFDM_CWMP}, #endif diff --git a/src/network.c b/src/network.c new file mode 100644 index 0000000000000000000000000000000000000000..efa644b1fca44ec8131e22a3ae576a9c7e37d48e --- /dev/null +++ b/src/network.c @@ -0,0 +1,118 @@ +/* + * Copyright (C) 2024 iopsys Software Solutions AB + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 + * as published by the Free Software Foundation + * + * Author: Amin Ben Romdhane <amin.benromdhane@iopsys.eu> + * + */ + +#include "utils.h" + +#define TCP_WMEM_PATH "/proc/sys/net/ipv4/tcp_wmem" +#define TCP_CONGESTION_CONTROL_PATH "/proc/sys/net/ipv4/tcp_congestion_control" + +/************************************************************* +* COMMON FUNCTIONS +**************************************************************/ +static int read_file_content(const char *file_path, char *buffer, size_t buffer_size) +{ + int fd = open(file_path, O_RDONLY); + if (fd == -1) + return -1; + + ssize_t bytes_read = read(fd, buffer, buffer_size - 1); + if (bytes_read == -1) { + close(fd); + return -1; + } + + buffer[bytes_read] = '\0'; // Null-terminate the buffer + close(fd); + + return 0; +} + +static int read_tcp_write_memory_limits(int *min_size, int *default_size, int *max_size) +{ + char buffer[128] = {0}; + + // Read TCP memory settings + if (read_file_content(TCP_WMEM_PATH, buffer, sizeof(buffer)) == -1) + return -1; + + // Parse the memory sizes from the file contents + if (sscanf(buffer, "%d %d %d", min_size, default_size, max_size) != 3) + return -1; + + return 0; +} + +static int get_supported_congestion_controls(char *output, size_t output_size) +{ + const char *delim = " "; + char *token, buffer[128]; + size_t pos = 0; + + // Read available congestion control algorithms + if (read_file_content(TCP_CONGESTION_CONTROL_PATH, buffer, sizeof(buffer)) == -1) + return -1; + + // Parse the supported algorithms and store them in the output buffer + token = strtok(buffer, delim); + + while (token != NULL) { + if (strstr(token, "reno")) + pos += snprintf(&output[pos], output_size - pos, "Reno,"); + else if (strstr(token, "cubic")) + pos += snprintf(&output[pos], output_size - pos, "Cubic,"); + else if (strstr(token, "newreno")) + pos += snprintf(&output[pos], output_size - pos, "New Reno,"); + else if (strstr(token, "vegas")) + pos += snprintf(&output[pos], output_size - pos, "Vegas,"); + else if (strstr(token, "tahoe")) + pos += snprintf(&output[pos], output_size - pos, "Tahoe,"); + + token = strtok(NULL, delim); + } + + // Remove the trailing comma, if any + if (pos > 0) + output[pos - 1] = '\0'; + + return 0; +} + +/************************************************************* +* GET & SET PARAM +**************************************************************/ +static int get_DeviceInfoNetworkProperties_MaxTCPWindowSize(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) +{ + int min = 0, def = 0, max = 0; + + int res = read_tcp_write_memory_limits(&min, &def, &max); + dmasprintf(value, "%d", !res ? max : 0); + return 0; +} + +static int get_DeviceInfoNetworkProperties_TCPImplementation(char *refparam, struct dmctx *ctx, void *data, char *instance, char **value) +{ + char list[256] = {0}; + + int res = get_supported_congestion_controls(list, sizeof(list)); + *value = dmstrdup(!res ? list : ""); + return 0; +} + +/********************************************************************************************************************************** +* OBJ & LEAF DEFINITION +***********************************************************************************************************************************/ +/* *** Device.DeviceInfo.NetworkProperties. *** */ +DMLEAF tDeviceInfoNetworkPropertiesParams[] = { +/* PARAM, permission, type, getvalue, setvalue, bbfdm_type */ +{"MaxTCPWindowSize", &DMREAD, DMT_UNINT, get_DeviceInfoNetworkProperties_MaxTCPWindowSize, NULL, BBFDM_BOTH}, +{"TCPImplementation", &DMREAD, DMT_STRING, get_DeviceInfoNetworkProperties_TCPImplementation, NULL, BBFDM_BOTH}, +{0} +}; diff --git a/src/network.h b/src/network.h new file mode 100644 index 0000000000000000000000000000000000000000..6a8a68afaf19ab3683cd593db8e909319dfdc44a --- /dev/null +++ b/src/network.h @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2024 iopsys Software Solutions AB + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 2.1 + * as published by the Free Software Foundation + * + * Author: Amin Ben Romdhane <amin.benromdhane@iopsys.eu> + * + */ + +#ifndef __NETWORK_H +#define __NETWORK_H + +extern DMLEAF tDeviceInfoNetworkPropertiesParams[]; + +#endif //__NETWORK_H