aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2016-01-11 11:15:45 +0100
committerJacob Erlbeck <jerlbeck@sysmocom.de>2016-02-05 13:26:34 +0100
commit6e9f9c20e94e09fad5fa96ee233476b3ff16b045 (patch)
tree01323f9eca9fd5776034e68237d98bc2478e3aa3 /src
parentcc34a5b43f5542f2cc3866a0487915049d39df91 (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')
-rw-r--r--src/rlc.cpp46
-rw-r--r--src/rlc.h7
2 files changed, 53 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.