rlc: Add gprs_rlc_mcs_cps_decode

To access EGPRS data blocks, the optional padding must be taken into
account. Whether padding has been used must be dervied from the CPS
field in the header of the RLC EGPRS data message.

Add this function to decode the CPS value and extract that
information.

Sponsored-by: On-Waves ehf
This commit is contained in:
Jacob Erlbeck 2016-02-03 18:31:19 +01:00
parent b55f313735
commit fbd82e4e9f
2 changed files with 31 additions and 0 deletions

View File

@ -356,3 +356,32 @@ unsigned int gprs_rlc_mcs_cps(GprsCodingScheme cs, int punct, int punct2,
return -1;
}
void gprs_rlc_mcs_cps_decode(unsigned int cps,
GprsCodingScheme cs, int *punct, int *punct2, int *with_padding)
{
*punct2 = -1;
*with_padding = 0;
switch (GprsCodingScheme::Scheme(cs)) {
case GprsCodingScheme::MCS1:
cps -= 0b1011; *punct = cps % 2; break;
case GprsCodingScheme::MCS2:
cps -= 0b1001; *punct = cps % 2; break;
case GprsCodingScheme::MCS3:
cps -= 0b0011; *punct = cps % 3; *with_padding = cps >= 3; break;
case GprsCodingScheme::MCS4:
cps -= 0b0000; *punct = cps % 3; break;
case GprsCodingScheme::MCS5:
cps -= 0b100; *punct = cps % 2; break;
case GprsCodingScheme::MCS6:
cps -= 0b000; *punct = cps % 2; *with_padding = cps >= 2; break;
case GprsCodingScheme::MCS7:
cps -= 0b10100; *punct = cps / 3; *punct2 = cps % 3; break;
case GprsCodingScheme::MCS8:
cps -= 0b01011; *punct = cps / 3; *punct2 = cps % 3; break;
case GprsCodingScheme::MCS9:
cps -= 0b00000; *punct = cps / 4; *punct2 = cps % 3; break;
default: ;
}
}

View File

@ -109,6 +109,8 @@ void gprs_rlc_data_block_info_init(struct gprs_rlc_data_block_info *rdbi,
GprsCodingScheme cs, bool with_padding);
unsigned int gprs_rlc_mcs_cps(GprsCodingScheme cs, int punct, int punct2,
int with_padding);
void gprs_rlc_mcs_cps_decode(unsigned int cps, GprsCodingScheme cs,
int *punct, int *punct2, int *with_padding);
/*
* I hold the currently transferred blocks and will provide