@@ -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
109111static int put_basename (struct lwm2m_output_context * out , struct lwm2m_obj_path * path )
@@ -678,15 +680,12 @@ const struct lwm2m_reader senml_cbor_reader = {
678680int 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
769766out :
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,
776773int 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,
896886int 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