Skip to content

Commit ce24630

Browse files
Damian-Nordicrlubos
authored andcommitted
logging: rpc: use nrf_rpc_serialize
Refactor logging over RPC to use nrf_rpc_serialize.h helpers wherever possible. Also, fix instances of using an incoming packet after calling nrf_rpc_decoding_done(), which releases the packet. Signed-off-by: Damian Krolik <[email protected]>
1 parent 93c10ee commit ce24630

File tree

2 files changed

+54
-66
lines changed

2 files changed

+54
-66
lines changed

subsys/logging/log_backend_rpc.c

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -120,16 +120,16 @@ static void log_rpc_get_crash_log_handler(const struct nrf_rpc_group *group,
120120
const struct device *const crash_log = CRASH_LOG_DEV;
121121
size_t offset;
122122
size_t length;
123-
bool decoded_ok;
124123
crash_log_header_t header;
125124
struct nrf_rpc_cbor_ctx rsp_ctx;
126125

127-
decoded_ok = zcbor_uint_decode(ctx->zs, &offset, sizeof(offset));
128-
decoded_ok = decoded_ok && zcbor_uint_decode(ctx->zs, &length, sizeof(length));
129-
nrf_rpc_cbor_decoding_done(group, ctx);
126+
offset = nrf_rpc_decode_uint(ctx);
127+
length = nrf_rpc_decode_uint(ctx);
130128

131-
if (!decoded_ok) {
132-
goto err;
129+
if (!nrf_rpc_decoding_done_and_check(group, ctx)) {
130+
nrf_rpc_err(-EBADMSG, NRF_RPC_ERR_SRC_RECV, group, LOG_RPC_CMD_GET_CRASH_LOG,
131+
NRF_RPC_PACKET_TYPE_CMD);
132+
return;
133133
}
134134

135135
if (retention_is_valid(crash_log) != 1) {
@@ -190,19 +190,10 @@ static void retain(const uint8_t *data, size_t length)
190190
static void send(const uint8_t *data, size_t length)
191191
{
192192
struct nrf_rpc_cbor_ctx ctx;
193-
const struct zcbor_string data_string = {
194-
.value = data,
195-
.len = length,
196-
};
197193

198194
NRF_RPC_CBOR_ALLOC(&log_rpc_group, ctx, 4 + length);
199-
200-
if (!zcbor_uint_encode(ctx.zs, &current_level, sizeof(current_level)) ||
201-
!zcbor_bstr_encode(ctx.zs, &data_string)) {
202-
NRF_RPC_CBOR_DISCARD(&log_rpc_group, ctx);
203-
return;
204-
}
205-
195+
nrf_rpc_encode_uint(&ctx, current_level);
196+
nrf_rpc_encode_buffer(&ctx, data, length);
206197
nrf_rpc_cbor_evt_no_err(&log_rpc_group, LOG_RPC_EVT_MSG, &ctx);
207198
}
208199

@@ -342,21 +333,19 @@ LOG_BACKEND_DEFINE(log_backend_rpc, log_backend_rpc_api, true);
342333
static void log_rpc_set_stream_level_handler(const struct nrf_rpc_group *group,
343334
struct nrf_rpc_cbor_ctx *ctx, void *handler_data)
344335
{
345-
struct nrf_rpc_cbor_ctx rsp_ctx;
346336
enum log_rpc_level level;
347337

348338
level = (enum log_rpc_level)nrf_rpc_decode_uint(ctx);
349339

350-
if (!nrf_rpc_decoding_done_and_check(&log_rpc_group, ctx)) {
351-
nrf_rpc_err(-EBADMSG, NRF_RPC_ERR_SRC_RECV, &log_rpc_group,
352-
LOG_RPC_CMD_SET_STREAM_LEVEL, NRF_RPC_PACKET_TYPE_CMD);
340+
if (!nrf_rpc_decoding_done_and_check(group, ctx)) {
341+
nrf_rpc_err(-EBADMSG, NRF_RPC_ERR_SRC_RECV, group, LOG_RPC_CMD_SET_STREAM_LEVEL,
342+
NRF_RPC_PACKET_TYPE_CMD);
353343
return;
354344
}
355345

356346
stream_level = level;
357347

358-
NRF_RPC_CBOR_ALLOC(group, rsp_ctx, 0);
359-
nrf_rpc_cbor_rsp_no_err(group, &rsp_ctx);
348+
nrf_rpc_rsp_send_void(group);
360349
}
361350

362351
NRF_RPC_CBOR_CMD_DECODER(log_rpc_group, log_rpc_set_stream_level_handler,

subsys/logging/log_forwarder_rpc.c

Lines changed: 42 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -26,32 +26,34 @@ static void log_rpc_msg_handler(const struct nrf_rpc_group *group, struct nrf_rp
2626
void *handler_data)
2727
{
2828
enum log_rpc_level level;
29-
struct zcbor_string message;
30-
bool decoded_ok;
31-
32-
decoded_ok = zcbor_uint_decode(ctx->zs, &level, sizeof(level));
33-
decoded_ok = decoded_ok && zcbor_bstr_decode(ctx->zs, &message);
34-
nrf_rpc_cbor_decoding_done(group, ctx);
35-
36-
if (!decoded_ok) {
37-
return;
29+
const char *message;
30+
size_t message_size;
31+
32+
level = nrf_rpc_decode_uint(ctx);
33+
message = nrf_rpc_decode_buffer_ptr_and_size(ctx, &message_size);
34+
35+
if (message) {
36+
switch (level) {
37+
case LOG_RPC_LEVEL_ERR:
38+
LOG_ERR("%.*s", message_size, message);
39+
break;
40+
case LOG_RPC_LEVEL_WRN:
41+
LOG_WRN("%.*s", message_size, message);
42+
break;
43+
case LOG_RPC_LEVEL_INF:
44+
LOG_INF("%.*s", message_size, message);
45+
break;
46+
case LOG_RPC_LEVEL_DBG:
47+
LOG_DBG("%.*s", message_size, message);
48+
break;
49+
default:
50+
break;
51+
}
3852
}
3953

40-
switch (level) {
41-
case LOG_RPC_LEVEL_ERR:
42-
LOG_ERR("%.*s", message.len, message.value);
43-
break;
44-
case LOG_RPC_LEVEL_WRN:
45-
LOG_WRN("%.*s", message.len, message.value);
46-
break;
47-
case LOG_RPC_LEVEL_INF:
48-
LOG_INF("%.*s", message.len, message.value);
49-
break;
50-
case LOG_RPC_LEVEL_DBG:
51-
LOG_DBG("%.*s", message.len, message.value);
52-
break;
53-
default:
54-
break;
54+
if (!nrf_rpc_decoding_done_and_check(&log_rpc_group, ctx)) {
55+
nrf_rpc_err(-EBADMSG, NRF_RPC_ERR_SRC_RECV, &log_rpc_group, LOG_RPC_EVT_MSG,
56+
NRF_RPC_PACKET_TYPE_EVT);
5557
}
5658
}
5759

@@ -64,38 +66,35 @@ int log_rpc_set_stream_level(enum log_rpc_level level)
6466

6567
NRF_RPC_CBOR_ALLOC(&log_rpc_group, ctx, 1 + sizeof(level));
6668
nrf_rpc_encode_uint(&ctx, level);
67-
nrf_rpc_cbor_cmd_rsp_no_err(&log_rpc_group, LOG_RPC_CMD_SET_STREAM_LEVEL, &ctx);
68-
69-
nrf_rpc_cbor_decoding_done(&log_rpc_group, &ctx);
69+
nrf_rpc_cbor_cmd_no_err(&log_rpc_group, LOG_RPC_CMD_SET_STREAM_LEVEL, &ctx,
70+
nrf_rpc_rsp_decode_void, NULL);
7071

7172
return 0;
7273
}
7374

7475
int log_rpc_get_crash_log(size_t offset, char *buffer, size_t buffer_length)
7576
{
7677
struct nrf_rpc_cbor_ctx ctx;
77-
struct zcbor_string log_chunk;
78-
bool decoded_ok;
79-
80-
NRF_RPC_CBOR_ALLOC(&log_rpc_group, ctx, 10);
81-
82-
if (!zcbor_uint32_put(ctx.zs, offset) || !zcbor_uint32_put(ctx.zs, buffer_length)) {
83-
NRF_RPC_CBOR_DISCARD(&log_rpc_group, ctx);
84-
return -ENOBUFS;
85-
}
78+
const uint8_t *log_chunk;
79+
size_t log_chunk_size = 0;
8680

81+
NRF_RPC_CBOR_ALLOC(&log_rpc_group, ctx, 2 + sizeof(offset) + sizeof(buffer_length));
82+
nrf_rpc_encode_uint(&ctx, offset);
83+
nrf_rpc_encode_uint(&ctx, buffer_length);
8784
nrf_rpc_cbor_cmd_rsp_no_err(&log_rpc_group, LOG_RPC_CMD_GET_CRASH_LOG, &ctx);
8885

8986
/* Parse response */
90-
decoded_ok = zcbor_bstr_decode(ctx.zs, &log_chunk);
91-
nrf_rpc_cbor_decoding_done(&log_rpc_group, &ctx);
87+
log_chunk = nrf_rpc_decode_buffer_ptr_and_size(&ctx, &log_chunk_size);
9288

93-
if (!decoded_ok) {
94-
return -EINVAL;
89+
if (log_chunk) {
90+
log_chunk_size = MIN(log_chunk_size, buffer_length);
91+
memcpy(buffer, log_chunk, log_chunk_size);
9592
}
9693

97-
log_chunk.len = MIN(log_chunk.len, buffer_length);
98-
memcpy(buffer, log_chunk.value, log_chunk.len);
94+
if (!nrf_rpc_decoding_done_and_check(&log_rpc_group, &ctx)) {
95+
nrf_rpc_err(-EBADMSG, NRF_RPC_ERR_SRC_RECV, &log_rpc_group,
96+
LOG_RPC_CMD_GET_CRASH_LOG, NRF_RPC_PACKET_TYPE_RSP);
97+
}
9998

100-
return log_chunk.len;
99+
return log_chunk_size;
101100
}

0 commit comments

Comments
 (0)