rlc: Add with_padding argument to gprs_rlc_data_info_init_dl/ul
The offsets of the data areas change when padding is used (see TS 44.060, 9.3.2.1 and Annex J for details). Extend the parameter lists to pass the with_padding flag and use that information to compute the correct offsets. Sponsored-by: On-Waves ehf
This commit is contained in:
parent
6c273dc8e7
commit
fc6d572c07
27
src/rlc.cpp
27
src/rlc.cpp
|
@ -282,43 +282,52 @@ bool gprs_rlc_ul_window::invalidate_bsn(const uint16_t bsn)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gprs_rlc_data_header_init(struct gprs_rlc_data_info *rlc,
|
static void gprs_rlc_data_header_init(struct gprs_rlc_data_info *rlc,
|
||||||
GprsCodingScheme cs, unsigned int header_bits)
|
GprsCodingScheme cs, bool with_padding, unsigned int header_bits)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
unsigned int padding_bits = with_padding ? cs.optionalPaddingBits() : 0;
|
||||||
|
|
||||||
memset(rlc, 0, sizeof(*rlc));
|
memset(rlc, 0, sizeof(*rlc));
|
||||||
|
|
||||||
rlc->cs = cs;
|
rlc->cs = cs;
|
||||||
|
rlc->with_padding = with_padding;
|
||||||
rlc->num_data_blocks = cs.numDataBlocks();
|
rlc->num_data_blocks = cs.numDataBlocks();
|
||||||
|
|
||||||
OSMO_ASSERT(rlc->num_data_blocks <= ARRAY_SIZE(rlc->block_info));
|
OSMO_ASSERT(rlc->num_data_blocks <= ARRAY_SIZE(rlc->block_info));
|
||||||
|
|
||||||
for (i = 0; i < rlc->num_data_blocks; i++) {
|
for (i = 0; i < rlc->num_data_blocks; i++) {
|
||||||
gprs_rlc_data_block_info_init(&rlc->block_info[i], cs);
|
gprs_rlc_data_block_info_init(&rlc->block_info[i], cs,
|
||||||
|
with_padding);
|
||||||
|
|
||||||
rlc->data_offs_bits[i] =
|
rlc->data_offs_bits[i] =
|
||||||
header_bits +
|
header_bits + padding_bits +
|
||||||
(i+1) * cs.numDataBlockHeaderBits() +
|
(i+1) * cs.numDataBlockHeaderBits() +
|
||||||
i * 8 * rlc->block_info[0].data_len;
|
i * 8 * rlc->block_info[0].data_len;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void gprs_rlc_data_info_init_dl(struct gprs_rlc_data_info *rlc,
|
void gprs_rlc_data_info_init_dl(struct gprs_rlc_data_info *rlc,
|
||||||
GprsCodingScheme cs)
|
GprsCodingScheme cs, bool with_padding)
|
||||||
{
|
{
|
||||||
return gprs_rlc_data_header_init(rlc, cs, cs.numDataHeaderBitsDL());
|
return gprs_rlc_data_header_init(rlc, cs, with_padding,
|
||||||
|
cs.numDataHeaderBitsDL());
|
||||||
}
|
}
|
||||||
|
|
||||||
void gprs_rlc_data_info_init_ul(struct gprs_rlc_data_info *rlc,
|
void gprs_rlc_data_info_init_ul(struct gprs_rlc_data_info *rlc,
|
||||||
GprsCodingScheme cs)
|
GprsCodingScheme cs, bool with_padding)
|
||||||
{
|
{
|
||||||
return gprs_rlc_data_header_init(rlc, cs, cs.numDataHeaderBitsUL());
|
return gprs_rlc_data_header_init(rlc, cs, with_padding,
|
||||||
|
cs.numDataHeaderBitsUL());
|
||||||
}
|
}
|
||||||
|
|
||||||
void gprs_rlc_data_block_info_init(struct gprs_rlc_data_block_info *rdbi,
|
void gprs_rlc_data_block_info_init(struct gprs_rlc_data_block_info *rdbi,
|
||||||
GprsCodingScheme cs)
|
GprsCodingScheme cs, bool with_padding)
|
||||||
{
|
{
|
||||||
rdbi->data_len = cs.maxDataBlockBytes();
|
unsigned int data_len = cs.maxDataBlockBytes();
|
||||||
|
if (with_padding)
|
||||||
|
data_len -= cs.optionalPaddingBits() / 8;
|
||||||
|
|
||||||
|
rdbi->data_len = data_len;
|
||||||
rdbi->bsn = 0;
|
rdbi->bsn = 0;
|
||||||
rdbi->ti = 0;
|
rdbi->ti = 0;
|
||||||
rdbi->e = 1;
|
rdbi->e = 1;
|
||||||
|
|
|
@ -84,6 +84,7 @@ struct gprs_rlc_data_info {
|
||||||
unsigned int rrbp;
|
unsigned int rrbp;
|
||||||
unsigned int pr;
|
unsigned int pr;
|
||||||
unsigned int num_data_blocks;
|
unsigned int num_data_blocks;
|
||||||
|
unsigned int with_padding;
|
||||||
unsigned int data_offs_bits[2];
|
unsigned int data_offs_bits[2];
|
||||||
struct gprs_rlc_data_block_info block_info[2];
|
struct gprs_rlc_data_block_info block_info[2];
|
||||||
};
|
};
|
||||||
|
@ -102,11 +103,11 @@ struct gprs_rlc_data {
|
||||||
};
|
};
|
||||||
|
|
||||||
void gprs_rlc_data_info_init_dl(struct gprs_rlc_data_info *rlc,
|
void gprs_rlc_data_info_init_dl(struct gprs_rlc_data_info *rlc,
|
||||||
GprsCodingScheme cs);
|
GprsCodingScheme cs, bool with_padding);
|
||||||
void gprs_rlc_data_info_init_ul(struct gprs_rlc_data_info *rlc,
|
void gprs_rlc_data_info_init_ul(struct gprs_rlc_data_info *rlc,
|
||||||
GprsCodingScheme cs);
|
GprsCodingScheme cs, bool with_padding);
|
||||||
void gprs_rlc_data_block_info_init(struct gprs_rlc_data_block_info *rdbi,
|
void gprs_rlc_data_block_info_init(struct gprs_rlc_data_block_info *rdbi,
|
||||||
GprsCodingScheme cs);
|
GprsCodingScheme cs, bool with_padding);
|
||||||
unsigned int gprs_rlc_mcs_cps(GprsCodingScheme cs, int punct, int punct2,
|
unsigned int gprs_rlc_mcs_cps(GprsCodingScheme cs, int punct, int punct2,
|
||||||
int with_padding);
|
int with_padding);
|
||||||
|
|
||||||
|
|
|
@ -542,7 +542,7 @@ static void test_rlc_unit_encoder()
|
||||||
|
|
||||||
/* TS 44.060, B.1 */
|
/* TS 44.060, B.1 */
|
||||||
cs = GprsCodingScheme::CS4;
|
cs = GprsCodingScheme::CS4;
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -589,7 +589,7 @@ static void test_rlc_unit_encoder()
|
||||||
cs = GprsCodingScheme::CS1;
|
cs = GprsCodingScheme::CS1;
|
||||||
|
|
||||||
/* Block 1 */
|
/* Block 1 */
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -609,7 +609,7 @@ static void test_rlc_unit_encoder()
|
||||||
OSMO_ASSERT(data[1] == 0);
|
OSMO_ASSERT(data[1] == 0);
|
||||||
|
|
||||||
/* Block 2 */
|
/* Block 2 */
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -642,7 +642,7 @@ static void test_rlc_unit_encoder()
|
||||||
cs = GprsCodingScheme::CS1;
|
cs = GprsCodingScheme::CS1;
|
||||||
|
|
||||||
/* Block 1 */
|
/* Block 1 */
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -677,7 +677,7 @@ static void test_rlc_unit_encoder()
|
||||||
cs = GprsCodingScheme::CS1;
|
cs = GprsCodingScheme::CS1;
|
||||||
|
|
||||||
/* Block 1 */
|
/* Block 1 */
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -700,7 +700,7 @@ static void test_rlc_unit_encoder()
|
||||||
cs = GprsCodingScheme::CS1;
|
cs = GprsCodingScheme::CS1;
|
||||||
|
|
||||||
/* Block 1 */
|
/* Block 1 */
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -723,7 +723,7 @@ static void test_rlc_unit_encoder()
|
||||||
cs = GprsCodingScheme::CS1;
|
cs = GprsCodingScheme::CS1;
|
||||||
|
|
||||||
/* Block 1 */
|
/* Block 1 */
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -742,7 +742,7 @@ static void test_rlc_unit_encoder()
|
||||||
OSMO_ASSERT(data[0] == 0);
|
OSMO_ASSERT(data[0] == 0);
|
||||||
|
|
||||||
/* Block 2 */
|
/* Block 2 */
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -775,7 +775,7 @@ static void test_rlc_unit_encoder()
|
||||||
cs = GprsCodingScheme::MCS4;
|
cs = GprsCodingScheme::MCS4;
|
||||||
|
|
||||||
/* Block 1 */
|
/* Block 1 */
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -827,7 +827,7 @@ static void test_rlc_unit_encoder()
|
||||||
cs = GprsCodingScheme::MCS2;
|
cs = GprsCodingScheme::MCS2;
|
||||||
|
|
||||||
/* Block 1 */
|
/* Block 1 */
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -859,7 +859,7 @@ static void test_rlc_unit_encoder()
|
||||||
OSMO_ASSERT(data[1] == 0);
|
OSMO_ASSERT(data[1] == 0);
|
||||||
|
|
||||||
/* Block 2 */
|
/* Block 2 */
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -904,7 +904,7 @@ static void test_rlc_unit_encoder()
|
||||||
OSMO_ASSERT(data[3] == 0);
|
OSMO_ASSERT(data[3] == 0);
|
||||||
|
|
||||||
/* Block 3 */
|
/* Block 3 */
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -944,7 +944,7 @@ static void test_rlc_unit_encoder()
|
||||||
cs = GprsCodingScheme::MCS2;
|
cs = GprsCodingScheme::MCS2;
|
||||||
|
|
||||||
/* Block 1 */
|
/* Block 1 */
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -968,7 +968,7 @@ static void test_rlc_unit_encoder()
|
||||||
cs = GprsCodingScheme::MCS2;
|
cs = GprsCodingScheme::MCS2;
|
||||||
|
|
||||||
/* Block 1 */
|
/* Block 1 */
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -993,7 +993,7 @@ static void test_rlc_unit_encoder()
|
||||||
cs = GprsCodingScheme::MCS2;
|
cs = GprsCodingScheme::MCS2;
|
||||||
|
|
||||||
/* Block 1 */
|
/* Block 1 */
|
||||||
gprs_rlc_data_block_info_init(&rdbi, cs);
|
gprs_rlc_data_block_info_init(&rdbi, cs, false);
|
||||||
num_chunks = 0;
|
num_chunks = 0;
|
||||||
write_offset = 0;
|
write_offset = 0;
|
||||||
memset(data, 0, sizeof(data));
|
memset(data, 0, sizeof(data));
|
||||||
|
@ -1045,7 +1045,7 @@ static void test_rlc_unaligned_copy()
|
||||||
block_idx++)
|
block_idx++)
|
||||||
{
|
{
|
||||||
struct gprs_rlc_data_info rlc;
|
struct gprs_rlc_data_info rlc;
|
||||||
gprs_rlc_data_info_init_dl(&rlc, cs);
|
gprs_rlc_data_info_init_dl(&rlc, cs, false);
|
||||||
|
|
||||||
memset(bits, pattern, sizeof(bits));
|
memset(bits, pattern, sizeof(bits));
|
||||||
Decoding::rlc_copy_to_aligned_buffer(
|
Decoding::rlc_copy_to_aligned_buffer(
|
||||||
|
@ -1089,12 +1089,12 @@ static void test_rlc_info_init()
|
||||||
struct gprs_rlc_data_info rlc;
|
struct gprs_rlc_data_info rlc;
|
||||||
|
|
||||||
printf("=== start %s ===\n", __func__);
|
printf("=== start %s ===\n", __func__);
|
||||||
gprs_rlc_data_info_init_dl(&rlc, GprsCodingScheme(GprsCodingScheme::CS1));
|
gprs_rlc_data_info_init_dl(&rlc, GprsCodingScheme(GprsCodingScheme::CS1), false);
|
||||||
OSMO_ASSERT(rlc.num_data_blocks == 1);
|
OSMO_ASSERT(rlc.num_data_blocks == 1);
|
||||||
OSMO_ASSERT(rlc.data_offs_bits[0] == 24);
|
OSMO_ASSERT(rlc.data_offs_bits[0] == 24);
|
||||||
OSMO_ASSERT(rlc.block_info[0].data_len == 20);
|
OSMO_ASSERT(rlc.block_info[0].data_len == 20);
|
||||||
|
|
||||||
gprs_rlc_data_info_init_dl(&rlc, GprsCodingScheme(GprsCodingScheme::MCS1));
|
gprs_rlc_data_info_init_dl(&rlc, GprsCodingScheme(GprsCodingScheme::MCS1), false);
|
||||||
OSMO_ASSERT(rlc.num_data_blocks == 1);
|
OSMO_ASSERT(rlc.num_data_blocks == 1);
|
||||||
OSMO_ASSERT(rlc.data_offs_bits[0] == 33);
|
OSMO_ASSERT(rlc.data_offs_bits[0] == 33);
|
||||||
OSMO_ASSERT(rlc.block_info[0].data_len == 22);
|
OSMO_ASSERT(rlc.block_info[0].data_len == 22);
|
||||||
|
|
Loading…
Reference in New Issue