aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/rlc.cpp46
-rw-r--r--src/rlc.h7
-rw-r--r--tests/edge/EdgeTest.cpp18
-rw-r--r--tests/edge/EdgeTest.ok2
4 files changed, 73 insertions, 0 deletions
diff --git a/src/rlc.cpp b/src/rlc.cpp
index 4f62f23c..44ce817b 100644
--- a/src/rlc.cpp
+++ b/src/rlc.cpp
@@ -265,3 +265,49 @@ bool gprs_rlc_ul_window::invalidate_bsn(const uint16_t bsn)
return was_valid;
}
+
+static void gprs_rlc_data_header_init(struct gprs_rlc_data_info *rlc,
+ GprsCodingScheme cs, unsigned int header_bits)
+{
+ unsigned int i;
+
+ memset(rlc, 0, sizeof(*rlc));
+
+ rlc->cs = cs;
+ rlc->num_data_blocks = cs.numDataBlocks();
+
+ OSMO_ASSERT(rlc->num_data_blocks <= ARRAY_SIZE(rlc->block_info));
+
+ for (i = 0; i < rlc->num_data_blocks; i++) {
+ gprs_rlc_data_block_info_init(&rlc->block_info[i], cs);
+
+ rlc->data_offs_bits[i] =
+ header_bits +
+ (i+1) * cs.numDataBlockHeaderBits() +
+ i * 8 * rlc->block_info[0].data_len;
+ }
+}
+
+void gprs_rlc_data_info_init_dl(struct gprs_rlc_data_info *rlc,
+ GprsCodingScheme cs)
+{
+ return gprs_rlc_data_header_init(rlc, cs, cs.numDataHeaderBitsDL());
+}
+
+void gprs_rlc_data_info_init_ul(struct gprs_rlc_data_info *rlc,
+ GprsCodingScheme cs)
+{
+ return gprs_rlc_data_header_init(rlc, cs, cs.numDataHeaderBitsUL());
+}
+
+void gprs_rlc_data_block_info_init(struct gprs_rlc_data_block_info *rdbi,
+ GprsCodingScheme cs)
+{
+ rdbi->data_len = cs.maxDataBlockBytes();
+ rdbi->bsn = 0;
+ rdbi->ti = 0;
+ rdbi->e = 1;
+ rdbi->cv = 15;
+ rdbi->pi = 0;
+ rdbi->spb = 0;
+}
diff --git a/src/rlc.h b/src/rlc.h
index 0cd7593a..59176253 100644
--- a/src/rlc.h
+++ b/src/rlc.h
@@ -99,6 +99,13 @@ struct gprs_rlc_data {
GprsCodingScheme cs;
};
+void gprs_rlc_data_info_init_dl(struct gprs_rlc_data_info *rlc,
+ GprsCodingScheme cs);
+void gprs_rlc_data_info_init_ul(struct gprs_rlc_data_info *rlc,
+ GprsCodingScheme cs);
+void gprs_rlc_data_block_info_init(struct gprs_rlc_data_block_info *rdbi,
+ GprsCodingScheme cs);
+
/*
* I hold the currently transferred blocks and will provide
* the routines to manipulate these arrays.
diff --git a/tests/edge/EdgeTest.cpp b/tests/edge/EdgeTest.cpp
index b26262ca..7bb81e47 100644
--- a/tests/edge/EdgeTest.cpp
+++ b/tests/edge/EdgeTest.cpp
@@ -481,6 +481,23 @@ static void test_rlc_unit_decoder()
printf("=== end %s ===\n", __func__);
}
+static void test_rlc_info_init()
+{
+ struct gprs_rlc_data_info rlc;
+
+ printf("=== start %s ===\n", __func__);
+ gprs_rlc_data_info_init_dl(&rlc, GprsCodingScheme(GprsCodingScheme::CS1));
+ OSMO_ASSERT(rlc.num_data_blocks == 1);
+ OSMO_ASSERT(rlc.data_offs_bits[0] == 24);
+ OSMO_ASSERT(rlc.block_info[0].data_len == 20);
+
+ gprs_rlc_data_info_init_dl(&rlc, GprsCodingScheme(GprsCodingScheme::MCS1));
+ OSMO_ASSERT(rlc.num_data_blocks == 1);
+ OSMO_ASSERT(rlc.data_offs_bits[0] == 33);
+ OSMO_ASSERT(rlc.block_info[0].data_len == 22);
+
+ 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},
@@ -525,6 +542,7 @@ int main(int argc, char **argv)
pcu_vty_init(&debug_log_info);
test_coding_scheme();
+ test_rlc_info_init();
test_rlc_unit_decoder();
if (getenv("TALLOC_REPORT_FULL"))
diff --git a/tests/edge/EdgeTest.ok b/tests/edge/EdgeTest.ok
index 791f0d5e..95ec2b3a 100644
--- a/tests/edge/EdgeTest.ok
+++ b/tests/edge/EdgeTest.ok
@@ -1,4 +1,6 @@
=== start test_coding_scheme ===
=== end test_coding_scheme ===
+=== start test_rlc_info_init ===
+=== end test_rlc_info_init ===
=== start test_rlc_unit_decoder ===
=== end test_rlc_unit_decoder ===