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
diff --git a/src/rlc.cpp b/src/rlc.cpp
index 4f62f23..44ce817 100644
--- a/src/rlc.cpp
+++ b/src/rlc.cpp
@@ -265,3 +265,49 @@
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;
+}