aboutsummaryrefslogtreecommitdiffstats
path: root/tests/tbf/TbfTest.cpp
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2015-05-27 13:03:15 +0200
committerJacob Erlbeck <jerlbeck@sysmocom.de>2015-05-28 12:29:43 +0200
commitddfc0d57632c5f57aeb123f6506d3923fcec69dc (patch)
treeca6c5a8408cd19bc3220643118079cd257fd5a1d /tests/tbf/TbfTest.cpp
parentd3eac2867a84d009fa3c1c7d8da9502f8468fbca (diff)
tbf/test: Add tests for single and two phase access
These tests cover the message exchange from receiving from the first RACH request to the first data block when establishing an uplink TBF. This will be used to check, whether TA and other values are passed to an MS object correctly. In addition, the RX RACH log message in rcv_rach is extended to contain the single block fn. Sponsored-by: On-Waves ehf
Diffstat (limited to 'tests/tbf/TbfTest.cpp')
-rw-r--r--tests/tbf/TbfTest.cpp142
1 files changed, 142 insertions, 0 deletions
diff --git a/tests/tbf/TbfTest.cpp b/tests/tbf/TbfTest.cpp
index 84ecb97..e25f344 100644
--- a/tests/tbf/TbfTest.cpp
+++ b/tests/tbf/TbfTest.cpp
@@ -25,6 +25,7 @@
#include "gprs_debug.h"
#include "pcu_utils.h"
#include "gprs_bssgp_pcu.h"
+#include "pcu_l1_if.h"
extern "C" {
#include "pcu_vty.h"
@@ -46,6 +47,20 @@ static void check_tbf(gprs_rlcmac_tbf *tbf)
OSMO_ASSERT(tbf);
}
+/*
+static unsigned inc_fn(fn)
+{
+ unsigned next_fn;
+
+ next_fn = fn + 4;
+ if ((block_nr % 3) == 2)
+ next_fn ++;
+ next_fn = next_fn % 2715648;
+
+ return next_fn;
+}
+*/
+
static void test_tbf_tlli_update()
{
BTS the_bts;
@@ -401,6 +416,131 @@ static void test_tbf_exhaustion()
gprs_bssgp_destroy();
}
+static void test_tbf_single_phase()
+{
+ BTS the_bts;
+ GprsMs *ms;
+ int ts_no = 7;
+ uint32_t fn = 2654167; /* 17,25,9 */
+ uint16_t qta = 31;
+ uint8_t trx_no = 0;
+ int tfi = 0;
+ gprs_rlcmac_ul_tbf *ul_tbf;
+ struct gprs_rlcmac_pdch *pdch;
+
+ printf("=== start %s ===\n", __func__);
+
+ setup_bts(&the_bts, ts_no);
+ tfi = the_bts.tfi_find_free(GPRS_RLCMAC_UL_TBF, &trx_no, -1);
+
+ the_bts.rcv_rach(0x03, fn, qta);
+
+ ul_tbf = the_bts.ul_tbf_by_tfi(tfi, trx_no);
+ OSMO_ASSERT(ul_tbf != NULL);
+
+ fprintf(stderr, "Got '%s', TA=%d\n",
+ ul_tbf->name(), ul_tbf->ta);
+
+ OSMO_ASSERT(ul_tbf->ta == qta / 4);
+
+ uint8_t data_msg[23] = {
+ 0x00, /* GPRS_RLCMAC_DATA_BLOCK << 6 */
+ uint8_t(1 | (tfi << 2)),
+ uint8_t(1), /* BSN:7, E:1 */
+ 0xf1, 0x22, 0x33, 0x44, /* TLLI */
+ };
+
+ pdch = &the_bts.bts_data()->trx[trx_no].pdch[ts_no];
+ pdch->rcv_block(&data_msg[0], sizeof(data_msg), fn, 0);
+
+ ms = the_bts.ms_by_tlli(0xf1223344);
+ OSMO_ASSERT(ms != NULL);
+ fprintf(stderr, "Got MS: TLLI = 0x%08x\n", ms->tlli());
+
+ printf("=== end %s ===\n", __func__);
+}
+
+static void test_tbf_two_phase()
+{
+ BTS the_bts;
+ GprsMs *ms;
+ int ts_no = 7;
+ uint32_t rach_fn = 2654167; /* 17,25,9 */
+ uint32_t rts_fn = 2654218;
+ uint8_t rts_bn = 8;
+ uint16_t qta = 31;
+ uint8_t trx_no = 0;
+ int tfi = 0;
+ const uint32_t tlli = 0xf1223344;
+ gprs_rlcmac_ul_tbf *ul_tbf;
+ struct gprs_rlcmac_pdch *pdch;
+ gprs_rlcmac_bts *bts;
+ RlcMacUplink_t ulreq = {0};
+ bitvec *rlc_block;
+ uint8_t buf[64];
+ int num_bytes;
+
+ printf("=== start %s ===\n", __func__);
+
+ setup_bts(&the_bts, ts_no);
+ bts = the_bts.bts_data();
+
+ /* needed to set last_rts_fn in the PDCH object */
+ send_rlc_block(bts, trx_no, ts_no, 0, &rts_fn, &rts_bn);
+
+ /* simulate RACH, this sends an Immediate Assignment Uplink on the AGCH */
+ the_bts.rcv_rach(0x73, rach_fn, qta);
+
+ /* get next free TFI */
+ tfi = the_bts.tfi_find_free(GPRS_RLCMAC_UL_TBF, &trx_no, -1);
+
+ /* fake a resource request */
+ rlc_block = bitvec_alloc(23);
+
+ ulreq.u.MESSAGE_TYPE = MT_PACKET_RESOURCE_REQUEST;
+ ulreq.u.Packet_Resource_Request.PayloadType = GPRS_RLCMAC_CONTROL_BLOCK;
+ ulreq.u.Packet_Resource_Request.ID.UnionType = 1; /* != 0 */
+ ulreq.u.Packet_Resource_Request.ID.u.TLLI = tlli;
+
+ encode_gsm_rlcmac_uplink(rlc_block, &ulreq);
+ num_bytes = bitvec_pack(rlc_block, &buf[0]);
+ OSMO_ASSERT(size_t(num_bytes) < sizeof(buf));
+ bitvec_free(rlc_block);
+
+ pdch = &the_bts.bts_data()->trx[trx_no].pdch[ts_no];
+ pdch->rcv_block(&buf[0], num_bytes, 2654270, 31);
+
+ /* check the TBF */
+ ul_tbf = the_bts.ul_tbf_by_tfi(tfi, trx_no);
+ OSMO_ASSERT(ul_tbf != NULL);
+
+ fprintf(stderr, "Got '%s', TA=%d\n",
+ ul_tbf->name(), ul_tbf->ta);
+
+ OSMO_ASSERT(ul_tbf->ta == qta / 4);
+
+ /* send packet uplink assignment */
+ rts_fn += 52;
+ rts_bn += 12;
+ send_rlc_block(bts, trx_no, ts_no, 0, &rts_fn, &rts_bn);
+
+ /* send fake data */
+ uint8_t data_msg[23] = {
+ 0x00, /* GPRS_RLCMAC_DATA_BLOCK << 6 */
+ uint8_t(0 | (tfi << 2)),
+ uint8_t(1), /* BSN:7, E:1 */
+ };
+
+ pdch->rcv_block(&data_msg[0], sizeof(data_msg), rts_fn, 31);
+
+ ms = the_bts.ms_by_tlli(0xf1223344);
+ OSMO_ASSERT(ms != NULL);
+ fprintf(stderr, "Got MS: TLLI = 0x%08x\n", ms->tlli());
+
+ printf("=== end %s ===\n", __func__);
+}
+
+
static const struct log_info_cat default_categories[] = {
{"DCSN1", "\033[1;31m", "Concrete Syntax Notation One (CSN1)", LOGL_INFO, 0},
{"DL1IF", "\033[1;32m", "GPRS PCU L1 interface (L1IF)", LOGL_DEBUG, 1},
@@ -449,6 +589,8 @@ int main(int argc, char **argv)
test_tbf_delayed_release();
test_tbf_imsi();
test_tbf_exhaustion();
+ test_tbf_single_phase();
+ test_tbf_two_phase();
if (getenv("TALLOC_REPORT_FULL"))
talloc_report_full(tall_pcu_ctx, stderr);