Skip to content

Commit 63145c4

Browse files
Damian-Nordicnordicjm
authored andcommitted
net: openthread: rpc: add otLinkRawGetRadioTime()
Add serialization of otLinkRawGetRadioTime() API. Signed-off-by: Damian Krolik <[email protected]>
1 parent 87b1ef6 commit 63145c4

File tree

9 files changed

+232
-10
lines changed

9 files changed

+232
-10
lines changed

doc/nrf/libraries/networking/ot_rpc.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ OpenThread RPC currently supports the serialization of the following OpenThread
123123
* :c:func:`otLinkGetFactoryAssignedIeeeEui64`
124124
* :c:func:`otLinkGetPanId`
125125
* :c:func:`otLinkGetPollPeriod`
126+
* :c:func:`otLinkRawGetRadioTime`
126127
* :c:func:`otLinkSetEnabled`
127128
* :c:func:`otLinkSetMaxFrameRetriesDirect`
128129
* :c:func:`otLinkSetMaxFrameRetriesIndirect`

samples/nrf_rpc/protocols_serialization/client/src/ot_shell.c

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include <openthread/coap.h>
1414
#include <openthread/ip6.h>
1515
#include <openthread/link.h>
16+
#include <openthread/link_raw.h>
1617
#include <openthread/thread.h>
1718
#include <openthread/udp.h>
1819
#include <openthread/netdata.h>
@@ -235,6 +236,26 @@ static int cmd_discover(const struct shell *sh, size_t argc, char *argv[])
235236
return ot_cli_command_invoke(ot_cli_command_discover, sh, argc, argv);
236237
}
237238

