pdu: add unit test for packing and unpacking RAR PDUs
This commit is contained in:
parent
ea2e692836
commit
ee1f910877
2 changed files with 167 additions and 0 deletions
|
@ -52,3 +52,7 @@ add_executable(timeout_test timeout_test.cc)
|
|||
target_link_libraries(timeout_test srslte_phy ${CMAKE_THREAD_LIBS_INIT})
|
||||
|
||||
add_executable(bcd_helpers_test bcd_helpers_test.cc)
|
||||
|
||||
add_executable(pdu_test pdu_test.cc)
|
||||
target_link_libraries(pdu_test srslte_phy srslte_common ${CMAKE_THREAD_LIBS_INIT})
|
||||
add_test(pdu_test pdu_test)
|
163
lib/test/common/pdu_test.cc
Normal file
163
lib/test/common/pdu_test.cc
Normal file
|
@ -0,0 +1,163 @@
|
|||
/*
|
||||
* Copyright 2013-2019 Software Radio Systems Limited
|
||||
*
|
||||
* This file is part of srsLTE.
|
||||
*
|
||||
* srsLTE is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* srsLTE is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* A copy of the GNU Affero General Public License can be found in
|
||||
* the LICENSE file in the top-level directory of this distribution
|
||||
* and at http://www.gnu.org/licenses/.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "srslte/common/pdu.h"
|
||||
#include <iostream>
|
||||
|
||||
#define TESTASSERT(cond) \
|
||||
{ \
|
||||
if (!(cond)) { \
|
||||
std::cout << "[" << __FUNCTION__ << "][Line " << __LINE__ << "]: FAIL at " << (#cond) << std::endl; \
|
||||
return -1; \
|
||||
} \
|
||||
}
|
||||
|
||||
using namespace srslte;
|
||||
|
||||
#define CRNTI (0x1001)
|
||||
|
||||
// TV1 contains a RAR PDU for a single RAPID and no backoff indication
|
||||
#define RAPID_TV1 (42)
|
||||
#define TA_CMD_TV1 (8)
|
||||
uint8_t rar_pdu_tv1[] = {0x6a, 0x00, 0x80, 0x00, 0x0c, 0x10, 0x01};
|
||||
|
||||
// TV2 contains a RAR PDU for a single RAPID and also includes a backoff indication subheader
|
||||
#define RAPID_TV2 (22)
|
||||
#define BACKOFF_IND_TV2 (2)
|
||||
#define TA_CMD_TV2 (0)
|
||||
uint8_t rar_pdu_tv2[] = {0x82, 0x56, 0x00, 0x00, 0x00, 0x0c, 0x10, 0x01};
|
||||
|
||||
int mac_rar_pdu_unpack_test1()
|
||||
{
|
||||
srslte::rar_pdu rar_pdu_msg;
|
||||
rar_pdu_msg.init_rx(sizeof(rar_pdu_tv1));
|
||||
rar_pdu_msg.parse_packet(rar_pdu_tv1);
|
||||
rar_pdu_msg.fprint(stdout);
|
||||
|
||||
TESTASSERT(not rar_pdu_msg.has_backoff());
|
||||
while (rar_pdu_msg.next()) {
|
||||
TESTASSERT(rar_pdu_msg.get()->get_rapid() == RAPID_TV1);
|
||||
TESTASSERT(rar_pdu_msg.get()->get_ta_cmd() == TA_CMD_TV1);
|
||||
TESTASSERT(rar_pdu_msg.get()->get_temp_crnti() == CRNTI);
|
||||
}
|
||||
|
||||
return SRSLTE_SUCCESS;
|
||||
}
|
||||
|
||||
int mac_rar_pdu_unpack_test2()
|
||||
{
|
||||
srslte::rar_pdu rar_pdu_msg;
|
||||
rar_pdu_msg.init_rx(sizeof(rar_pdu_tv2));
|
||||
rar_pdu_msg.parse_packet(rar_pdu_tv2);
|
||||
rar_pdu_msg.fprint(stdout);
|
||||
|
||||
TESTASSERT(rar_pdu_msg.has_backoff());
|
||||
TESTASSERT(rar_pdu_msg.get_backoff() == BACKOFF_IND_TV2);
|
||||
while (rar_pdu_msg.next()) {
|
||||
if (rar_pdu_msg.get()->has_rapid()) {
|
||||
TESTASSERT(rar_pdu_msg.get()->get_rapid() == RAPID_TV2);
|
||||
TESTASSERT(rar_pdu_msg.get()->get_ta_cmd() == TA_CMD_TV2);
|
||||
TESTASSERT(rar_pdu_msg.get()->get_temp_crnti() == CRNTI);
|
||||
}
|
||||
}
|
||||
|
||||
return SRSLTE_SUCCESS;
|
||||
}
|
||||
|
||||
int mac_rar_pdu_pack_test1()
|
||||
{
|
||||
uint8_t rar_buffer[64] = {};
|
||||
|
||||
// Prepare RAR grant
|
||||
uint8_t grant_buffer[64] = {};
|
||||
srslte_dci_rar_grant_t rar_grant = {};
|
||||
rar_grant.tpc_pusch = 3;
|
||||
srslte_dci_rar_pack(&rar_grant, grant_buffer);
|
||||
|
||||
// Create MAC PDU and add RAR subheader
|
||||
srslte::rar_pdu rar_pdu;
|
||||
rar_pdu.init_tx(rar_buffer, 64);
|
||||
if (rar_pdu.new_subh()) {
|
||||
rar_pdu.get()->set_rapid(RAPID_TV1);
|
||||
rar_pdu.get()->set_ta_cmd(TA_CMD_TV1);
|
||||
rar_pdu.get()->set_temp_crnti(CRNTI);
|
||||
rar_pdu.get()->set_sched_grant(grant_buffer);
|
||||
}
|
||||
rar_pdu.write_packet(rar_buffer);
|
||||
|
||||
// compare with TV1
|
||||
TESTASSERT(memcmp(rar_buffer, rar_pdu_tv1, sizeof(rar_pdu_tv1)) == 0);
|
||||
|
||||
return SRSLTE_SUCCESS;
|
||||
}
|
||||
|
||||
int mac_rar_pdu_pack_test2()
|
||||
{
|
||||
uint8_t rar_buffer[64] = {};
|
||||
|
||||
// Prepare RAR grant
|
||||
uint8_t grant_buffer[64] = {};
|
||||
srslte_dci_rar_grant_t rar_grant = {};
|
||||
rar_grant.tpc_pusch = 3;
|
||||
srslte_dci_rar_pack(&rar_grant, grant_buffer);
|
||||
|
||||
// Create MAC PDU and add RAR subheader
|
||||
srslte::rar_pdu rar_pdu;
|
||||
rar_pdu.init_tx(rar_buffer, 64);
|
||||
rar_pdu.set_backoff(BACKOFF_IND_TV2);
|
||||
if (rar_pdu.new_subh()) {
|
||||
rar_pdu.get()->set_rapid(RAPID_TV2);
|
||||
rar_pdu.get()->set_ta_cmd(TA_CMD_TV2);
|
||||
rar_pdu.get()->set_temp_crnti(CRNTI);
|
||||
rar_pdu.get()->set_sched_grant(grant_buffer);
|
||||
}
|
||||
rar_pdu.write_packet(rar_buffer);
|
||||
|
||||
// compare with TV2
|
||||
TESTASSERT(memcmp(rar_buffer, rar_pdu_tv2, sizeof(rar_pdu_tv2)) == 0);
|
||||
|
||||
return SRSLTE_SUCCESS;
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
if (mac_rar_pdu_unpack_test1()) {
|
||||
fprintf(stderr, "mac_rar_pdu_unpack_test1 failed.\n");
|
||||
return SRSLTE_ERROR;
|
||||
}
|
||||
|
||||
if (mac_rar_pdu_unpack_test2()) {
|
||||
fprintf(stderr, "mac_rar_pdu_unpack_test2 failed.\n");
|
||||
return SRSLTE_ERROR;
|
||||
}
|
||||
|
||||
if (mac_rar_pdu_pack_test1()) {
|
||||
fprintf(stderr, "mac_rar_pdu_pack_test1 failed.\n");
|
||||
return SRSLTE_ERROR;
|
||||
}
|
||||
|
||||
if (mac_rar_pdu_pack_test2()) {
|
||||
fprintf(stderr, "mac_rar_pdu_pack_test2 failed.\n");
|
||||
return SRSLTE_ERROR;
|
||||
}
|
||||
|
||||
return SRSLTE_SUCCESS;
|
||||
}
|
Loading…
Reference in a new issue