Skip to content

Commit 975d170

Browse files
Veijo Pesonencarlescufi
authored andcommitted
net: lwm2m: use stack for SenML CBOR data
Formatter data are is shared between different threads. Signed-off-by: Veijo Pesonen <[email protected]>
1 parent a1bd906 commit 975d170

File tree

2 files changed

+39
-52
lines changed

2 files changed

+39
-52
lines changed

subsys/net/lib/lwm2m/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ config LWM2M_DNS_SUPPORT
8686

8787
config LWM2M_ENGINE_STACK_SIZE
8888
int "LWM2M engine stack size"
89+
default 14336 if LWM2M_RW_SENML_CBOR_SUPPORT
8990
default 2560 if NET_LOG
9091
default 2048
9192
help

subsys/net/lib/lwm2m/lwm2m_rw_senml_cbor.c

Lines changed: 38 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ LOG_MODULE_REGISTER(LOG_MODULE_NAME);
1717
#include <inttypes.h>
1818
#include <ctype.h>
1919
#include <sys/util.h>
20+
#include <kernel.h>
2021

2122
#include <zcbor_common.h>
2223
#include <zcbor_decode.h>
@@ -49,6 +50,17 @@ struct cbor_in_fmt_data {
4950
char basename[sizeof("/65535/999/")]; /* Null terminated basename */
5051
};
5152

