1414#include <net/net_pkt.h>
1515
1616#include <openthread/platform/radio.h>
17+ #include <openthread/message.h>
1718#include <platform-zephyr.h>
1819
1920/**
@@ -36,6 +37,7 @@ energy_scan_done_cb_t scan_done_cb;
3637 * Should not be null to be sure it was properly passed.
3738 */
3839otInstance * ot = (otInstance * )0xAAAA ;
40+ otMessage * ip_msg = (otMessage * )0xBBBB ;
3941
4042/* forward declarations */
4143static int scan_mock (struct device * dev , uint16_t duration ,
@@ -273,6 +275,35 @@ struct device *device_get_binding_stub(const char *name)
273275 return & radio ;
274276}
275277
278+ otError otIp6Send (otInstance * aInstance , otMessage * aMessage )
279+ {
280+ zassert_equal (aInstance , ot , "Incorrect instance." );
281+ ztest_check_expected_value (aMessage );
282+ return ztest_get_return_value ();
283+ }
284+
285+ otMessage * otIp6NewMessage (otInstance * aInstance ,
286+ const otMessageSettings * aSettings )
287+ {
288+ zassert_equal (aInstance , ot , "Incorrect instance." );
289+ return ip_msg ;
290+ }
291+
292+ otError otMessageAppend (otMessage * aMessage , const void * aBuf , uint16_t aLength )
293+ {
294+ void * buf = (void * )aBuf ;
295+
296+ ztest_check_expected_value (aMessage );
297+ ztest_check_expected_value (aLength );
298+ ztest_check_expected_data (buf , aLength );
299+ return ztest_get_return_value ();
300+ }
301+
302+ void otMessageFree (otMessage * aMessage )
303+ {
304+ ztest_check_expected_value (aMessage );
305+ }
306+
276307void otPlatRadioTxStarted (otInstance * aInstance , otRadioFrame * aFrame )
277308{
278309 zassert_equal (aInstance , ot , "Incorrect instance." );
@@ -752,6 +783,31 @@ static void test_address_test(void)
752783 otPlatRadioSetExtendedAddress (ot , & ieee_addr );
753784}
754785
786+
787+ uint8_t alloc_pkt (struct net_pkt * * out_packet , uint8_t buf_ct , uint8_t offset )
788+ {
789+ struct net_pkt * packet ;
790+ struct net_buf * buf ;
791+ uint8_t len = 0 ;
792+ uint8_t buf_num ;
793+
794+ packet = net_pkt_alloc (K_NO_WAIT );
795+ for (buf_num = 0 ; buf_num < buf_ct ; buf_num ++ ) {
796+ buf = net_pkt_get_reserve_tx_data (K_NO_WAIT );
797+ net_pkt_append_buffer (packet , buf );
798+
799+ for (int i = 0 ; i < buf -> size ; i ++ ) {
800+ buf -> data [i ] = (offset + i + buf_num ) & 0xFF ;
801+ }
802+
803+ len = buf -> size - 3 ;
804+ buf -> len = len ;
805+ }
806+
807+ * out_packet = packet ;
808+ return len ;
809+ }
810+
755811/**
756812 * @brief Test received messages handling.
757813 * Tests if received frames are properly passed to the OpenThread
@@ -767,15 +823,8 @@ static void test_receive_test(void)
767823 const int8_t rssi = -90 ;
768824 uint8_t len ;
769825
770- packet = net_pkt_alloc (K_NO_WAIT );
771- buf = net_pkt_get_reserve_tx_data (K_NO_WAIT );
772- net_pkt_append_buffer (packet , buf );
773-
774- for (int i = 0 ; i < buf -> size ; i ++ ) {
775- buf -> data [i ] = ('a' + i ) & 0xFF ;
776- }
777- len = buf -> size - 3 ;
778- buf -> len = len ;
826+ len = alloc_pkt (& packet , 1 , 'a' );
827+ buf = packet -> buffer ;
779828
780829 net_pkt_set_ieee802154_lqi (packet , lqi );
781830 net_pkt_set_ieee802154_rssi (packet , rssi );
@@ -803,6 +852,92 @@ static void test_receive_test(void)
803852 platformRadioProcess (ot );
804853}
805854
855+ /**
856+ * @brief Test received messages handling.
857+ * Tests if received frames are properly passed to the OpenThread
858+ *
859+ */
860+ static void test_net_pkt_transmit (void )
861+ {
862+ struct net_pkt * packet ;
863+ struct net_buf * buf ;
864+ const uint8_t channel = 21 ;
865+ const int8_t power = -5 ;
866+ uint8_t len ;
867+
868+ /* success */
869+ len = alloc_pkt (& packet , 2 , 'a' );
870+ buf = packet -> buffer ;
871+ otPlatRadioSetTransmitPower (ot , power );
872+
873+ ztest_returns_value (set_channel_mock , 0 );
874+ ztest_expect_value (set_channel_mock , channel , channel );
875+ ztest_expect_value (set_txpower_mock , dbm , power );
876+ ztest_expect_value (start_mock , dev , & radio );
877+ otPlatRadioReceive (ot , channel );
878+
879+ notify_new_tx_frame (packet );
880+
881+ make_sure_sem_set (Z_TIMEOUT_MS (100 ));
882+
883+ ztest_expect_value (otMessageAppend , aMessage , ip_msg );
884+ ztest_expect_value (otMessageAppend , aLength , len );
885+ ztest_expect_data (otMessageAppend , buf , buf -> data );
886+ ztest_returns_value (otMessageAppend , OT_ERROR_NONE );
887+
888+ buf = buf -> frags ;
889+ ztest_expect_value (otMessageAppend , aMessage , ip_msg );
890+ ztest_expect_value (otMessageAppend , aLength , len );
891+ ztest_expect_data (otMessageAppend , buf , buf -> data );
892+ ztest_returns_value (otMessageAppend , OT_ERROR_NONE );
893+
894+ ztest_expect_value (otIp6Send , aMessage , ip_msg );
895+ ztest_returns_value (otIp6Send , OT_ERROR_NONE );
896+
897+ /* Do not expect free in case of success */
898+
899+ platformRadioProcess (ot );
900+
901+ /* fail on append */
902+ len = alloc_pkt (& packet , 2 , 'b' );
903+ buf = packet -> buffer ;
904+
905+ notify_new_tx_frame (packet );
906+
907+ make_sure_sem_set (Z_TIMEOUT_MS (100 ));
908+
909+ ztest_expect_value (otMessageAppend , aMessage , ip_msg );
910+ ztest_expect_value (otMessageAppend , aLength , len );
911+ ztest_expect_data (otMessageAppend , buf , buf -> data );
912+ ztest_returns_value (otMessageAppend , OT_ERROR_NO_BUFS );
913+
914+ /* Expect free in case of failure in appending buffer*/
915+ ztest_expect_value (otMessageFree , aMessage , ip_msg );
916+
917+ platformRadioProcess (ot );
918+
919+ /* fail on send */
920+ len = alloc_pkt (& packet , 1 , 'c' );
921+ buf = packet -> buffer ;
922+
923+ notify_new_tx_frame (packet );
924+
925+ make_sure_sem_set (Z_TIMEOUT_MS (100 ));
926+
927+ ztest_expect_value (otMessageAppend , aMessage , ip_msg );
928+ ztest_expect_value (otMessageAppend , aLength , len );
929+ ztest_expect_data (otMessageAppend , buf , buf -> data );
930+ ztest_returns_value (otMessageAppend , OT_ERROR_NONE );
931+
932+ ztest_expect_value (otIp6Send , aMessage , ip_msg );
933+ ztest_returns_value (otIp6Send , OT_ERROR_BUSY );
934+
935+ /* Do not expect free in case of failure in send */
936+
937+ platformRadioProcess (ot );
938+
939+ }
940+
806941void test_main (void )
807942{
808943 platformRadioInit ();
@@ -819,7 +954,9 @@ void test_main(void)
819954 ztest_unit_test (test_get_rssi_test ),
820955 ztest_unit_test (test_radio_state_test ),
821956 ztest_unit_test (test_address_test ),
822- ztest_unit_test (test_receive_test ));
957+ ztest_unit_test (test_receive_test ),
958+ ztest_unit_test (test_net_pkt_transmit ));
959+
823960
824961 ztest_run_test_suite (openthread_radio );
825962}
0 commit comments