aboutsummaryrefslogtreecommitdiffstats
path: root/src/rlc.cpp
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2016-01-11 11:15:45 +0100
committerJacob Erlbeck <jerlbeck@sysmocom.de>2016-02-02 17:06:31 +0100
commit64a16384c98552cf97b8bdb6923ba353c3689cbe (patch)
tree449d4d06b58a225741fe07661010d3b269386c48 /src/rlc.cpp
parent92ae6d19c909296e77e40dd951939b3a01d61391 (diff)
edge: Add init functions for gprs_rlc_data_info
Add the functions gprs_rlc_data_info_init_dl/ul which initialise a gprs_rlc_data_info structure depending on the coding scheme. The fields num_data_blocks, data_offs_bits, cs, and the data_blocks are valid after this call. The other fields are set to 0. The data blocks are initialised to the correct data_len, e == 1 (no extension header field), cv == 15 (not a final block). The other data block fields are set to 0. The gprs_rlc_data_block_info can also be initialised separately by using the gprs_rlc_data_block_info_init function. Sponsored-by: On-Waves ehf
Diffstat (limited to 'src/rlc.cpp')
-rw-r--r--src/rlc.cpp46
1 files changed, 46 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;
+}