53+
/* Statically allocated formatter data is shared between different threads */
54+
static union cbor_io_fmt_data{
55+
struct cbor_in_fmt_data i;
56+
struct cbor_out_fmt_data o;
57+
} fdio;
58+
59+
/*
60+
* SEND is called from a different context than the rest of the LwM2M functionality
61+
*/
62+
K_MUTEX_DEFINE(fd_mtx);
63+
5264
#define GET_CBOR_FD_NAME(fd) ((fd)->names[(fd)->name_cnt])
5365
/* Get the current record */
5466
#define GET_CBOR_FD_REC(fd) \
@@ -61,49 +73,39 @@ struct cbor_in_fmt_data {
6173
/* Get CBOR output formatter data */
6274
#define LWM2M_OFD_CBOR(octx) ((struct cbor_out_fmt_data *)engine_get_out_user_data(octx))
6375

64-
static struct cbor_out_fmt_data *setup_out_fmt_data(struct lwm2m_message *msg)
76+
static void setup_out_fmt_data(struct lwm2m_message *msg)
6577
{
66-
struct cbor_out_fmt_data *fd = malloc(sizeof(*fd));
78+
k_mutex_lock(&fd_mtx, K_FOREVER);
6779

68-
if (!fd) {
69-
return NULL;
70-
}
80+
struct cbor_out_fmt_data *fd = &fdio.o;
7181

7282
(void)memset(fd, 0, sizeof(*fd));
7383
engine_set_out_user_data(&msg->out, fd);
7484
fd->name_sz = sizeof("/65535/999/");
75-
76-
return fd;
7785
}
7886

79-
static void clear_out_fmt_data(struct lwm2m_message *msg, struct cbor_out_fmt_data *fd)
87+
static void clear_out_fmt_data(struct lwm2m_message *msg)
8088
{
81-
free(fd);
82-
fd = NULL;
83-
8489
engine_clear_out_user_data(&msg->out);
90+
91+
k_mutex_unlock(&fd_mtx);
8592
}
8693

87-
static struct cbor_in_fmt_data *setup_in_fmt_data(struct lwm2m_message *msg)
94+
static void setup_in_fmt_data(struct lwm2m_message *msg)
8895
{
89-
struct cbor_in_fmt_data *fd = malloc(sizeof(*fd));
96+
k_mutex_lock(&fd_mtx, K_FOREVER);
9097

91-
if (!fd) {
92-
return NULL;
93-
}
98+
struct cbor_in_fmt_data *fd = &fdio.i;
9499

95100
(void)memset(fd, 0, sizeof(*fd));
96101
engine_set_in_user_data(&msg->in, fd);
97-
98-
return fd;
99102
}
100103

101-
static void clear_in_fmt_data(struct lwm2m_message *msg, struct cbor_in_fmt_data *fd)
104+
static void clear_in_fmt_data(struct lwm2m_message *msg)
102105
{
103-
free(fd);
104-
fd = NULL;
105-
106106
engine_clear_in_user_data(&msg->in);
107+
108+
k_mutex_unlock(&fd_mtx);
107109
}
108110

109111
static int put_basename(struct lwm2m_output_context *out, struct lwm2m_obj_path *path)
@@ -678,15 +680,12 @@ const struct lwm2m_reader senml_cbor_reader = {
678680
int do_read_op_senml_cbor(struct lwm2m_message *msg)
679681
{
680682
int ret;
681-
struct cbor_out_fmt_data *fd = setup_out_fmt_data(msg);
682683

683-
if (!fd) {
684-
return -ENOMEM;
685-
}
684+
setup_out_fmt_data(msg);
686685

687686
ret = lwm2m_perform_read_op(msg, LWM2M_FORMAT_APP_SENML_CBOR);
688687

689-
clear_out_fmt_data(msg, fd);
688+
clear_out_fmt_data(msg);
690689

691690
return ret;
692691
}
@@ -706,11 +705,9 @@ static uint8_t parse_composite_read_paths(struct lwm2m_message *msg,
706705
int len;
707706
int ret;
708707

709-
fd = setup_in_fmt_data(msg);
710-
if (!fd) {
711-
LOG_ERR("unable to decode composite read paths, out of memory");
712-
return -ENOMEM;
713-
}
708+
setup_in_fmt_data(msg);
709+
710+
fd = engine_get_in_user_data(&msg->in);
714711

715712
dret = cbor_decode_lwm2m_senml(ICTX_BUF_R_REGION(&msg->in), &fd->dcd, &isize);
716713

@@ -767,7 +764,7 @@ static uint8_t parse_composite_read_paths(struct lwm2m_message *msg,
767764
}
768765

769766
out:
770-
clear_in_fmt_data(msg, fd);
767+
clear_in_fmt_data(msg);
771768

772769
return paths;
773770
}
@@ -776,7 +773,6 @@ static uint8_t parse_composite_read_paths(struct lwm2m_message *msg,
776773
int do_composite_read_op_senml_cbor(struct lwm2m_message *msg)
777774
{
778775
int ret;
779-
struct cbor_out_fmt_data *fd;
780776
struct lwm2m_obj_path_list lwm2m_path_list_buf[CONFIG_LWM2M_COMPOSITE_PATH_LIST_SIZE];
781777
sys_slist_t lwm_path_list;
782778
sys_slist_t lwm_path_free_list;
@@ -796,15 +792,11 @@ int do_composite_read_op_senml_cbor(struct lwm2m_message *msg)
796792

797793
lwm2m_engine_clear_duplicate_path(&lwm_path_list, &lwm_path_free_list);
798794

799-
fd = setup_out_fmt_data(msg);
800-
if (!fd) {
801-
LOG_ERR("unable to encode composite read msg, out of memory");
802-
return -ENOMEM;
803-
}
795+
setup_out_fmt_data(msg);
804796

805797
ret = lwm2m_perform_composite_read_op(msg, LWM2M_FORMAT_APP_SENML_CBOR, &lwm_path_list);
806798

807-
clear_out_fmt_data(msg, fd);
799+
clear_out_fmt_data(msg);
808800

809801
return ret;
810802
}
@@ -831,11 +823,9 @@ int do_write_op_senml_cbor(struct lwm2m_message *msg)
831823
return do_write_op_item(msg, NULL);
832824
}
833825

834-
fd = setup_in_fmt_data(msg);
835-
if (!fd) {
836-
LOG_ERR("unable to decode msg, out of memory");
837-
return -ENOMEM;
838-
}
826+
setup_in_fmt_data(msg);
827+
828+
fd = engine_get_in_user_data(&msg->in);
839829

840830
dret = cbor_decode_lwm2m_senml(ICTX_BUF_R_PTR(&msg->in), ICTX_BUF_R_LEFT_SZ(&msg->in),
841831
&fd->dcd, &decoded_sz);
@@ -867,7 +857,7 @@ int do_write_op_senml_cbor(struct lwm2m_message *msg)
867857
ret = -EBADMSG;
868858
}
869859

870-
clear_in_fmt_data(msg, fd);
860+
clear_in_fmt_data(msg);
871861

872862
return ret < 0 ? ret : decoded_sz;
873863
}
@@ -896,16 +886,12 @@ int do_composite_observe_parse_path_senml_cbor(struct lwm2m_message *msg,
896886
int do_send_op_senml_cbor(struct lwm2m_message *msg, sys_slist_t *lwm2m_path_list)
897887
{
898888
int ret;
899-
struct cbor_out_fmt_data *fd = setup_out_fmt_data(msg);
900889

901-
if (!fd) {
902-
LOG_ERR("Unable to complete SEND op, out of memory");
903-
return -ENOMEM;
904-
}
890+
setup_out_fmt_data(msg);
905891

906892
ret = lwm2m_perform_composite_read_op(msg, LWM2M_FORMAT_APP_SENML_CBOR, lwm2m_path_list);
907893

908-
clear_out_fmt_data(msg, fd);
894+
clear_out_fmt_data(msg);
909895

910896
return ret;
911897
}

0 commit comments

Comments
 (0)