1 /*
2  * Copyright (c) 2020, Nordic Semiconductor ASA
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice, this
11  *    list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  *
17  * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
18  *    contributors may be used to endorse or promote products derived from this
19  *    software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY, AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  *
33  */
34 
35 /**
36  * @file nrf_802154_spinel_app.c
37  *
38  * @brief Implementation of nRF 802.15.4 Radio Driver API for application
39  *        core talking to network core through spinel
40  *
41  * This file is responsible for providing implementation of API calls
42  * defined by nrf_802154.h. Application is responsible for providing
43  * appropriate callouts according to nRF 802.15.4 API.
44  */
45 
46 #include <stdint.h>
47 
48 #include "nrf_802154_const.h"
49 
50 #include "../spinel_base/spinel.h"
51 #include "nrf_802154_serialization.h"
52 #include "nrf_802154_spinel.h"
53 #include "nrf_802154_spinel_datatypes.h"
54 #include "nrf_802154_spinel_enc_app.h"
55 #include "nrf_802154_spinel_dec_app.h"
56 #include "nrf_802154_spinel_log.h"
57 #include "nrf_802154_spinel_response_notifier.h"
58 #include "nrf_802154_serialization_error.h"
59 #include "nrf_802154_serialization_error_helper.h"
60 #include "nrf_802154_buffer_mgr_dst.h"
61 #include "nrf_802154_buffer_mgr_src.h"
62 
63 #include "nrf_802154.h"
64 #include "nrf_802154_config.h"
65 #include "nrf_802154_types.h"
66 
67 /**
68  * @brief Wait with timeout for SPINEL_STATUS_OK to be received.
69  *
70  * @param[in]  timeout   Timeout in us.
71  *
72  * @returns  zero on success or negative error value on failure.
73  *
74  */
status_ok_await(uint32_t timeout)75 static nrf_802154_ser_err_t status_ok_await(uint32_t timeout)
76 {
77     spinel_status_t                   status = SPINEL_STATUS_FAILURE;
78     nrf_802154_ser_err_t              res;
79     nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
80 
81     SERIALIZATION_ERROR_INIT(error);
82 
83     p_notify_data = nrf_802154_spinel_response_notifier_property_await(timeout);
84 
85     SERIALIZATION_ERROR_IF(p_notify_data == NULL,
86                            NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
87                            error,
88                            bail);
89 
90     res = nrf_802154_spinel_decode_prop_last_status(p_notify_data->data,
91                                                     p_notify_data->data_len,
92                                                     &status);
93     SERIALIZATION_ERROR_CHECK(res, error, bail);
94 
95     NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
96     NRF_802154_SPINEL_LOG_VAR_NAMED("%s", spinel_status_to_cstr(status), "status");
97 
98     SERIALIZATION_ERROR_IF(status != SPINEL_STATUS_OK,
99                            NRF_802154_SERIALIZATION_ERROR_RESPONSE_INVALID,
100                            error,
101                            bail);
102 
103 bail:
104     if (p_notify_data != NULL)
105     {
106         nrf_802154_spinel_response_notifier_free(p_notify_data);
107     }
108 
109     return error;
110 }
111 
112 /**
113  * @brief Wait with timeout for some single bool property to be received.
114  *
115  * @param[in]  timeout          Timeout in us.
116  * @param[out] p_net_response   Pointer to the bool variable which needs to be populated.
117  *
118  * @returns  zero on success or negative error value on failure.
119  *
120  */
net_generic_bool_response_await(uint32_t timeout,bool * p_net_response)121 static nrf_802154_ser_err_t net_generic_bool_response_await(uint32_t timeout,
122                                                             bool   * p_net_response)
123 {
124     nrf_802154_ser_err_t              res;
125     nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
126 
127     SERIALIZATION_ERROR_INIT(error);
128 
129     p_notify_data = nrf_802154_spinel_response_notifier_property_await(timeout);
130 
131     SERIALIZATION_ERROR_IF(p_notify_data == NULL,
132                            NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
133                            error,
134                            bail);
135 
136     res = nrf_802154_spinel_decode_prop_generic_bool(p_notify_data->data,
137                                                      p_notify_data->data_len,
138                                                      p_net_response);
139 
140     SERIALIZATION_ERROR_CHECK(res, error, bail);
141 
142     NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
143     NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (*p_net_response) ? "true" : "false", "net response");
144 
145 bail:
146     if (p_notify_data != NULL)
147     {
148         nrf_802154_spinel_response_notifier_free(p_notify_data);
149     }
150 
151     return error;
152 }
153 
154 /**
155  * @brief Wait with timeout for some single uint8_t property to be received.
156  *
157  * @param[in]  timeout          Timeout in us.
158  * @param[out] p_net_response   Pointer to the uint8_t variable which needs to be populated.
159  *
160  * @returns  zero on success or negative error value on failure.
161  *
162  */
net_generic_uint8_response_await(uint32_t timeout,uint8_t * p_net_response)163 static nrf_802154_ser_err_t net_generic_uint8_response_await(uint32_t  timeout,
164                                                              uint8_t * p_net_response)
165 {
166     nrf_802154_ser_err_t              res;
167     nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
168 
169     SERIALIZATION_ERROR_INIT(error);
170 
171     p_notify_data = nrf_802154_spinel_response_notifier_property_await(timeout);
172 
173     SERIALIZATION_ERROR_IF(p_notify_data == NULL,
174                            NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
175                            error,
176                            bail);
177 
178     res = nrf_802154_spinel_decode_prop_generic_uint8(p_notify_data->data,
179                                                       p_notify_data->data_len,
180                                                       p_net_response);
181 
182     SERIALIZATION_ERROR_CHECK(res, error, bail);
183 
184     NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
185     NRF_802154_SPINEL_LOG_VAR_NAMED("%u", *p_net_response, "net response");
186 
187 bail:
188     if (p_notify_data != NULL)
189     {
190         nrf_802154_spinel_response_notifier_free(p_notify_data);
191     }
192 
193     return error;
194 }
195 
196 #if NRF_802154_IFS_ENABLED
197 /**
198  * @brief Wait with timeout for some single uint16_t property to be received.
199  *
200  * @param[in]  timeout          Timeout in us.
201  * @param[out] p_net_response   Pointer to the uint16_t variable which needs to be populated.
202  *
203  * @returns  zero on success or negative error value on failure.
204  *
205  */
net_generic_uint16_response_await(uint32_t timeout,uint16_t * p_net_response)206 static nrf_802154_ser_err_t net_generic_uint16_response_await(uint32_t   timeout,
207                                                               uint16_t * p_net_response)
208 {
209     nrf_802154_ser_err_t              res;
210     nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
211 
212     SERIALIZATION_ERROR_INIT(error);
213 
214     p_notify_data = nrf_802154_spinel_response_notifier_property_await(timeout);
215 
216     SERIALIZATION_ERROR_IF(p_notify_data == NULL,
217                            NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
218                            error,
219                            bail);
220 
221     res = nrf_802154_spinel_decode_prop_generic_uint16(p_notify_data->data,
222                                                        p_notify_data->data_len,
223                                                        p_net_response);
224 
225     SERIALIZATION_ERROR_CHECK(res, error, bail);
226 
227     NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
228     NRF_802154_SPINEL_LOG_VAR_NAMED("%u", *p_net_response, "net response");
229 
230 bail:
231     if (p_notify_data != NULL)
232     {
233         nrf_802154_spinel_response_notifier_free(p_notify_data);
234     }
235 
236     return error;
237 }
238 
239 #endif
240 
241 /**
242  * @brief Wait with timeout for TX Power property to be received.
243  *
244  * @param[in]  timeout   Timeout in us.
245  * @param[out] p_power   Pointer to the power variable which needs to be populated.
246  *
247  * @returns  zero on success or negative error value on failure.
248  *
249  */
tx_power_await(uint32_t timeout,int8_t * p_power)250 static nrf_802154_ser_err_t tx_power_await(uint32_t timeout, int8_t * p_power)
251 {
252     nrf_802154_ser_err_t              res;
253     nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
254 
255     SERIALIZATION_ERROR_INIT(error);
256 
257     p_notify_data = nrf_802154_spinel_response_notifier_property_await(
258         timeout);
259 
260     SERIALIZATION_ERROR_IF(p_notify_data == NULL,
261                            NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
262                            error,
263                            bail);
264 
265     res = nrf_802154_spinel_decode_prop_nrf_802154_tx_power_get_ret(p_notify_data->data,
266                                                                     p_notify_data->data_len,
267                                                                     p_power);
268 
269     SERIALIZATION_ERROR_CHECK(res, error, bail);
270 
271     NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
272     NRF_802154_SPINEL_LOG_VAR_NAMED("%d", *p_power, "Tx power");
273 
274 bail:
275     if (p_notify_data != NULL)
276     {
277         nrf_802154_spinel_response_notifier_free(p_notify_data);
278     }
279 
280     return error;
281 }
282 
283 /**
284  * @brief Wait with timeout for capabilities property to be received.
285  *
286  * @param[in]  timeout          Timeout in us.
287  * @param[out] p_capabilities   Pointer to the capabilities variable which needs to be populated.
288  *
289  * @returns  zero on success or negative error value on failure.
290  *
291  */
capabilities_await(uint32_t timeout,nrf_802154_capabilities_t * p_capabilities)292 static nrf_802154_ser_err_t capabilities_await(uint32_t                    timeout,
293                                                nrf_802154_capabilities_t * p_capabilities)
294 {
295     nrf_802154_ser_err_t              res;
296     nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
297 
298     SERIALIZATION_ERROR_INIT(error);
299 
300     p_notify_data = nrf_802154_spinel_response_notifier_property_await(
301         timeout);
302 
303     SERIALIZATION_ERROR_IF(p_notify_data == NULL,
304                            NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
305                            error,
306                            bail);
307 
308     res = nrf_802154_spinel_decode_prop_nrf_802154_capabilities_get_ret(p_notify_data->data,
309                                                                         p_notify_data->data_len,
310                                                                         p_capabilities);
311 
312     SERIALIZATION_ERROR_CHECK(res, error, bail);
313 
314     NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
315     NRF_802154_SPINEL_LOG_VAR_NAMED("%u", *p_capabilities, "Capabilities");
316 
317 bail:
318     if (p_notify_data != NULL)
319     {
320         nrf_802154_spinel_response_notifier_free(p_notify_data);
321     }
322 
323     return error;
324 }
325 
326 /**
327  * @brief Wait with timeout for time property to be received.
328  *
329  * @param[in]  timeout  Timeout in us.
330  * @param[out] p_time   Pointer to the time variable which needs to be populated.
331  *
332  * @returns  zero on success or negative error value on failure.
333  *
334  */
time_await(uint32_t timeout,uint64_t * p_time)335 static nrf_802154_ser_err_t time_await(uint32_t   timeout,
336                                        uint64_t * p_time)
337 {
338     nrf_802154_ser_err_t              res;
339     nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
340 
341     SERIALIZATION_ERROR_INIT(error);
342 
343     p_notify_data = nrf_802154_spinel_response_notifier_property_await(
344         timeout);
345 
346     SERIALIZATION_ERROR_IF(p_notify_data == NULL,
347                            NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
348                            error,
349                            bail);
350 
351     res = nrf_802154_spinel_decode_prop_nrf_802154_time_get_ret(p_notify_data->data,
352                                                                 p_notify_data->data_len,
353                                                                 p_time);
354 
355     SERIALIZATION_ERROR_CHECK(res, error, bail);
356 
357     NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
358     NRF_802154_SPINEL_LOG_VAR_NAMED("%llu", *p_time, "Time");
359 
360 bail:
361     if (p_notify_data != NULL)
362     {
363         nrf_802154_spinel_response_notifier_free(p_notify_data);
364     }
365 
366     return error;
367 }
368 
369 /**
370  * @brief Wait with timeout for CCA configuration property to be received.
371  *
372  * @param[in]  timeout  Timeout in us.
373  * @param[out] p_cfg    Pointer to the CCA configuration variable which needs to be populated.
374  *
375  * @returns  zero on success or negative error value on failure.
376  *
377  */
cca_cfg_await(uint32_t timeout,nrf_802154_cca_cfg_t * p_cfg)378 static nrf_802154_ser_err_t cca_cfg_await(uint32_t               timeout,
379                                           nrf_802154_cca_cfg_t * p_cfg)
380 {
381     nrf_802154_ser_err_t              res;
382     nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
383 
384     SERIALIZATION_ERROR_INIT(error);
385 
386     p_notify_data = nrf_802154_spinel_response_notifier_property_await(
387         timeout);
388 
389     SERIALIZATION_ERROR_IF(p_notify_data == NULL,
390                            NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
391                            error,
392                            bail);
393 
394     res = nrf_802154_spinel_decode_prop_nrf_802154_cca_cfg_get_ret(p_notify_data->data,
395                                                                    p_notify_data->data_len,
396                                                                    p_cfg);
397 
398     SERIALIZATION_ERROR_CHECK(res, error, bail);
399 
400     NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
401     NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->mode, "Mode");
402     NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->ed_threshold, "ED threshold");
403     NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->corr_threshold, "Corr threshold");
404     NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->corr_limit, "Corr limit");
405 
406 bail:
407     if (p_notify_data != NULL)
408     {
409         nrf_802154_spinel_response_notifier_free(p_notify_data);
410     }
411 
412     return error;
413 }
414 
nrf_802154_init(void)415 void nrf_802154_init(void)
416 {
417     nrf_802154_serialization_init();
418 }
419 
nrf_802154_sleep(void)420 bool nrf_802154_sleep(void)
421 {
422     nrf_802154_ser_err_t res;
423     bool                 sleep_remote_resp = false;
424 
425     SERIALIZATION_ERROR_INIT(error);
426 
427     NRF_802154_SPINEL_LOG_BANNER_CALLING();
428 
429     nrf_802154_spinel_response_notifier_lock_before_request(
430         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SLEEP);
431 
432     res = nrf_802154_spinel_send_cmd_prop_value_set(SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SLEEP,
433                                                     SPINEL_DATATYPE_NRF_802154_SLEEP,
434                                                     NULL);
435 
436     SERIALIZATION_ERROR_CHECK(res, error, bail);
437 
438     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
439                                           &sleep_remote_resp);
440 
441     SERIALIZATION_ERROR_CHECK(res, error, bail);
442 
443 bail:
444     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
445 
446     return sleep_remote_resp;
447 }
448 
nrf_802154_sleep_if_idle(void)449 nrf_802154_sleep_error_t nrf_802154_sleep_if_idle(void)
450 {
451     nrf_802154_ser_err_t     res;
452     nrf_802154_sleep_error_t sleep_remote_resp = NRF_802154_SLEEP_ERROR_NONE;
453 
454     SERIALIZATION_ERROR_INIT(error);
455 
456     NRF_802154_SPINEL_LOG_BANNER_CALLING();
457 
458     nrf_802154_spinel_response_notifier_lock_before_request(
459         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SLEEP_IF_IDLE);
460 
461     res = nrf_802154_spinel_send_cmd_prop_value_set(
462         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SLEEP_IF_IDLE,
463         SPINEL_DATATYPE_NRF_802154_SLEEP_IF_IDLE,
464         NULL);
465 
466     SERIALIZATION_ERROR_CHECK(res, error, bail);
467 
468     res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
469                                            &sleep_remote_resp);
470 
471     SERIALIZATION_ERROR_CHECK(res, error, bail);
472 
473 bail:
474     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
475 
476     return sleep_remote_resp;
477 }
478 
nrf_802154_receive(void)479 bool nrf_802154_receive(void)
480 {
481     nrf_802154_ser_err_t res;
482     bool                 receive_remote_resp = false;
483 
484     SERIALIZATION_ERROR_INIT(error);
485 
486     NRF_802154_SPINEL_LOG_BANNER_CALLING();
487 
488     nrf_802154_spinel_response_notifier_lock_before_request(
489         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE);
490 
491     res = nrf_802154_spinel_send_cmd_prop_value_set(SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE,
492                                                     SPINEL_DATATYPE_NRF_802154_RECEIVE,
493                                                     NULL);
494 
495     SERIALIZATION_ERROR_CHECK(res, error, bail);
496 
497     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
498                                           &receive_remote_resp);
499 
500     SERIALIZATION_ERROR_CHECK(res, error, bail);
501 
502 bail:
503     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
504 
505     return receive_remote_resp;
506 }
507 
nrf_802154_receive_at(uint64_t rx_time,uint32_t timeout,uint8_t channel,uint32_t id)508 bool nrf_802154_receive_at(uint64_t rx_time,
509                            uint32_t timeout,
510                            uint8_t  channel,
511                            uint32_t id)
512 {
513     nrf_802154_ser_err_t res;
514     bool                 rx_at_result = false;
515 
516     SERIALIZATION_ERROR_INIT(error);
517 
518     NRF_802154_SPINEL_LOG_BANNER_CALLING();
519 
520     nrf_802154_spinel_response_notifier_lock_before_request(
521         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE_AT);
522 
523     res = nrf_802154_spinel_send_cmd_prop_value_set(
524         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE_AT,
525         SPINEL_DATATYPE_NRF_802154_RECEIVE_AT,
526         rx_time,
527         timeout,
528         channel,
529         id);
530 
531     SERIALIZATION_ERROR_CHECK(res, error, bail);
532 
533     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
534                                           &rx_at_result);
535 
536     SERIALIZATION_ERROR_CHECK(res, error, bail);
537 
538 bail:
539     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
540 
541     return rx_at_result;
542 
543 }
544 
nrf_802154_receive_at_cancel(uint32_t id)545 bool nrf_802154_receive_at_cancel(uint32_t id)
546 {
547     nrf_802154_ser_err_t res;
548     bool                 cancel_result = false;
549 
550     SERIALIZATION_ERROR_INIT(error);
551 
552     NRF_802154_SPINEL_LOG_BANNER_CALLING();
553 
554     nrf_802154_spinel_response_notifier_lock_before_request(
555         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE_AT_CANCEL);
556 
557     res = nrf_802154_spinel_send_cmd_prop_value_set(
558         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RECEIVE_AT_CANCEL,
559         SPINEL_DATATYPE_NRF_802154_RECEIVE_AT_CANCEL,
560         id);
561 
562     SERIALIZATION_ERROR_CHECK(res, error, bail);
563 
564     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
565                                           &cancel_result);
566 
567     SERIALIZATION_ERROR_CHECK(res, error, bail);
568 
569 bail:
570     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
571 
572     return cancel_result;
573 }
574 
nrf_802154_pan_id_set(const uint8_t * p_pan_id)575 void nrf_802154_pan_id_set(const uint8_t * p_pan_id)
576 {
577     nrf_802154_ser_err_t res;
578 
579     SERIALIZATION_ERROR_INIT(error);
580 
581     NRF_802154_SPINEL_LOG_BANNER_CALLING();
582     NRF_802154_SPINEL_LOG_BUFF(p_pan_id, PAN_ID_SIZE);
583 
584     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
585 
586     res = nrf_802154_spinel_send_cmd_prop_value_set(SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PAN_ID_SET,
587                                                     SPINEL_DATATYPE_NRF_802154_PAN_ID_SET,
588                                                     p_pan_id,
589                                                     PAN_ID_SIZE);
590 
591     SERIALIZATION_ERROR_CHECK(res, error, bail);
592 
593     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
594     SERIALIZATION_ERROR_CHECK(res, error, bail);
595 
596 bail:
597     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
598 
599     return;
600 }
601 
nrf_802154_short_address_set(const uint8_t * p_short_address)602 void nrf_802154_short_address_set(const uint8_t * p_short_address)
603 {
604     nrf_802154_ser_err_t res;
605 
606     SERIALIZATION_ERROR_INIT(error);
607 
608     NRF_802154_SPINEL_LOG_BANNER_CALLING();
609     NRF_802154_SPINEL_LOG_BUFF(p_short_address, SHORT_ADDRESS_SIZE);
610 
611     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
612 
613     res = nrf_802154_spinel_send_cmd_prop_value_set(
614         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SHORT_ADDRESS_SET,
615         SPINEL_DATATYPE_NRF_802154_SHORT_ADDRESS_SET,
616         p_short_address,
617         SHORT_ADDRESS_SIZE);
618 
619     SERIALIZATION_ERROR_CHECK(res, error, bail);
620 
621     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
622     SERIALIZATION_ERROR_CHECK(res, error, bail);
623 
624 bail:
625     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
626 
627     return;
628 }
629 
nrf_802154_extended_address_set(const uint8_t * p_extended_address)630 void nrf_802154_extended_address_set(const uint8_t * p_extended_address)
631 {
632     nrf_802154_ser_err_t res;
633 
634     SERIALIZATION_ERROR_INIT(error);
635 
636     NRF_802154_SPINEL_LOG_BANNER_CALLING();
637     NRF_802154_SPINEL_LOG_BUFF(p_extended_address, EXTENDED_ADDRESS_SIZE);
638 
639     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
640 
641     res = nrf_802154_spinel_send_cmd_prop_value_set(
642         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_EXTENDED_ADDRESS_SET,
643         SPINEL_DATATYPE_NRF_802154_EXTENDED_ADDRESS_SET,
644         p_extended_address,
645         EXTENDED_ADDRESS_SIZE);
646 
647     SERIALIZATION_ERROR_CHECK(res, error, bail);
648 
649     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
650     SERIALIZATION_ERROR_CHECK(res, error, bail);
651 
652 bail:
653     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
654 
655     return;
656 }
657 
658 #if NRF_802154_PAN_COORD_GET_ENABLED
659 
nrf_802154_pan_coord_get(void)660 bool nrf_802154_pan_coord_get(void)
661 {
662     nrf_802154_ser_err_t res;
663     bool                 result = false;
664 
665     SERIALIZATION_ERROR_INIT(error);
666 
667     NRF_802154_SPINEL_LOG_BANNER_CALLING();
668 
669     nrf_802154_spinel_response_notifier_lock_before_request(
670         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PAN_COORD_GET);
671 
672     res = nrf_802154_spinel_send_cmd_prop_value_set(
673         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PAN_COORD_GET,
674         SPINEL_DATATYPE_NRF_802154_PAN_COORD_GET,
675         &result);
676 
677     SERIALIZATION_ERROR_CHECK(res, error, bail);
678 
679     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
680                                           &result);
681 
682     SERIALIZATION_ERROR_CHECK(res, error, bail);
683 
684 bail:
685     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
686 
687     return result;
688 }
689 
690 #endif // NRF_802154_PAN_COORD_GET_ENABLED
691 
nrf_802154_pan_coord_set(bool enabled)692 void nrf_802154_pan_coord_set(bool enabled)
693 {
694     nrf_802154_ser_err_t res;
695 
696     SERIALIZATION_ERROR_INIT(error);
697 
698     NRF_802154_SPINEL_LOG_BANNER_CALLING();
699     NRF_802154_SPINEL_LOG_VAR_NAMED("%s", enabled ? "true" : "false", "enabled");
700 
701     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
702 
703     res = nrf_802154_spinel_send_cmd_prop_value_set(
704         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PAN_COORD_SET,
705         SPINEL_DATATYPE_NRF_802154_PAN_COORD_SET,
706         enabled);
707 
708     SERIALIZATION_ERROR_CHECK(res, error, bail);
709 
710     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
711     SERIALIZATION_ERROR_CHECK(res, error, bail);
712 
713 bail:
714     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
715 
716     return;
717 }
718 
nrf_802154_promiscuous_set(bool enabled)719 void nrf_802154_promiscuous_set(bool enabled)
720 {
721     nrf_802154_ser_err_t res;
722 
723     SERIALIZATION_ERROR_INIT(error);
724 
725     NRF_802154_SPINEL_LOG_BANNER_CALLING();
726     NRF_802154_SPINEL_LOG_VAR_NAMED("%s", enabled ? "true" : "false", "enabled");
727 
728     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
729 
730     res = nrf_802154_spinel_send_cmd_prop_value_set(
731         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PROMISCUOUS_SET,
732         SPINEL_DATATYPE_NRF_802154_PROMISCUOUS_SET,
733         enabled);
734 
735     SERIALIZATION_ERROR_CHECK(res, error, bail);
736 
737     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
738     SERIALIZATION_ERROR_CHECK(res, error, bail);
739 
740 bail:
741     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
742 }
743 
nrf_802154_rx_on_when_idle_set(bool enabled)744 void nrf_802154_rx_on_when_idle_set(bool enabled)
745 {
746     nrf_802154_ser_err_t res;
747 
748     SERIALIZATION_ERROR_INIT(error);
749 
750     NRF_802154_SPINEL_LOG_BANNER_CALLING();
751     NRF_802154_SPINEL_LOG_VAR_NAMED("%s", enabled ? "true" : "false", "enabled");
752 
753     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
754 
755     res = nrf_802154_spinel_send_cmd_prop_value_set(
756         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_RX_ON_WHEN_IDLE_SET,
757         SPINEL_DATATYPE_NRF_802154_RX_ON_WHEN_IDLE_SET,
758         enabled);
759 
760     SERIALIZATION_ERROR_CHECK(res, error, bail);
761 
762     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
763     SERIALIZATION_ERROR_CHECK(res, error, bail);
764 
765 bail:
766     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
767 }
768 
nrf_802154_src_addr_matching_method_set(nrf_802154_src_addr_match_t match_method)769 void nrf_802154_src_addr_matching_method_set(nrf_802154_src_addr_match_t match_method)
770 {
771     nrf_802154_ser_err_t res;
772 
773     SERIALIZATION_ERROR_INIT(error);
774 
775     NRF_802154_SPINEL_LOG_BANNER_CALLING();
776     NRF_802154_SPINEL_LOG_VAR("%u", match_method);
777 
778     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
779 
780     res = nrf_802154_spinel_send_cmd_prop_value_set(
781         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SRC_ADDR_MATCHING_METHOD_SET,
782         SPINEL_DATATYPE_NRF_802154_SRC_ADDR_MATCHING_METHOD_SET,
783         match_method);
784 
785     SERIALIZATION_ERROR_CHECK(res, error, bail);
786 
787     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
788     SERIALIZATION_ERROR_CHECK(res, error, bail);
789 
790 bail:
791     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
792 }
793 
nrf_802154_ack_data_set(const uint8_t * p_addr,bool extended,const void * p_data,uint16_t length,nrf_802154_ack_data_t data_type)794 bool nrf_802154_ack_data_set(const uint8_t       * p_addr,
795                              bool                  extended,
796                              const void          * p_data,
797                              uint16_t              length,
798                              nrf_802154_ack_data_t data_type)
799 {
800     nrf_802154_ser_err_t res;
801     bool                 ack_data_set_res = false;
802 
803     SERIALIZATION_ERROR_INIT(error);
804 
805     NRF_802154_SPINEL_LOG_BANNER_CALLING();
806     NRF_802154_SPINEL_LOG_BUFF(p_addr, extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
807     NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
808 
809     nrf_802154_spinel_response_notifier_lock_before_request(
810         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_SET);
811 
812     res = nrf_802154_spinel_send_cmd_prop_value_set(
813         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_SET,
814         SPINEL_DATATYPE_NRF_802154_ACK_DATA_SET,
815         p_addr,
816         extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE,
817         p_data,
818         length,
819         data_type);
820 
821     SERIALIZATION_ERROR_CHECK(res, error, bail);
822 
823     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
824                                           &ack_data_set_res);
825 
826     SERIALIZATION_ERROR_CHECK(res, error, bail);
827 
828 bail:
829     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
830 
831     return ack_data_set_res;
832 }
833 
nrf_802154_ack_data_clear(const uint8_t * p_addr,bool extended,nrf_802154_ack_data_t data_type)834 bool nrf_802154_ack_data_clear(const uint8_t       * p_addr,
835                                bool                  extended,
836                                nrf_802154_ack_data_t data_type)
837 {
838     nrf_802154_ser_err_t res;
839     bool                 ack_data_clear_res = false;
840 
841     SERIALIZATION_ERROR_INIT(error);
842 
843     NRF_802154_SPINEL_LOG_BANNER_CALLING();
844     NRF_802154_SPINEL_LOG_BUFF(p_addr, extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
845     NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
846 
847     nrf_802154_spinel_response_notifier_lock_before_request(
848         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_CLEAR);
849 
850     res = nrf_802154_spinel_send_cmd_prop_value_set(
851         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_CLEAR,
852         SPINEL_DATATYPE_NRF_802154_ACK_DATA_CLEAR,
853         p_addr,
854         extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE,
855         data_type);
856 
857     SERIALIZATION_ERROR_CHECK(res, error, bail);
858 
859     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
860                                           &ack_data_clear_res);
861 
862     SERIALIZATION_ERROR_CHECK(res, error, bail);
863 
864 bail:
865     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
866 
867     return ack_data_clear_res;
868 }
869 
nrf_802154_ack_data_remove_all(bool extended,nrf_802154_ack_data_t data_type)870 void nrf_802154_ack_data_remove_all(bool extended, nrf_802154_ack_data_t data_type)
871 {
872     nrf_802154_ser_err_t res;
873 
874     SERIALIZATION_ERROR_INIT(error);
875 
876     NRF_802154_SPINEL_LOG_BANNER_CALLING();
877     NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
878 
879     nrf_802154_spinel_response_notifier_lock_before_request(
880         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_REMOVE_ALL);
881 
882     res = nrf_802154_spinel_send_cmd_prop_value_set(
883         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ACK_DATA_REMOVE_ALL,
884         SPINEL_DATATYPE_NRF_802154_ACK_DATA_REMOVE_ALL,
885         extended,
886         data_type);
887 
888     SERIALIZATION_ERROR_CHECK(res, error, bail);
889 
890     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
891     SERIALIZATION_ERROR_CHECK(res, error, bail);
892 
893 bail:
894     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
895 }
896 
nrf_802154_auto_pending_bit_set(bool enabled)897 void nrf_802154_auto_pending_bit_set(bool enabled)
898 {
899     nrf_802154_ser_err_t res;
900 
901     SERIALIZATION_ERROR_INIT(error);
902 
903     NRF_802154_SPINEL_LOG_BANNER_CALLING();
904     NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (enabled ? "true" : "false"), "enabled");
905 
906     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
907 
908     res = nrf_802154_spinel_send_cmd_prop_value_set(
909         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_AUTO_PENDING_BIT_SET,
910         SPINEL_DATATYPE_NRF_802154_AUTO_PENDING_BIT_SET,
911         enabled);
912 
913     SERIALIZATION_ERROR_CHECK(res, error, bail);
914 
915     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
916     SERIALIZATION_ERROR_CHECK(res, error, bail);
917 
918 bail:
919     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
920 }
921 
nrf_802154_pending_bit_for_addr_set(const uint8_t * p_addr,bool extended)922 bool nrf_802154_pending_bit_for_addr_set(const uint8_t * p_addr, bool extended)
923 {
924     nrf_802154_ser_err_t res;
925     bool                 addr_set_res = false;
926 
927     SERIALIZATION_ERROR_INIT(error);
928 
929     NRF_802154_SPINEL_LOG_BANNER_CALLING();
930     NRF_802154_SPINEL_LOG_BUFF(p_addr, extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
931     NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
932 
933     nrf_802154_spinel_response_notifier_lock_before_request(
934         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_SET);
935 
936     res = nrf_802154_spinel_send_cmd_prop_value_set(
937         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_SET,
938         SPINEL_DATATYPE_NRF_802154_PENDING_BIT_FOR_ADDR_SET,
939         p_addr,
940         extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
941 
942     SERIALIZATION_ERROR_CHECK(res, error, bail);
943 
944     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
945                                           &addr_set_res);
946 
947     SERIALIZATION_ERROR_CHECK(res, error, bail);
948 
949 bail:
950     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
951 
952     return addr_set_res;
953 }
954 
nrf_802154_pending_bit_for_addr_clear(const uint8_t * p_addr,bool extended)955 bool nrf_802154_pending_bit_for_addr_clear(const uint8_t * p_addr, bool extended)
956 {
957     nrf_802154_ser_err_t res;
958     bool                 addr_clr_res = false;
959 
960     SERIALIZATION_ERROR_INIT(error);
961 
962     NRF_802154_SPINEL_LOG_BANNER_CALLING();
963     NRF_802154_SPINEL_LOG_BUFF(p_addr, extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
964     NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
965 
966     nrf_802154_spinel_response_notifier_lock_before_request(
967         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_CLEAR);
968 
969     res = nrf_802154_spinel_send_cmd_prop_value_set(
970         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_CLEAR,
971         SPINEL_DATATYPE_NRF_802154_PENDING_BIT_FOR_ADDR_CLEAR,
972         p_addr,
973         extended ? EXTENDED_ADDRESS_SIZE : SHORT_ADDRESS_SIZE);
974 
975     SERIALIZATION_ERROR_CHECK(res, error, bail);
976 
977     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
978                                           &addr_clr_res);
979 
980     SERIALIZATION_ERROR_CHECK(res, error, bail);
981 
982 bail:
983     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
984 
985     return addr_clr_res;
986 }
987 
nrf_802154_pending_bit_for_addr_reset(bool extended)988 void nrf_802154_pending_bit_for_addr_reset(bool extended)
989 {
990     nrf_802154_ser_err_t res;
991 
992     SERIALIZATION_ERROR_INIT(error);
993 
994     NRF_802154_SPINEL_LOG_BANNER_CALLING();
995     NRF_802154_SPINEL_LOG_VAR_NAMED("%s", (extended ? "true" : "false"), "extended");
996 
997     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
998 
999     res = nrf_802154_spinel_send_cmd_prop_value_set(
1000         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_PENDING_BIT_FOR_ADDR_RESET,
1001         SPINEL_DATATYPE_NRF_802154_PENDING_BIT_FOR_ADDR_RESET,
1002         extended);
1003 
1004     SERIALIZATION_ERROR_CHECK(res, error, bail);
1005 
1006     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1007     SERIALIZATION_ERROR_CHECK(res, error, bail);
1008 
1009 bail:
1010     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1011     return;
1012 }
1013 
nrf_802154_channel_set(uint8_t channel)1014 void nrf_802154_channel_set(uint8_t channel)
1015 {
1016     nrf_802154_ser_err_t res;
1017 
1018     SERIALIZATION_ERROR_INIT(error);
1019 
1020     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1021     NRF_802154_SPINEL_LOG_VAR("%u", channel);
1022 
1023     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1024 
1025     res = nrf_802154_spinel_send_cmd_prop_value_set(
1026         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CHANNEL_SET,
1027         SPINEL_DATATYPE_NRF_802154_CHANNEL_SET,
1028         channel);
1029 
1030     SERIALIZATION_ERROR_CHECK(res, error, bail);
1031 
1032     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1033     SERIALIZATION_ERROR_CHECK(res, error, bail);
1034 
1035 bail:
1036     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1037 
1038     return;
1039 }
1040 
nrf_802154_channel_get(void)1041 uint8_t nrf_802154_channel_get(void)
1042 {
1043     nrf_802154_ser_err_t res;
1044     uint8_t              channel = 0;
1045 
1046     SERIALIZATION_ERROR_INIT(error);
1047 
1048     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1049 
1050     nrf_802154_spinel_response_notifier_lock_before_request(
1051         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CHANNEL_GET);
1052 
1053     res = nrf_802154_spinel_send_cmd_prop_value_set(
1054         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CHANNEL_GET,
1055         SPINEL_DATATYPE_NRF_802154_CHANNEL_GET,
1056         &channel);
1057 
1058     SERIALIZATION_ERROR_CHECK(res, error, bail);
1059 
1060     res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1061                                            &channel);
1062     SERIALIZATION_ERROR_CHECK(res, error, bail);
1063 
1064 bail:
1065     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1066 
1067     return channel;
1068 }
1069 
nrf_802154_cca(void)1070 bool nrf_802154_cca(void)
1071 {
1072     nrf_802154_ser_err_t res;
1073     bool                 cca_result = false;
1074 
1075     SERIALIZATION_ERROR_INIT(error);
1076 
1077     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1078 
1079     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA);
1080 
1081     res = nrf_802154_spinel_send_cmd_prop_value_set(
1082         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA,
1083         SPINEL_DATATYPE_NRF_802154_CCA,
1084         NULL);
1085 
1086     SERIALIZATION_ERROR_CHECK(res, error, bail);
1087 
1088     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1089                                           &cca_result);
1090 
1091     SERIALIZATION_ERROR_CHECK(res, error, bail);
1092 
1093 bail:
1094     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1095 
1096     return cca_result;
1097 }
1098 
1099 #if NRF_802154_CARRIER_FUNCTIONS_ENABLED
1100 
nrf_802154_continuous_carrier(void)1101 bool nrf_802154_continuous_carrier(void)
1102 {
1103     nrf_802154_ser_err_t res;
1104     bool                 continuous_carrier_result = false;
1105 
1106     SERIALIZATION_ERROR_INIT(error);
1107 
1108     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1109 
1110     nrf_802154_spinel_response_notifier_lock_before_request(
1111         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CONTINUOUS_CARRIER);
1112 
1113     res = nrf_802154_spinel_send_cmd_prop_value_set(
1114         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CONTINUOUS_CARRIER,
1115         SPINEL_DATATYPE_NRF_802154_CONTINUOUS_CARRIER,
1116         NULL);
1117 
1118     SERIALIZATION_ERROR_CHECK(res, error, bail);
1119 
1120     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1121                                           &continuous_carrier_result);
1122 
1123     SERIALIZATION_ERROR_CHECK(res, error, bail);
1124 
1125 bail:
1126     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1127 
1128     return continuous_carrier_result;
1129 }
1130 
nrf_802154_modulated_carrier(const uint8_t * p_data)1131 bool nrf_802154_modulated_carrier(const uint8_t * p_data)
1132 {
1133     nrf_802154_ser_err_t res;
1134     bool                 modulated_carrier_result = false;
1135 
1136     SERIALIZATION_ERROR_INIT(error);
1137 
1138     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1139     NRF_802154_SPINEL_LOG_BUFF(p_data, RAW_PAYLOAD_OFFSET + p_data[0]);
1140 
1141     nrf_802154_spinel_response_notifier_lock_before_request(
1142         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_MODULATED_CARRIER);
1143 
1144     res = nrf_802154_spinel_send_cmd_prop_value_set(
1145         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_MODULATED_CARRIER,
1146         SPINEL_DATATYPE_NRF_802154_MODULATED_CARRIER,
1147         p_data,
1148         RAW_PAYLOAD_OFFSET + p_data[0]);
1149 
1150     SERIALIZATION_ERROR_CHECK(res, error, bail);
1151 
1152     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1153                                           &modulated_carrier_result);
1154 
1155     SERIALIZATION_ERROR_CHECK(res, error, bail);
1156 
1157 bail:
1158     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1159 
1160     return modulated_carrier_result;
1161 }
1162 
1163 #endif // NRF_802154_CARRIER_FUNCTIONS_ENABLED
1164 
nrf_802154_energy_detection(uint32_t time_us)1165 bool nrf_802154_energy_detection(uint32_t time_us)
1166 {
1167     nrf_802154_ser_err_t res;
1168     bool                 ed_result = false;
1169 
1170     SERIALIZATION_ERROR_INIT(error);
1171 
1172     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1173 
1174     nrf_802154_spinel_response_notifier_lock_before_request(
1175         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ENERGY_DETECTION);
1176 
1177     res = nrf_802154_spinel_send_cmd_prop_value_set(
1178         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_ENERGY_DETECTION,
1179         SPINEL_DATATYPE_NRF_802154_ENERGY_DETECTION,
1180         time_us);
1181 
1182     SERIALIZATION_ERROR_CHECK(res, error, bail);
1183 
1184     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1185                                           &ed_result);
1186 
1187     SERIALIZATION_ERROR_CHECK(res, error, bail);
1188 
1189 bail:
1190     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1191 
1192     return ed_result;
1193 }
1194 
1195 #if NRF_802154_CSMA_CA_ENABLED
1196 
nrf_802154_transmit_csma_ca_raw(uint8_t * p_data,const nrf_802154_transmit_csma_ca_metadata_t * p_metadata)1197 bool nrf_802154_transmit_csma_ca_raw(uint8_t                                      * p_data,
1198                                      const nrf_802154_transmit_csma_ca_metadata_t * p_metadata)
1199 {
1200     nrf_802154_ser_err_t res;
1201     uint32_t             data_handle;
1202     bool                 transmit_result = false;
1203 
1204     SERIALIZATION_ERROR_INIT(error);
1205 
1206     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1207     NRF_802154_SPINEL_LOG_BUFF(p_data, p_data[0]);
1208 
1209     bool handle_added = nrf_802154_buffer_mgr_src_add(nrf_802154_spinel_src_buffer_mgr_get(),
1210                                                       p_data,
1211                                                       &data_handle);
1212 
1213     if (p_metadata == NULL)
1214     {
1215         static const nrf_802154_transmit_csma_ca_metadata_t metadata_default =
1216         {
1217             .frame_props = NRF_802154_TRANSMITTED_FRAME_PROPS_DEFAULT_INIT,
1218             .tx_power    = {.use_metadata_value = false},
1219             .tx_channel  = {.use_metadata_value = false}
1220         };
1221 
1222         p_metadata = &metadata_default;
1223     }
1224 
1225     SERIALIZATION_ERROR_IF(!handle_added, NRF_802154_SERIALIZATION_ERROR_NO_MEMORY, error, bail);
1226 
1227     nrf_802154_spinel_response_notifier_lock_before_request(
1228         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_CSMA_CA_RAW);
1229 
1230     res = nrf_802154_spinel_send_cmd_prop_value_set(
1231         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_CSMA_CA_RAW,
1232         SPINEL_DATATYPE_NRF_802154_TRANSMIT_CSMA_CA_RAW,
1233         NRF_802154_TRANSMIT_CSMA_CA_METADATA_ENCODE(*p_metadata),
1234         NRF_802154_HDATA_ENCODE(data_handle, p_data, p_data[0]));
1235 
1236     SERIALIZATION_ERROR_CHECK(res, error, bail);
1237 
1238     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1239                                           &transmit_result);
1240 
1241     SERIALIZATION_ERROR_CHECK(res, error, bail);
1242 
1243     return transmit_result;
1244 
1245 bail:
1246     if (handle_added)
1247     {
1248         /* Rollback what we did until an error to avoid memory leak. */
1249         nrf_802154_buffer_mgr_src_remove_by_buffer_handle(
1250             nrf_802154_spinel_src_buffer_mgr_get(),
1251             data_handle);
1252     }
1253 
1254     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1255 
1256     return transmit_result;
1257 }
1258 
nrf_802154_csma_ca_min_be_set(uint8_t min_be)1259 bool nrf_802154_csma_ca_min_be_set(uint8_t min_be)
1260 {
1261     nrf_802154_ser_err_t res;
1262     bool                 result = false;
1263 
1264     SERIALIZATION_ERROR_INIT(error);
1265 
1266     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1267     NRF_802154_SPINEL_LOG_VAR("%u", min_be);
1268 
1269     nrf_802154_spinel_response_notifier_lock_before_request(
1270         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MIN_BE_SET);
1271 
1272     res = nrf_802154_spinel_send_cmd_prop_value_set(
1273         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MIN_BE_SET,
1274         SPINEL_DATATYPE_NRF_802154_CSMA_CA_MIN_BE_SET,
1275         min_be);
1276 
1277     SERIALIZATION_ERROR_CHECK(res, error, bail);
1278 
1279     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1280                                           &result);
1281     SERIALIZATION_ERROR_CHECK(res, error, bail);
1282 
1283 bail:
1284     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1285 
1286     return result;
1287 }
1288 
nrf_802154_csma_ca_min_be_get(void)1289 uint8_t nrf_802154_csma_ca_min_be_get(void)
1290 {
1291     nrf_802154_ser_err_t res;
1292     uint8_t              min_be = 0;
1293 
1294     SERIALIZATION_ERROR_INIT(error);
1295 
1296     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1297 
1298     nrf_802154_spinel_response_notifier_lock_before_request(
1299         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MIN_BE_GET);
1300 
1301     res = nrf_802154_spinel_send_cmd_prop_value_set(
1302         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MIN_BE_GET,
1303         SPINEL_DATATYPE_NRF_802154_CSMA_CA_MIN_BE_GET,
1304         &min_be);
1305 
1306     SERIALIZATION_ERROR_CHECK(res, error, bail);
1307 
1308     res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1309                                            &min_be);
1310     SERIALIZATION_ERROR_CHECK(res, error, bail);
1311 
1312 bail:
1313     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1314 
1315     return min_be;
1316 }
1317 
nrf_802154_csma_ca_max_be_set(uint8_t max_be)1318 bool nrf_802154_csma_ca_max_be_set(uint8_t max_be)
1319 {
1320     nrf_802154_ser_err_t res;
1321     bool                 result = false;
1322 
1323     SERIALIZATION_ERROR_INIT(error);
1324 
1325     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1326     NRF_802154_SPINEL_LOG_VAR("%u", max_be);
1327 
1328     nrf_802154_spinel_response_notifier_lock_before_request(
1329         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BE_SET);
1330 
1331     res = nrf_802154_spinel_send_cmd_prop_value_set(
1332         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BE_SET,
1333         SPINEL_DATATYPE_NRF_802154_CSMA_CA_MAX_BE_SET,
1334         max_be);
1335 
1336     SERIALIZATION_ERROR_CHECK(res, error, bail);
1337 
1338     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1339                                           &result);
1340     SERIALIZATION_ERROR_CHECK(res, error, bail);
1341 
1342 bail:
1343     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1344 
1345     return result;
1346 }
1347 
nrf_802154_csma_ca_max_be_get(void)1348 uint8_t nrf_802154_csma_ca_max_be_get(void)
1349 {
1350     nrf_802154_ser_err_t res;
1351     uint8_t              max_be = 0;
1352 
1353     SERIALIZATION_ERROR_INIT(error);
1354 
1355     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1356 
1357     nrf_802154_spinel_response_notifier_lock_before_request(
1358         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BE_GET);
1359 
1360     res = nrf_802154_spinel_send_cmd_prop_value_set(
1361         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BE_GET,
1362         SPINEL_DATATYPE_NRF_802154_CSMA_CA_MAX_BE_GET,
1363         &max_be);
1364 
1365     SERIALIZATION_ERROR_CHECK(res, error, bail);
1366 
1367     res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1368                                            &max_be);
1369     SERIALIZATION_ERROR_CHECK(res, error, bail);
1370 
1371 bail:
1372     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1373 
1374     return max_be;
1375 }
1376 
nrf_802154_csma_ca_max_backoffs_set(uint8_t max_backoffs)1377 void nrf_802154_csma_ca_max_backoffs_set(uint8_t max_backoffs)
1378 {
1379     nrf_802154_ser_err_t res;
1380 
1381     SERIALIZATION_ERROR_INIT(error);
1382 
1383     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1384     NRF_802154_SPINEL_LOG_VAR("%u", max_backoffs);
1385 
1386     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1387 
1388     res = nrf_802154_spinel_send_cmd_prop_value_set(
1389         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BACKOFFS_SET,
1390         SPINEL_DATATYPE_NRF_802154_CSMA_CA_MAX_BACKOFFS_SET,
1391         max_backoffs);
1392 
1393     SERIALIZATION_ERROR_CHECK(res, error, bail);
1394 
1395     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1396     SERIALIZATION_ERROR_CHECK(res, error, bail);
1397 
1398 bail:
1399     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1400 
1401     return;
1402 }
1403 
nrf_802154_csma_ca_max_backoffs_get(void)1404 uint8_t nrf_802154_csma_ca_max_backoffs_get(void)
1405 {
1406     nrf_802154_ser_err_t res;
1407     uint8_t              max_backoffs = 0;
1408 
1409     SERIALIZATION_ERROR_INIT(error);
1410 
1411     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1412 
1413     nrf_802154_spinel_response_notifier_lock_before_request(
1414         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BACKOFFS_GET);
1415 
1416     res = nrf_802154_spinel_send_cmd_prop_value_set(
1417         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSMA_CA_MAX_BACKOFFS_GET,
1418         SPINEL_DATATYPE_NRF_802154_CSMA_CA_MAX_BACKOFFS_GET,
1419         &max_backoffs);
1420 
1421     SERIALIZATION_ERROR_CHECK(res, error, bail);
1422 
1423     res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1424                                            &max_backoffs);
1425     SERIALIZATION_ERROR_CHECK(res, error, bail);
1426 
1427 bail:
1428     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1429 
1430     return max_backoffs;
1431 }
1432 
1433 #endif // NRF_802154_CSMA_CA_ENABLED
1434 
1435 #if NRF_802154_TEST_MODES_ENABLED
nrf_802154_test_mode_csmaca_backoff_get(void)1436 nrf_802154_test_mode_csmaca_backoff_t nrf_802154_test_mode_csmaca_backoff_get(void)
1437 {
1438     nrf_802154_ser_err_t                  res;
1439     nrf_802154_test_mode_csmaca_backoff_t value = 0;
1440 
1441     SERIALIZATION_ERROR_INIT(error);
1442 
1443     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1444 
1445     nrf_802154_spinel_response_notifier_lock_before_request(
1446         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TEST_MODE_CSMACA_BACKOFF_GET);
1447 
1448     res = nrf_802154_spinel_send_cmd_prop_value_set(
1449         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TEST_MODE_CSMACA_BACKOFF_GET,
1450         SPINEL_DATATYPE_NRF_802154_TEST_MODE_CSMACA_BACKOFF_GET,
1451         &value);
1452 
1453     SERIALIZATION_ERROR_CHECK(res, error, bail);
1454 
1455     res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1456                                            &value);
1457     SERIALIZATION_ERROR_CHECK(res, error, bail);
1458 
1459 bail:
1460     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1461 
1462     return value;
1463 }
1464 
nrf_802154_test_mode_csmaca_backoff_set(nrf_802154_test_mode_csmaca_backoff_t value)1465 void nrf_802154_test_mode_csmaca_backoff_set(nrf_802154_test_mode_csmaca_backoff_t value)
1466 {
1467     nrf_802154_ser_err_t res;
1468 
1469     SERIALIZATION_ERROR_INIT(error);
1470 
1471     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1472     NRF_802154_SPINEL_LOG_VAR("%u", value);
1473 
1474     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1475 
1476     res = nrf_802154_spinel_send_cmd_prop_value_set(
1477         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TEST_MODE_CSMACA_BACKOFF_SET,
1478         SPINEL_DATATYPE_NRF_802154_TEST_MODE_CSMACA_BACKOFF_SET,
1479         value);
1480 
1481     SERIALIZATION_ERROR_CHECK(res, error, bail);
1482 
1483     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1484     SERIALIZATION_ERROR_CHECK(res, error, bail);
1485 
1486 bail:
1487     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1488 
1489     return;
1490 }
1491 
1492 #endif // NRF_802154_TEST_MODES_ENABLED
1493 
nrf_802154_transmit_raw(uint8_t * p_data,const nrf_802154_transmit_metadata_t * p_metadata)1494 bool nrf_802154_transmit_raw(uint8_t                              * p_data,
1495                              const nrf_802154_transmit_metadata_t * p_metadata)
1496 {
1497     nrf_802154_ser_err_t res;
1498     uint32_t             data_handle;
1499     bool                 transmit_result = false;
1500 
1501     SERIALIZATION_ERROR_INIT(error);
1502 
1503     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1504     NRF_802154_SPINEL_LOG_BUFF(p_data, p_data[0]);
1505 
1506     bool handle_added = nrf_802154_buffer_mgr_src_add(nrf_802154_spinel_src_buffer_mgr_get(),
1507                                                       p_data,
1508                                                       &data_handle);
1509 
1510     if (p_metadata == NULL)
1511     {
1512         static const nrf_802154_transmit_metadata_t metadata_default =
1513         {
1514             .frame_props = NRF_802154_TRANSMITTED_FRAME_PROPS_DEFAULT_INIT,
1515             .cca         = true,
1516             .tx_power    = {.use_metadata_value = false},
1517             .tx_channel  = {.use_metadata_value = false}
1518         };
1519 
1520         p_metadata = &metadata_default;
1521     }
1522 
1523     SERIALIZATION_ERROR_IF(!handle_added, NRF_802154_SERIALIZATION_ERROR_NO_MEMORY, error, bail);
1524 
1525     nrf_802154_spinel_response_notifier_lock_before_request(
1526         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_RAW);
1527 
1528     res = nrf_802154_spinel_send_cmd_prop_value_set(
1529         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_RAW,
1530         SPINEL_DATATYPE_NRF_802154_TRANSMIT_RAW,
1531         NRF_802154_TRANSMIT_METADATA_ENCODE(*p_metadata),
1532         NRF_802154_HDATA_ENCODE(data_handle, p_data, p_data[0]));
1533 
1534     SERIALIZATION_ERROR_CHECK(res, error, bail);
1535 
1536     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1537                                           &transmit_result);
1538 
1539     SERIALIZATION_ERROR_CHECK(res, error, bail);
1540 
1541     return transmit_result;
1542 
1543 bail:
1544     if (handle_added)
1545     {
1546         /* Rollback what we did until an error to avoid memory leak. */
1547         nrf_802154_buffer_mgr_src_remove_by_buffer_handle(
1548             nrf_802154_spinel_src_buffer_mgr_get(),
1549             data_handle);
1550     }
1551 
1552     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1553 
1554     return transmit_result;
1555 }
1556 
nrf_802154_transmit_raw_at(uint8_t * p_data,uint64_t tx_time,const nrf_802154_transmit_at_metadata_t * p_metadata)1557 bool nrf_802154_transmit_raw_at(uint8_t                                 * p_data,
1558                                 uint64_t                                  tx_time,
1559                                 const nrf_802154_transmit_at_metadata_t * p_metadata)
1560 {
1561     nrf_802154_ser_err_t res;
1562     uint32_t             data_handle;
1563     bool                 transmit_result = false;
1564 
1565     SERIALIZATION_ERROR_INIT(error);
1566 
1567     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1568     NRF_802154_SPINEL_LOG_BUFF(p_data, p_data[0]);
1569 
1570     bool handle_added = nrf_802154_buffer_mgr_src_add(nrf_802154_spinel_src_buffer_mgr_get(),
1571                                                       p_data,
1572                                                       &data_handle);
1573 
1574     if (p_metadata == NULL)
1575     {
1576         static const nrf_802154_transmit_at_metadata_t metadata_default =
1577         {
1578             .frame_props = NRF_802154_TRANSMITTED_FRAME_PROPS_DEFAULT_INIT,
1579             .cca         = true,
1580             // channel set to 0 will be replaced on net core by the current channel from PIB
1581             .channel            = 0,
1582             .tx_power           = {.use_metadata_value = false},
1583             .extra_cca_attempts = 0U,
1584         };
1585 
1586         p_metadata = &metadata_default;
1587     }
1588 
1589     SERIALIZATION_ERROR_IF(!handle_added, NRF_802154_SERIALIZATION_ERROR_NO_MEMORY, error, bail);
1590 
1591     nrf_802154_spinel_response_notifier_lock_before_request(
1592         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_RAW_AT);
1593 
1594     res = nrf_802154_spinel_send_cmd_prop_value_set(
1595         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_RAW_AT,
1596         SPINEL_DATATYPE_NRF_802154_TRANSMIT_RAW_AT,
1597         NRF_802154_TRANSMIT_AT_METADATA_ENCODE(*p_metadata),
1598         tx_time,
1599         NRF_802154_HDATA_ENCODE(data_handle, p_data, p_data[0]));
1600 
1601     SERIALIZATION_ERROR_CHECK(res, error, bail);
1602 
1603     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1604                                           &transmit_result);
1605 
1606     SERIALIZATION_ERROR_CHECK(res, error, bail);
1607 
1608     return transmit_result;
1609 
1610 bail:
1611     if (handle_added)
1612     {
1613         /* Rollback what we did until an error to avoid memory leak. */
1614         nrf_802154_buffer_mgr_src_remove_by_buffer_handle(
1615             nrf_802154_spinel_src_buffer_mgr_get(),
1616             data_handle);
1617     }
1618 
1619     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1620 
1621     return transmit_result;
1622 }
1623 
nrf_802154_transmit_at_cancel(void)1624 bool nrf_802154_transmit_at_cancel(void)
1625 {
1626     nrf_802154_ser_err_t res;
1627     bool                 cancel_result = false;
1628 
1629     SERIALIZATION_ERROR_INIT(error);
1630 
1631     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1632 
1633     nrf_802154_spinel_response_notifier_lock_before_request(
1634         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_AT_CANCEL);
1635 
1636     res = nrf_802154_spinel_send_cmd_prop_value_set(
1637         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TRANSMIT_AT_CANCEL,
1638         SPINEL_DATATYPE_NRF_802154_TRANSMIT_AT_CANCEL,
1639         NULL);
1640 
1641     SERIALIZATION_ERROR_CHECK(res, error, bail);
1642 
1643     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
1644                                           &cancel_result);
1645 
1646     SERIALIZATION_ERROR_CHECK(res, error, bail);
1647 
1648 bail:
1649     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1650 
1651     return cancel_result;
1652 }
1653 
nrf_802154_buffer_free_raw(uint8_t * p_data)1654 void nrf_802154_buffer_free_raw(uint8_t * p_data)
1655 {
1656     nrf_802154_ser_err_t res;
1657     uint32_t             data_handle;
1658 
1659     SERIALIZATION_ERROR_INIT(error);
1660 
1661     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1662     NRF_802154_SPINEL_LOG_BUFF(p_data, p_data[0]);
1663 
1664     bool handle_found = nrf_802154_buffer_mgr_dst_search_by_local_pointer(
1665         nrf_802154_spinel_dst_buffer_mgr_get(),
1666         p_data,
1667         &data_handle);
1668 
1669     SERIALIZATION_ERROR_IF(!handle_found,
1670                            NRF_802154_SERIALIZATION_ERROR_INVALID_BUFFER,
1671                            error,
1672                            bail);
1673 
1674     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1675 
1676     res = nrf_802154_spinel_send_cmd_prop_value_set(
1677         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_BUFFER_FREE_RAW,
1678         SPINEL_DATATYPE_NRF_802154_BUFFER_FREE_RAW,
1679         data_handle);
1680 
1681     SERIALIZATION_ERROR_CHECK(res, error, bail);
1682 
1683     bool removed = nrf_802154_buffer_mgr_dst_remove_by_local_pointer(
1684         nrf_802154_spinel_dst_buffer_mgr_get(),
1685         p_data);
1686 
1687     SERIALIZATION_ERROR_IF(!removed,
1688                            NRF_802154_SERIALIZATION_ERROR_INVALID_BUFFER,
1689                            error,
1690                            bail);
1691 
1692     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1693     SERIALIZATION_ERROR_CHECK(res, error, bail);
1694 
1695 bail:
1696     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1697 
1698     return;
1699 }
1700 
nrf_802154_tx_power_set(int8_t power)1701 void nrf_802154_tx_power_set(int8_t power)
1702 {
1703     nrf_802154_ser_err_t res;
1704 
1705     SERIALIZATION_ERROR_INIT(error);
1706 
1707     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1708 
1709     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1710 
1711     res = nrf_802154_spinel_send_cmd_prop_value_set(
1712         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TX_POWER_SET,
1713         SPINEL_DATATYPE_NRF_802154_TX_POWER_SET,
1714         power);
1715 
1716     SERIALIZATION_ERROR_CHECK(res, error, bail);
1717 
1718     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1719     SERIALIZATION_ERROR_CHECK(res, error, bail);
1720 
1721 bail:
1722     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1723 
1724     return;
1725 }
1726 
nrf_802154_tx_power_get(void)1727 int8_t nrf_802154_tx_power_get(void)
1728 {
1729     int32_t res;
1730     int8_t  power = 0;
1731 
1732     SERIALIZATION_ERROR_INIT(error);
1733 
1734     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1735 
1736     nrf_802154_spinel_response_notifier_lock_before_request(
1737         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TX_POWER_GET);
1738 
1739     res = nrf_802154_spinel_send_cmd_prop_value_set(
1740         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TX_POWER_GET,
1741         SPINEL_DATATYPE_NRF_802154_TX_POWER_GET,
1742         NULL);
1743 
1744     SERIALIZATION_ERROR_CHECK(res, error, bail);
1745 
1746     res = tx_power_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &power);
1747     SERIALIZATION_ERROR_CHECK(res, error, bail);
1748 
1749 bail:
1750     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1751 
1752     return power;
1753 }
1754 
nrf_802154_capabilities_get(void)1755 nrf_802154_capabilities_t nrf_802154_capabilities_get(void)
1756 {
1757     int32_t                   res;
1758     nrf_802154_capabilities_t caps = 0UL;
1759 
1760     SERIALIZATION_ERROR_INIT(error);
1761 
1762     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1763 
1764     nrf_802154_spinel_response_notifier_lock_before_request(
1765         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CAPABILITIES_GET);
1766 
1767     res = nrf_802154_spinel_send_cmd_prop_value_set(
1768         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CAPABILITIES_GET,
1769         SPINEL_DATATYPE_NRF_802154_CAPABILITIES_GET,
1770         NULL);
1771 
1772     SERIALIZATION_ERROR_CHECK(res, error, bail);
1773 
1774     res = capabilities_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &caps);
1775     SERIALIZATION_ERROR_CHECK(res, error, bail);
1776 
1777 bail:
1778     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1779 
1780     return caps;
1781 }
1782 
nrf_802154_time_get(void)1783 uint64_t nrf_802154_time_get(void)
1784 {
1785     int32_t  res;
1786     uint64_t time = 0UL;
1787 
1788     SERIALIZATION_ERROR_INIT(error);
1789 
1790     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1791 
1792     nrf_802154_spinel_response_notifier_lock_before_request(
1793         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TIME_GET);
1794 
1795     res = nrf_802154_spinel_send_cmd_prop_value_set(
1796         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_TIME_GET,
1797         SPINEL_DATATYPE_NRF_802154_TIME_GET,
1798         NULL);
1799 
1800     SERIALIZATION_ERROR_CHECK(res, error, bail);
1801 
1802     res = time_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &time);
1803     SERIALIZATION_ERROR_CHECK(res, error, bail);
1804 
1805 bail:
1806     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1807 
1808     return time;
1809 }
1810 
nrf_802154_cca_cfg_set(const nrf_802154_cca_cfg_t * p_cfg)1811 void nrf_802154_cca_cfg_set(const nrf_802154_cca_cfg_t * p_cfg)
1812 {
1813     nrf_802154_ser_err_t res;
1814 
1815     SERIALIZATION_ERROR_INIT(error);
1816 
1817     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1818     NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->mode, "Mode");
1819     NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->ed_threshold, "ED threshold");
1820     NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->corr_threshold, "Corr threshold");
1821     NRF_802154_SPINEL_LOG_VAR_NAMED("%u", p_cfg->corr_limit, "Corr limit");
1822 
1823     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1824 
1825     res = nrf_802154_spinel_send_cmd_prop_value_set(
1826         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA_CFG_SET,
1827         SPINEL_DATATYPE_NRF_802154_CCA_CFG_SET,
1828         NRF_802154_CCA_CFG_ENCODE(*p_cfg));
1829 
1830     SERIALIZATION_ERROR_CHECK(res, error, bail);
1831 
1832     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1833     SERIALIZATION_ERROR_CHECK(res, error, bail);
1834 
1835 bail:
1836     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1837 
1838     return;
1839 }
1840 
nrf_802154_cca_cfg_get(nrf_802154_cca_cfg_t * p_cfg)1841 void nrf_802154_cca_cfg_get(nrf_802154_cca_cfg_t * p_cfg)
1842 {
1843     nrf_802154_ser_err_t res;
1844 
1845     SERIALIZATION_ERROR_INIT(error);
1846 
1847     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1848 
1849     nrf_802154_spinel_response_notifier_lock_before_request(
1850         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA_CFG_GET);
1851 
1852     res = nrf_802154_spinel_send_cmd_prop_value_set(
1853         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CCA_CFG_GET,
1854         SPINEL_DATATYPE_NRF_802154_CCA_CFG_GET,
1855         NULL);
1856 
1857     SERIALIZATION_ERROR_CHECK(res, error, bail);
1858 
1859     res = cca_cfg_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, p_cfg);
1860     SERIALIZATION_ERROR_CHECK(res, error, bail);
1861 
1862 bail:
1863     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1864 }
1865 
nrf_802154_security_global_frame_counter_set(uint32_t frame_counter)1866 void nrf_802154_security_global_frame_counter_set(uint32_t frame_counter)
1867 {
1868     nrf_802154_ser_err_t res;
1869 
1870     SERIALIZATION_ERROR_INIT(error);
1871 
1872     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1873 
1874     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1875 
1876     res = nrf_802154_spinel_send_cmd_prop_value_set(
1877         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_GLOBAL_FRAME_COUNTER_SET,
1878         SPINEL_DATATYPE_NRF_802154_SECURITY_GLOBAL_FRAME_COUNTER_SET,
1879         frame_counter);
1880 
1881     SERIALIZATION_ERROR_CHECK(res, error, bail);
1882 
1883     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1884     SERIALIZATION_ERROR_CHECK(res, error, bail);
1885 
1886 bail:
1887     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1888 
1889     return;
1890 }
1891 
nrf_802154_security_global_frame_counter_set_if_larger(uint32_t frame_counter)1892 void nrf_802154_security_global_frame_counter_set_if_larger(uint32_t frame_counter)
1893 {
1894     nrf_802154_ser_err_t res;
1895 
1896     SERIALIZATION_ERROR_INIT(error);
1897 
1898     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1899 
1900     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1901 
1902     res = nrf_802154_spinel_send_cmd_prop_value_set(
1903         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_GLOBAL_FRAME_COUNTER_SET_IF_LARGER,
1904         SPINEL_DATATYPE_NRF_802154_SECURITY_GLOBAL_FRAME_COUNTER_SET,
1905         frame_counter);
1906 
1907     SERIALIZATION_ERROR_CHECK(res, error, bail);
1908 
1909     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1910     SERIALIZATION_ERROR_CHECK(res, error, bail);
1911 
1912 bail:
1913     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1914 
1915     return;
1916 }
1917 
nrf_802154_security_key_store(nrf_802154_key_t * p_key)1918 nrf_802154_security_error_t nrf_802154_security_key_store(nrf_802154_key_t * p_key)
1919 {
1920     nrf_802154_ser_err_t        res;
1921     nrf_802154_security_error_t err = NRF_802154_SECURITY_ERROR_NONE;;
1922 
1923     SERIALIZATION_ERROR_INIT(error);
1924 
1925     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1926 
1927     nrf_802154_spinel_response_notifier_lock_before_request(
1928         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_KEY_STORE);
1929 
1930     res = nrf_802154_spinel_send_cmd_prop_value_set(
1931         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_KEY_STORE,
1932         SPINEL_DATATYPE_NRF_802154_SECURITY_KEY_STORE,
1933         NRF_802154_SECURITY_KEY_STORE_ENCODE(*p_key, AES_CCM_KEY_SIZE, KEY_ID_MODE_3_SIZE));
1934 
1935     SERIALIZATION_ERROR_CHECK(res, error, bail);
1936 
1937     res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &err);
1938     SERIALIZATION_ERROR_CHECK(res, error, bail);
1939 
1940 bail:
1941     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1942 
1943     return err;
1944 }
1945 
nrf_802154_security_key_remove(nrf_802154_key_id_t * p_id)1946 nrf_802154_security_error_t nrf_802154_security_key_remove(nrf_802154_key_id_t * p_id)
1947 {
1948     nrf_802154_ser_err_t        res;
1949     nrf_802154_security_error_t err = NRF_802154_SECURITY_ERROR_NONE;
1950 
1951     SERIALIZATION_ERROR_INIT(error);
1952 
1953     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1954 
1955     nrf_802154_spinel_response_notifier_lock_before_request(
1956         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_KEY_REMOVE);
1957 
1958     res = nrf_802154_spinel_send_cmd_prop_value_set(
1959         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_KEY_REMOVE,
1960         SPINEL_DATATYPE_NRF_802154_SECURITY_KEY_REMOVE,
1961         NRF_802154_SECURITY_KEY_REMOVE_ENCODE(*p_id, KEY_ID_MODE_3_SIZE));
1962 
1963     SERIALIZATION_ERROR_CHECK(res, error, bail);
1964 
1965     res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT, &err);
1966     SERIALIZATION_ERROR_CHECK(res, error, bail);
1967 
1968 bail:
1969     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1970 
1971     return err;
1972 }
1973 
nrf_802154_security_key_remove_all(void)1974 void nrf_802154_security_key_remove_all(void)
1975 {
1976     nrf_802154_ser_err_t res;
1977 
1978     SERIALIZATION_ERROR_INIT(error);
1979 
1980     NRF_802154_SPINEL_LOG_BANNER_CALLING();
1981 
1982     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
1983 
1984     res = nrf_802154_spinel_send_cmd_prop_value_set(
1985         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_SECURITY_KEY_REMOVE_ALL,
1986         SPINEL_DATATYPE_NRF_802154_SECURITY_KEY_REMOVE_ALL,
1987         NULL);
1988 
1989     SERIALIZATION_ERROR_CHECK(res, error, bail);
1990 
1991     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
1992     SERIALIZATION_ERROR_CHECK(res, error, bail);
1993 
1994 bail:
1995     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
1996 
1997     return;
1998 }
1999 
nrf_802154_csl_writer_period_set(uint16_t period)2000 void nrf_802154_csl_writer_period_set(uint16_t period)
2001 {
2002     nrf_802154_ser_err_t res;
2003 
2004     SERIALIZATION_ERROR_INIT(error);
2005 
2006     NRF_802154_SPINEL_LOG_BANNER_CALLING();
2007 
2008     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
2009 
2010     res = nrf_802154_spinel_send_cmd_prop_value_set(
2011         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSL_WRITER_PERIOD_SET,
2012         SPINEL_DATATYPE_NRF_802154_CSL_WRITER_PERIOD_SET,
2013         period);
2014 
2015     SERIALIZATION_ERROR_CHECK(res, error, bail);
2016 
2017     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
2018     SERIALIZATION_ERROR_CHECK(res, error, bail);
2019 
2020 bail:
2021     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2022 
2023     return;
2024 }
2025 
nrf_802154_csl_writer_anchor_time_set(uint64_t anchor_time)2026 void nrf_802154_csl_writer_anchor_time_set(uint64_t anchor_time)
2027 {
2028     nrf_802154_ser_err_t res;
2029 
2030     SERIALIZATION_ERROR_INIT(error);
2031 
2032     NRF_802154_SPINEL_LOG_BANNER_CALLING();
2033 
2034     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
2035 
2036     res = nrf_802154_spinel_send_cmd_prop_value_set(
2037         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_CSL_WRITER_ANCHOR_TIME_SET,
2038         SPINEL_DATATYPE_NRF_802154_CSL_WRITER_ANCHOR_TIME_SET,
2039         anchor_time);
2040 
2041     SERIALIZATION_ERROR_CHECK(res, error, bail);
2042 
2043     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
2044     SERIALIZATION_ERROR_CHECK(res, error, bail);
2045 
2046 bail:
2047     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2048 
2049     return;
2050 }
2051 
stat_timestamps_get_ret_await(uint32_t timeout,nrf_802154_stat_timestamps_t * p_stat_timestamps)2052 static nrf_802154_ser_err_t stat_timestamps_get_ret_await(uint32_t                       timeout,
2053                                                           nrf_802154_stat_timestamps_t * p_stat_timestamps)
2054 {
2055     nrf_802154_ser_err_t              res;
2056     nrf_802154_spinel_notify_buff_t * p_notify_data = NULL;
2057 
2058     SERIALIZATION_ERROR_INIT(error);
2059 
2060     p_notify_data = nrf_802154_spinel_response_notifier_property_await(
2061         timeout);
2062 
2063     SERIALIZATION_ERROR_IF(p_notify_data == NULL,
2064                            NRF_802154_SERIALIZATION_ERROR_RESPONSE_TIMEOUT,
2065                            error,
2066                            bail);
2067 
2068     res = nrf_802154_spinel_decode_prop_nrf_802154_stat_timestamps_get_ret(
2069         p_notify_data->data,
2070         p_notify_data->data_len,
2071         p_stat_timestamps);
2072 
2073     SERIALIZATION_ERROR_CHECK(res, error, bail);
2074 
2075     NRF_802154_SPINEL_LOG_BANNER_RESPONSE();
2076 
2077 bail:
2078     if (p_notify_data != NULL)
2079     {
2080         nrf_802154_spinel_response_notifier_free(p_notify_data);
2081     }
2082 
2083     return error;
2084 }
2085 
nrf_802154_stat_timestamps_get(nrf_802154_stat_timestamps_t * p_stat_timestamps)2086 void nrf_802154_stat_timestamps_get(nrf_802154_stat_timestamps_t * p_stat_timestamps)
2087 {
2088     nrf_802154_ser_err_t res;
2089 
2090     SERIALIZATION_ERROR_INIT(error);
2091 
2092     NRF_802154_SPINEL_LOG_BANNER_CALLING();
2093 
2094     nrf_802154_spinel_response_notifier_lock_before_request(
2095         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_STAT_TIMESTAMPS_GET);
2096 
2097     res = nrf_802154_spinel_send_cmd_prop_value_set(
2098         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_STAT_TIMESTAMPS_GET,
2099         SPINEL_DATATYPE_NRF_802154_STAT_TIMESTAMPS_GET,
2100         NULL);
2101 
2102     SERIALIZATION_ERROR_CHECK(res, error, bail);
2103 
2104     res = stat_timestamps_get_ret_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
2105                                         p_stat_timestamps);
2106     SERIALIZATION_ERROR_CHECK(res, error, bail);
2107 
2108 bail:
2109     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2110 }
2111 
2112 #if NRF_802154_IFS_ENABLED
2113 
nrf_802154_ifs_mode_get(void)2114 nrf_802154_ifs_mode_t nrf_802154_ifs_mode_get(void)
2115 {
2116     nrf_802154_ser_err_t  res;
2117     nrf_802154_ifs_mode_t mode = NRF_802154_IFS_MODE_DISABLED;
2118 
2119     SERIALIZATION_ERROR_INIT(error);
2120 
2121     NRF_802154_SPINEL_LOG_BANNER_CALLING();
2122 
2123     nrf_802154_spinel_response_notifier_lock_before_request(
2124         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MODE_GET);
2125 
2126     res = nrf_802154_spinel_send_cmd_prop_value_set(
2127         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MODE_GET,
2128         SPINEL_DATATYPE_NRF_802154_IFS_MODE_GET,
2129         NULL);
2130 
2131     SERIALIZATION_ERROR_CHECK(res, error, bail);
2132 
2133     res = net_generic_uint8_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
2134                                            &mode);
2135     SERIALIZATION_ERROR_CHECK(res, error, bail);
2136 
2137 bail:
2138     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2139 
2140     return mode;
2141 }
2142 
nrf_802154_ifs_mode_set(nrf_802154_ifs_mode_t mode)2143 bool nrf_802154_ifs_mode_set(nrf_802154_ifs_mode_t mode)
2144 {
2145     nrf_802154_ser_err_t res;
2146     bool                 result = false;
2147 
2148     SERIALIZATION_ERROR_INIT(error);
2149 
2150     NRF_802154_SPINEL_LOG_BANNER_CALLING();
2151     NRF_802154_SPINEL_LOG_VAR("%u", mode);
2152 
2153     nrf_802154_spinel_response_notifier_lock_before_request(
2154         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MODE_SET);
2155 
2156     res = nrf_802154_spinel_send_cmd_prop_value_set(
2157         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MODE_SET,
2158         SPINEL_DATATYPE_NRF_802154_IFS_MODE_SET,
2159         mode);
2160 
2161     SERIALIZATION_ERROR_CHECK(res, error, bail);
2162 
2163     res = net_generic_bool_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
2164                                           &result);
2165     SERIALIZATION_ERROR_CHECK(res, error, bail);
2166 
2167 bail:
2168     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2169 
2170     return result;
2171 }
2172 
nrf_802154_ifs_min_sifs_period_get(void)2173 uint16_t nrf_802154_ifs_min_sifs_period_get(void)
2174 {
2175     nrf_802154_ser_err_t res;
2176     uint16_t             period = 0U;
2177 
2178     SERIALIZATION_ERROR_INIT(error);
2179 
2180     NRF_802154_SPINEL_LOG_BANNER_CALLING();
2181 
2182     nrf_802154_spinel_response_notifier_lock_before_request(
2183         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_SIFS_PERIOD_GET);
2184 
2185     res = nrf_802154_spinel_send_cmd_prop_value_set(
2186         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_SIFS_PERIOD_GET,
2187         SPINEL_DATATYPE_NRF_802154_IFS_MIN_SIFS_PERIOD_GET,
2188         NULL);
2189 
2190     SERIALIZATION_ERROR_CHECK(res, error, bail);
2191 
2192     res = net_generic_uint16_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
2193                                             &period);
2194     SERIALIZATION_ERROR_CHECK(res, error, bail);
2195 
2196 bail:
2197     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2198 
2199     return period;
2200 }
2201 
nrf_802154_ifs_min_sifs_period_set(uint16_t period)2202 void nrf_802154_ifs_min_sifs_period_set(uint16_t period)
2203 {
2204     nrf_802154_ser_err_t res;
2205 
2206     SERIALIZATION_ERROR_INIT(error);
2207 
2208     NRF_802154_SPINEL_LOG_BANNER_CALLING();
2209 
2210     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
2211 
2212     res = nrf_802154_spinel_send_cmd_prop_value_set(
2213         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_SIFS_PERIOD_SET,
2214         SPINEL_DATATYPE_NRF_802154_IFS_MIN_SIFS_PERIOD_SET,
2215         period);
2216 
2217     SERIALIZATION_ERROR_CHECK(res, error, bail);
2218 
2219     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
2220     SERIALIZATION_ERROR_CHECK(res, error, bail);
2221 
2222 bail:
2223     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2224 
2225     return;
2226 }
2227 
nrf_802154_ifs_min_lifs_period_get(void)2228 uint16_t nrf_802154_ifs_min_lifs_period_get(void)
2229 {
2230     nrf_802154_ser_err_t res;
2231     uint16_t             period = 0U;
2232 
2233     SERIALIZATION_ERROR_INIT(error);
2234 
2235     NRF_802154_SPINEL_LOG_BANNER_CALLING();
2236 
2237     nrf_802154_spinel_response_notifier_lock_before_request(
2238         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_LIFS_PERIOD_GET);
2239 
2240     res = nrf_802154_spinel_send_cmd_prop_value_set(
2241         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_LIFS_PERIOD_GET,
2242         SPINEL_DATATYPE_NRF_802154_IFS_MIN_LIFS_PERIOD_GET,
2243         NULL);
2244 
2245     SERIALIZATION_ERROR_CHECK(res, error, bail);
2246 
2247     res = net_generic_uint16_response_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT,
2248                                             &period);
2249     SERIALIZATION_ERROR_CHECK(res, error, bail);
2250 
2251 bail:
2252     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2253 
2254     return period;
2255 }
2256 
nrf_802154_ifs_min_lifs_period_set(uint16_t period)2257 void nrf_802154_ifs_min_lifs_period_set(uint16_t period)
2258 {
2259     nrf_802154_ser_err_t res;
2260 
2261     SERIALIZATION_ERROR_INIT(error);
2262 
2263     NRF_802154_SPINEL_LOG_BANNER_CALLING();
2264 
2265     nrf_802154_spinel_response_notifier_lock_before_request(SPINEL_PROP_LAST_STATUS);
2266 
2267     res = nrf_802154_spinel_send_cmd_prop_value_set(
2268         SPINEL_PROP_VENDOR_NORDIC_NRF_802154_IFS_MIN_LIFS_PERIOD_SET,
2269         SPINEL_DATATYPE_NRF_802154_IFS_MIN_LIFS_PERIOD_SET,
2270         period);
2271 
2272     SERIALIZATION_ERROR_CHECK(res, error, bail);
2273 
2274     res = status_ok_await(CONFIG_NRF_802154_SER_DEFAULT_RESPONSE_TIMEOUT);
2275     SERIALIZATION_ERROR_CHECK(res, error, bail);
2276 
2277 bail:
2278     SERIALIZATION_ERROR_RAISE_IF_FAILED(error);
2279 
2280     return;
2281 }
2282 
2283 #endif // NRF_802154_IFS_ENABLED
2284