diff options
-rw-r--r-- | src/rlc.cpp | 46 | ||||
-rw-r--r-- | src/rlc.h | 7 | ||||
-rw-r--r-- | tests/edge/EdgeTest.cpp | 18 | ||||
-rw-r--r-- | tests/edge/EdgeTest.ok | 2 |
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; +} @@ -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 === |