@@ -85,6 +85,19 @@ struct init_packet_data {
8585 const char * strid ; /* Remote group unique identifier. */
8686};
8787
88+ enum internal_pool_data_type {
89+ NRF_RPC_INITIALIZATION ,
90+ NRF_RPC_ERROR
91+ };
92+
93+ struct internal_pool_data {
94+ enum internal_pool_data_type type ;
95+ const struct nrf_rpc_group * group ;
96+ int err ;
97+ uint8_t hdr_id ;
98+ uint8_t hdr_type ;
99+ };
100+
88101/* Pool of statically allocated command contexts. */
89102static struct nrf_rpc_cmd_ctx cmd_ctx_pool [CONFIG_NRF_RPC_CMD_CTX_POOL_SIZE ];
90103
@@ -102,6 +115,8 @@ static bool is_initialized;
102115/* Error handler provided to the init function. */
103116static nrf_rpc_err_handler_t global_err_handler ;
104117
118+ static struct internal_pool_data internal_data ;
119+
105120/* Array with all defiend groups */
106121NRF_RPC_AUTO_ARR (nrf_rpc_groups_array , "grp" );
107122
@@ -343,6 +358,22 @@ static inline bool packet_validate(const uint8_t *packet)
343358 (addr < (uintptr_t )0 - (uintptr_t )NRF_RPC_HEADER_SIZE );
344359}
345360
361+ static void internal_tx_handler (void )
362+ {
363+ if (internal_data .type == NRF_RPC_INITIALIZATION ) {
364+ if (group_init_send (internal_data .group )) {
365+ NRF_RPC_ERR ("Failed to send group init packet for group id: %d strid: %s" ,
366+ internal_data .group -> data -> src_group_id ,
367+ internal_data .group -> strid );
368+ }
369+ }
370+
371+ if (internal_data .type == NRF_RPC_ERROR ) {
372+ nrf_rpc_err (internal_data .err , NRF_RPC_ERR_SRC_RECV , internal_data .group ,
373+ internal_data .hdr_id , internal_data .hdr_type );
374+ }
375+ }
376+
346377static int transport_init (nrf_rpc_tr_receive_handler_t receive_cb )
347378{
348379 int err = 0 ;
@@ -513,7 +544,11 @@ static uint8_t parse_incoming_packet(struct nrf_rpc_cmd_ctx *cmd_ctx,
513544/* Thread pool callback */
514545static void execute_packet (const uint8_t * packet , size_t len )
515546{
516- parse_incoming_packet (NULL , packet , len );
547+ if (packet == (const uint8_t * )& internal_data ) {
548+ internal_tx_handler ();
549+ } else {
550+ parse_incoming_packet (NULL , packet , len );
551+ }
517552}
518553
519554static bool protocol_version_check (const struct init_packet_data * init_data )
@@ -636,14 +671,12 @@ static int init_packet_handle(struct header *hdr, const struct nrf_rpc_group **g
636671 * If remote processor does not know our group id, send an init packet back,
637672 * since it might have missed our original init packet.
638673 */
639- err = group_init_send (* group );
640- if (err ) {
641- NRF_RPC_ERR ("Failed to send group init packet for group id: %d strid: %s" ,
642- group_data -> src_group_id , (* * group ).strid );
643- }
674+ internal_data .type = NRF_RPC_INITIALIZATION ;
675+ internal_data .group = * group ;
676+ nrf_rpc_os_thread_pool_send ((const uint8_t * )& internal_data , sizeof (internal_data ));
644677 }
645678
646- return err ;
679+ return 0 ;
647680}
648681
649682/* Callback from transport layer that handles incoming. */
@@ -765,8 +798,12 @@ static void receive_handler(const struct nrf_rpc_tr *transport, const uint8_t *p
765798 }
766799
767800 if (err < 0 ) {
768- nrf_rpc_err (err , NRF_RPC_ERR_SRC_RECV , group , hdr .id ,
769- hdr .type );
801+ internal_data .type = NRF_RPC_ERROR ;
802+ internal_data .group = group ;
803+ internal_data .err = err ;
804+ internal_data .hdr_id = hdr .id ;
805+ internal_data .hdr_type = hdr .type ;
806+ nrf_rpc_os_thread_pool_send ((const uint8_t * )& internal_data , sizeof (internal_data ));
770807 }
771808}
772809
0 commit comments