blob: 10e499fb5722ff64f673ebc24a2d9159b5a7824a [file] [log] [blame]
/*
* Copyright (c) 2019 Foundries.io
*
* SPDX-License-Identifier: Apache-2.0
*/
#define LOG_MODULE_NAME net_lwm2m_obj_conn_mon
#define LOG_LEVEL CONFIG_LWM2M_LOG_LEVEL
#include <zephyr/logging/log.h>
LOG_MODULE_REGISTER(LOG_MODULE_NAME);
#include <string.h>
#include <zephyr/init.h>
#include <zephyr/net/net_if.h>
#include <zephyr/net/net_ip.h>
#include "lwm2m_object.h"
#include "lwm2m_engine.h"
#define CONNMON_VERSION_MAJOR 1
#if defined(CONFIG_LWM2M_CONNMON_OBJECT_VERSION_1_2)
#define CONNMON_VERSION_MINOR 2
#define CONNMON_MAX_ID 13
#else
#define CONNMON_VERSION_MINOR 0
#define CONNMON_MAX_ID 11
#endif /* CONFIG_LWM2M_CONNMON_OBJECT_VERSION_1_2 */
/* Connectivity Monitoring resource IDs */
#define CONNMON_NETWORK_BEARER_ID 0
#define CONNMON_AVAIL_NETWORK_BEARER_ID 1
#define CONNMON_RADIO_SIGNAL_STRENGTH 2
#define CONNMON_LINK_QUALITY 3
#define CONNMON_IP_ADDRESSES 4
#define CONNMON_ROUTER_IP_ADDRESSES 5
#define CONNMON_LINK_UTILIZATION 6
#define CONNMON_APN 7
#define CONNMON_CELLID 8
#define CONNMON_SMNC 9
#define CONNMON_SMCC 10
#if defined(CONFIG_LWM2M_CONNMON_OBJECT_VERSION_1_2)
#define CONNMON_SIGNAL_SNR 11
#define CONNMON_LAC 12
#endif
#define CONNMON_STRING_SHORT 8
#define CONNMON_AVAIL_BEARER_MAX CONFIG_LWM2M_CONN_MON_BEARER_MAX
#define CONNMON_APN_MAX CONFIG_LWM2M_CONN_MON_APN_MAX
#if defined(CONFIG_NET_IF_MAX_IPV6_COUNT) \
&& defined(CONFIG_NET_IF_MAX_IPV4_COUNT)
#define CONNMON_IP_ADDRESS_MAX (CONFIG_NET_IF_MAX_IPV6_COUNT + \
CONFIG_NET_IF_MAX_IPV4_COUNT)
#elif defined(CONFIG_NET_IF_MAX_IPV6_COUNT)
#define CONNMON_IP_ADDRESS_MAX CONFIG_NET_IF_MAX_IPV6_COUNT
#elif defined(CONFIG_NET_IF_MAX_IPV4_COUNT)
#define CONNMON_IP_ADDRESS_MAX CONFIG_NET_IF_MAX_IPV4_COUNT
#else
#define CONNMON_IP_ADDRESS_MAX 1
#endif
#if defined(CONFIG_NET_MAX_ROUTERS)
#define CONNMON_ROUTER_IP_ADDRESS_MAX CONFIG_NET_MAX_ROUTERS
#else
#define CONNMON_ROUTER_IP_ADDRESS_MAX 1
#endif
/*
* Calculate resource instances as follows:
* start with CONNMON_MAX_ID
* subtract MULTI resources because their counts include 0 resource (4)
* add CONNMON_AVAIL_BEARER_MAX resource instances
* add CONNMON_APN_MAX resource instances
* add CONNMON_IP_ADDRESS_MAX resource instances
* add CONNMON_ROUTER_IP_ADDRESS_MAX resource instances
*/
#define RESOURCE_INSTANCE_COUNT (CONNMON_MAX_ID - 4 + \
CONNMON_AVAIL_BEARER_MAX + \
CONNMON_APN_MAX + \
CONNMON_IP_ADDRESS_MAX + \
CONNMON_ROUTER_IP_ADDRESS_MAX)
/* resource state variables */
static int8_t net_bearer;
static int8_t rss;
static uint8_t link_quality;
static uint32_t cellid;
static uint16_t mnc;
static uint16_t mcc;
#if defined(CONFIG_LWM2M_CONNMON_OBJECT_VERSION_1_2)
static int32_t snr;
static uint16_t lac;
#endif
/* only 1 instance of Connection Monitoring object exists */
static struct lwm2m_engine_obj connmon;
static struct lwm2m_engine_obj_field fields[] = {
OBJ_FIELD_DATA(CONNMON_NETWORK_BEARER_ID, R, U8),
OBJ_FIELD_DATA(CONNMON_AVAIL_NETWORK_BEARER_ID, R, U8),
OBJ_FIELD_DATA(CONNMON_RADIO_SIGNAL_STRENGTH, R, S8),
OBJ_FIELD_DATA(CONNMON_LINK_QUALITY, R, U8),
OBJ_FIELD_DATA(CONNMON_IP_ADDRESSES, R, STRING),
OBJ_FIELD_DATA(CONNMON_ROUTER_IP_ADDRESSES, R_OPT, STRING),
OBJ_FIELD_DATA(CONNMON_LINK_UTILIZATION, R_OPT, U8),
OBJ_FIELD_DATA(CONNMON_APN, R_OPT, STRING),
OBJ_FIELD_DATA(CONNMON_CELLID, R_OPT, U32),
OBJ_FIELD_DATA(CONNMON_SMNC, R_OPT, U16),
OBJ_FIELD_DATA(CONNMON_SMCC, R_OPT, U16),
#if defined(CONFIG_LWM2M_CONNMON_OBJECT_VERSION_1_2)
OBJ_FIELD_DATA(CONNMON_SIGNAL_SNR, R_OPT, S32),
OBJ_FIELD_DATA(CONNMON_LAC, R_OPT, U16),
#endif
};
static struct lwm2m_engine_obj_inst inst;
static struct lwm2m_engine_res res[CONNMON_MAX_ID];
static struct lwm2m_engine_res_inst res_inst[RESOURCE_INSTANCE_COUNT];
static struct lwm2m_engine_obj_inst *connmon_create(uint16_t obj_inst_id)
{
int i = 0, j = 0;
/* Set default values */
net_bearer = 42U; /* Ethernet */
rss = 0;
link_quality = 0U;
mnc = 0U;
mcc = 0U;
init_res_instance(res_inst, ARRAY_SIZE(res_inst));
/* initialize instance resource data */
INIT_OBJ_RES_DATA(CONNMON_NETWORK_BEARER_ID, res, i, res_inst, j,
&net_bearer, sizeof(net_bearer));
INIT_OBJ_RES_MULTI_OPTDATA(CONNMON_AVAIL_NETWORK_BEARER_ID, res, i,
res_inst, j, CONNMON_AVAIL_BEARER_MAX,
false);
INIT_OBJ_RES_DATA(CONNMON_RADIO_SIGNAL_STRENGTH, res, i, res_inst, j,
&rss, sizeof(rss));
INIT_OBJ_RES_DATA(CONNMON_LINK_QUALITY, res, i, res_inst, j,
&link_quality, sizeof(link_quality));
INIT_OBJ_RES_MULTI_OPTDATA(CONNMON_IP_ADDRESSES, res, i,
res_inst, j, CONNMON_IP_ADDRESS_MAX, false);
INIT_OBJ_RES_MULTI_OPTDATA(CONNMON_ROUTER_IP_ADDRESSES, res, i,
res_inst, j, CONNMON_ROUTER_IP_ADDRESS_MAX,
false);
INIT_OBJ_RES_MULTI_OPTDATA(CONNMON_APN, res, i, res_inst, j,
CONNMON_APN_MAX, false);
INIT_OBJ_RES_DATA(CONNMON_CELLID, res, i, res_inst, j, &cellid,
sizeof(cellid));
INIT_OBJ_RES_DATA(CONNMON_SMNC, res, i, res_inst, j, &mnc, sizeof(mnc));
INIT_OBJ_RES_DATA(CONNMON_SMCC, res, i, res_inst, j, &mcc, sizeof(mcc));
#if defined(CONFIG_LWM2M_CONNMON_OBJECT_VERSION_1_2)
INIT_OBJ_RES_DATA(CONNMON_SIGNAL_SNR, res, i, res_inst, j, &snr, sizeof(snr));
INIT_OBJ_RES_DATA(CONNMON_LAC, res, i, res_inst, j, &lac, sizeof(lac));
#endif
inst.resources = res;
inst.resource_count = i;
LOG_DBG("Create LWM2M connectivity monitoring instance: %d",
obj_inst_id);
return &inst;
}
static int lwm2m_connmon_init(const struct device *dev)
{
struct lwm2m_engine_obj_inst *obj_inst = NULL;
int ret = 0;
/* initialize the Connection Monitoring field data */
connmon.obj_id = LWM2M_OBJECT_CONNECTIVITY_MONITORING_ID;
connmon.version_major = CONNMON_VERSION_MAJOR;
connmon.version_minor = CONNMON_VERSION_MINOR;
connmon.is_core = true;
connmon.fields = fields;
connmon.field_count = ARRAY_SIZE(fields);
connmon.max_instance_count = 1U;
connmon.create_cb = connmon_create;
lwm2m_register_obj(&connmon);
/* auto create the only instance */
ret = lwm2m_create_obj_inst(LWM2M_OBJECT_CONNECTIVITY_MONITORING_ID,
0, &obj_inst);
if (ret < 0) {
LOG_DBG("Create LWM2M instance 0 error: %d", ret);
}
return ret;
}
SYS_INIT(lwm2m_connmon_init, APPLICATION, CONFIG_KERNEL_INIT_PRIORITY_DEFAULT);