239+
static otError ot_cli_command_radio(const struct shell *sh, size_t argc, char *argv[])
240+
{
241+
if (argc != 2 || strcmp(argv[1], "time") != 0) {
242+
return OT_ERROR_INVALID_COMMAND;
243+
}
244+
245+
shell_print(sh, "%" PRIu64, otLinkRawGetRadioTime(NULL));
246+
247+
return OT_ERROR_NONE;
248+
}
249+
250+
static int cmd_radio(const struct shell *sh, size_t argc, char *argv[])
251+
{
252+
if (argc == 2 && strcmp(argv[1], "time") == 0) {
253+
return ot_cli_command_invoke(ot_cli_command_radio, sh, argc, argv);
254+
}
255+
256+
return ot_cli_command_send(sh, argc + 1, argv - 1);
257+
}
258+
238259
static otError ot_cli_command_ifconfig(const struct shell *sh, size_t argc, char *argv[])
239260
{
240261
if (argc <= 1) {
@@ -1783,6 +1804,7 @@ SHELL_STATIC_SUBCMD_SET_CREATE(
17831804
SHELL_CMD_ARG(state, NULL, "Current role", cmd_state, 1, 1),
17841805
SHELL_CMD_ARG(thread, NULL, "Role management", cmd_thread, 2, 0),
17851806
SHELL_CMD_ARG(discover, NULL, "Thread discovery scan", cmd_discover, 1, 4),
1807+
SHELL_CMD_ARG(radio, NULL, "Radio configuration", cmd_radio, 1, 1),
17861808
SHELL_CMD_ARG(test_message, NULL, "Test message API", cmd_test_message, 1, 0),
17871809
SHELL_CMD_ARG(test_udp_init, NULL, "Test udp init API", cmd_test_udp_init, 1, 0),
17881810
SHELL_CMD_ARG(test_udp_send, NULL, "Test udp send API", cmd_test_udp_send, 1, 0),
@@ -1827,8 +1849,8 @@ SHELL_STATIC_SUBCMD_SET_CREATE(
18271849
SHELL_CMD_ARG(cmd_test_srp_client_service_clear, NULL, "Test SRP client service clear API",
18281850
cmd_test_srp_client_service_clear, 2, 0),
18291851
SHELL_CMD_ARG(test_srp_client_add_service_remove, NULL,
1830-
"Test SRP client service remove API",
1831-
cmd_test_srp_client_service_remove, 2, 0),
1852+
"Test SRP client service remove API", cmd_test_srp_client_service_remove, 2,
1853+
0),
18321854
SHELL_CMD_ARG(test_srp_client_host_address_auto, NULL,
18331855
"Test SRP client host address auto API",
18341856
cmd_test_srp_client_host_address_auto, 1, 0),
@@ -1845,19 +1867,23 @@ SHELL_STATIC_SUBCMD_SET_CREATE(
18451867
cmd_dns_client_resolve, 3, 0),
18461868
SHELL_CMD_ARG(test_dns_client_resolve4, NULL, "Resolve IPv4 address, args: <name> <server>",
18471869
cmd_dns_client_resolve, 3, 0),
1848-
SHELL_CMD_ARG(test_dns_client_service, NULL, "Service instance resolution, args: <instance>"
1849-
"<service> <server>",
1870+
SHELL_CMD_ARG(test_dns_client_service, NULL,
1871+
"Service instance resolution, args: <instance>"
1872+
"<service> <server>",
18501873
cmd_dns_client_service, 4, 0),
1851-
SHELL_CMD_ARG(test_dns_client_servicehost, NULL, "Service instance resolution, args:"
1852-
" <instance> <service> <server>",
1874+
SHELL_CMD_ARG(test_dns_client_servicehost, NULL,
1875+
"Service instance resolution, args:"
1876+
" <instance> <service> <server>",
18531877
cmd_dns_client_service, 4, 0),
18541878
SHELL_CMD_ARG(test_dns_client_browse, NULL, "Service browsing, args <service> <server>",
18551879
cmd_dns_client_browse, 3, 0),
1856-
SHELL_CMD_ARG(test_vendor_data, NULL, "Vendor data, args: <vendor-name> <vendor-model>"
1857-
" <vendor-sw-version>",
1880+
SHELL_CMD_ARG(test_vendor_data, NULL,
1881+
"Vendor data, args: <vendor-name> <vendor-model>"
1882+
" <vendor-sw-version>",
18581883
cmd_test_vendor_data, 4, 0),
1859-
SHELL_CMD_ARG(test_net_diag, NULL, "Network diag, args: <get|reset> <IPv6-address>"
1860-
" <tlv-type ...>",
1884+
SHELL_CMD_ARG(test_net_diag, NULL,
1885+
"Network diag, args: <get|reset> <IPv6-address>"
1886+
" <tlv-type ...>",
18611887
cmd_test_net_diag, 4, 255),
18621888
SHELL_SUBCMD_SET_END);
18631889

subsys/net/openthread/rpc/client/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ zephyr_library_sources(
1515
ot_rpc_instance.c
1616
ot_rpc_ip6.c
1717
ot_rpc_link.c
18+
ot_rpc_link_raw.c
1819
ot_rpc_message.c
1920
ot_rpc_netdata.c
2021
ot_rpc_netdiag.c
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
#include <ot_rpc_ids.h>
8+
#include <ot_rpc_common.h>
9+
#include <nrf_rpc/nrf_rpc_serialize.h>
10+
11+
#include <nrf_rpc_cbor.h>
12+
13+
#include <openthread/link_raw.h>
14+
15+
uint64_t otLinkRawGetRadioTime(otInstance *aInstance)
16+
{
17+
struct nrf_rpc_cbor_ctx ctx;
18+
uint64_t time;
19+
20+
ARG_UNUSED(aInstance);
21+
22+
NRF_RPC_CBOR_ALLOC(&ot_group, ctx, 0);
23+
nrf_rpc_cbor_cmd_rsp_no_err(&ot_group, OT_RPC_CMD_LINK_RAW_GET_RADIO_TIME, &ctx);
24+
25+
time = nrf_rpc_decode_uint64(&ctx);
26+
27+
if (!nrf_rpc_decoding_done_and_check(&ot_group, &ctx)) {
28+
ot_rpc_report_rsp_decoding_error(OT_RPC_CMD_LINK_RAW_GET_RADIO_TIME);
29+
}
30+
31+
return time;
32+
}

subsys/net/openthread/rpc/common/ot_rpc_ids.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ enum ot_rpc_cmd_server {
163163
OT_RPC_CMD_DNS_SERVICE_RESP_GET_SERVICE_NAME,
164164
OT_RPC_CMD_DNS_SERVICE_RESP_GET_SERVICE_INFO,
165165
OT_RPC_CMD_DNS_SERVICE_RESP_GET_HOST_ADDRESS,
166+
OT_RPC_CMD_LINK_RAW_GET_RADIO_TIME,
166167
};
167168

168169
#endif /* OT_RPC_IDS_H_ */

subsys/net/openthread/rpc/server/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ zephyr_library_sources(
1515
ot_rpc_instance.c
1616
ot_rpc_ip6.c
1717
ot_rpc_link.c
18+
ot_rpc_link_raw.c
1819
ot_rpc_message.c
1920
ot_rpc_netdata.c
2021
ot_rpc_netdiag.c
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
#include <nrf_rpc/nrf_rpc_serialize.h>
8+
#include <ot_rpc_ids.h>
9+
#include <ot_rpc_types.h>
10+
#include <ot_rpc_common.h>
11+
12+
#include <nrf_rpc_cbor.h>
13+
14+
#include <zephyr/net/openthread.h>
15+
16+
#include <openthread/link_raw.h>
17+
18+
static void ot_rpc_cmd_get_radio_time(const struct nrf_rpc_group *group,
19+
struct nrf_rpc_cbor_ctx *ctx, void *handler_data)
20+
{
21+
uint64_t time;
22+
struct nrf_rpc_cbor_ctx rsp_ctx;
23+
24+
if (!nrf_rpc_decoding_done_and_check(group, ctx)) {
25+
ot_rpc_report_cmd_decoding_error(OT_RPC_CMD_LINK_RAW_GET_RADIO_TIME);
26+
return;
27+
}
28+
29+
openthread_api_mutex_lock(openthread_get_default_context());
30+
time = otLinkRawGetRadioTime(openthread_get_default_instance());
31+
openthread_api_mutex_unlock(openthread_get_default_context());
32+
33+
NRF_RPC_CBOR_ALLOC(group, rsp_ctx, 1 + sizeof(time));
34+
nrf_rpc_encode_uint64(&rsp_ctx, time);
35+
nrf_rpc_cbor_rsp_no_err(group, &rsp_ctx);
36+
}
37+
38+
NRF_RPC_CBOR_CMD_DECODER(ot_group, ot_rpc_cmd_get_radio_time, OT_RPC_CMD_LINK_RAW_GET_RADIO_TIME,
39+
ot_rpc_cmd_get_radio_time, NULL);
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* Copyright (c) 2024 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
#include <mock_nrf_rpc_transport.h>
8+
#include <ot_rpc_ids.h>
9+
#include <test_rpc_env.h>
10+
11+
#include <zephyr/ztest.h>
12+
#include <zephyr/kernel.h>
13+
14+
#include <openthread/link_raw.h>
15+
16+
static void nrf_rpc_err_handler(const struct nrf_rpc_err_report *report)
17+
{
18+
zassert_ok(report->code);
19+
}
20+
21+
static void tc_setup(void *f)
22+
{
23+
mock_nrf_rpc_tr_expect_add(RPC_INIT_REQ, RPC_INIT_RSP);
24+
zassert_ok(nrf_rpc_init(nrf_rpc_err_handler));
25+
mock_nrf_rpc_tr_expect_reset();
26+
}
27+
28+
/* Test serialization of otLinkRawGetRadioTime() which returns 0 */
29+
ZTEST(ot_rpc_link_raw, test_otLinkRawGetRadioTime_0)
30+
{
31+
uint64_t time;
32+
33+
mock_nrf_rpc_tr_expect_add(RPC_CMD(OT_RPC_CMD_LINK_RAW_GET_RADIO_TIME), RPC_RSP(0));
34+
time = otLinkRawGetRadioTime(NULL);
35+
mock_nrf_rpc_tr_expect_done();
36+
37+
zassert_equal(time, 0);
38+
}
39+
40+
/* Test serialization of otLinkRawGetRadioTime() which returns UINT64_MAX */
41+
ZTEST(ot_rpc_link_raw, test_otLinkRawGetRadioTime_max)
42+
{
43+
uint64_t time;
44+
45+
mock_nrf_rpc_tr_expect_add(RPC_CMD(OT_RPC_CMD_LINK_RAW_GET_RADIO_TIME),
46+
RPC_RSP(CBOR_UINT64(UINT64_MAX)));
47+
time = otLinkRawGetRadioTime(NULL);
48+
mock_nrf_rpc_tr_expect_done();
49+
50+
zassert_equal(time, UINT64_MAX);
51+
}
52+
53+
ZTEST_SUITE(ot_rpc_link_raw, NULL, NULL, tc_setup, NULL, NULL);
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* Copyright (c) 2025 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause
5+
*/
6+
7+
#include <mock_nrf_rpc_transport.h>
8+
#include <ot_rpc_ids.h>
9+
#include <test_rpc_env.h>
10+
11+
#include <zephyr/fff.h>
12+
#include <zephyr/ztest.h>
13+
#include <zephyr/kernel.h>
14+
15+
#include <openthread/link_raw.h>
16+
17+
/* Fake functions */
18+
19+
FAKE_VALUE_FUNC(uint64_t, otLinkRawGetRadioTime, otInstance *);
20+
21+
#define FOREACH_FAKE(f) f(otLinkRawGetRadioTime);
22+
23+
static void nrf_rpc_err_handler(const struct nrf_rpc_err_report *report)
24+
{
25+
zassert_ok(report->code);
26+
}
27+
28+
static void tc_setup(void *f)
29+
{
30+
mock_nrf_rpc_tr_expect_add(RPC_INIT_REQ, RPC_INIT_RSP);
31+
zassert_ok(nrf_rpc_init(nrf_rpc_err_handler));
32+
mock_nrf_rpc_tr_expect_reset();
33+
34+
FOREACH_FAKE(RESET_FAKE);
35+
FFF_RESET_HISTORY();
36+
}
37+
38+
/*
39+
* Test reception of otLinkRawGetRadioTime() command.
40+
* Test serialization of the result: 0.
41+
*/
42+
ZTEST(ot_rpc_link_raw, test_otLinkRawGetRadioTime_0)
43+
{
44+
otLinkRawGetRadioTime_fake.return_val = 0;
45+
46+
mock_nrf_rpc_tr_expect_add(RPC_RSP(0), NO_RSP);
47+
mock_nrf_rpc_tr_receive(RPC_CMD(OT_RPC_CMD_LINK_RAW_GET_RADIO_TIME));
48+
mock_nrf_rpc_tr_expect_done();
49+
50+
zassert_equal(otLinkRawGetRadioTime_fake.call_count, 1);
51+
}
52+
53+
/*
54+
* Test reception of otLinkRawGetRadioTime() command.
55+
* Test serialization of the result: UINT64_MAX.
56+
*/
57+
ZTEST(ot_rpc_link_raw, test_otLinkRawGetRadioTime_max)
58+
{
59+
otLinkRawGetRadioTime_fake.return_val = UINT64_MAX;
60+
61+
mock_nrf_rpc_tr_expect_add(RPC_RSP(CBOR_UINT64(UINT64_MAX)), NO_RSP);
62+
mock_nrf_rpc_tr_receive(RPC_CMD(OT_RPC_CMD_LINK_RAW_GET_RADIO_TIME));
63+
mock_nrf_rpc_tr_expect_done();
64+
65+
zassert_equal(otLinkRawGetRadioTime_fake.call_count, 1);
66+
}
67+
68+
ZTEST_SUITE(ot_rpc_link_raw, NULL, NULL, tc_setup, NULL, NULL);

0 commit comments

Comments
 (0)