mirror of
https://github.com/brmlab/osmo-tetra.git
synced 2025-06-08 09:54:09 +02:00
fix parsing of slot granting in RESOURCE MAC PDU
This commit is contained in:
parent
5c14298646
commit
8c2db3d630
2 changed files with 46 additions and 7 deletions
|
@ -116,6 +116,30 @@ static int decode_chan_alloc(struct tetra_chan_alloc_decoded *cad, const uint8_t
|
||||||
return cur - bits;
|
return cur - bits;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* According to table 21.90 */
|
||||||
|
static int decode_nr_slots(uint8_t in)
|
||||||
|
{
|
||||||
|
const uint8_t dec_tbl[] = {
|
||||||
|
[0x0] = 0, /* first sub-slot */
|
||||||
|
[0x1] = 1,
|
||||||
|
[0x2] = 2,
|
||||||
|
[0x3] = 3,
|
||||||
|
[0x4] = 4,
|
||||||
|
[0x5] = 5,
|
||||||
|
[0x6] = 6,
|
||||||
|
[0x7] = 8,
|
||||||
|
[0x8] = 10,
|
||||||
|
[0x9] = 13,
|
||||||
|
[0xa] = 17,
|
||||||
|
[0xb] = 24,
|
||||||
|
[0xc] = 34,
|
||||||
|
[0xd] = 51,
|
||||||
|
[0xe] = 68,
|
||||||
|
[0xf] = 0xff /* second sub-slot */
|
||||||
|
};
|
||||||
|
return dec_tbl[in & 0xf];
|
||||||
|
}
|
||||||
|
|
||||||
/* Section 21.4.3.1 MAC-RESOURCE */
|
/* Section 21.4.3.1 MAC-RESOURCE */
|
||||||
int macpdu_decode_resource(struct tetra_resrc_decoded *rsd, const uint8_t *bits)
|
int macpdu_decode_resource(struct tetra_resrc_decoded *rsd, const uint8_t *bits)
|
||||||
{
|
{
|
||||||
|
@ -128,6 +152,7 @@ int macpdu_decode_resource(struct tetra_resrc_decoded *rsd, const uint8_t *bits)
|
||||||
rsd->addr.type = bits_to_uint(cur, 3); cur += 3;
|
rsd->addr.type = bits_to_uint(cur, 3); cur += 3;
|
||||||
switch (rsd->addr.type) {
|
switch (rsd->addr.type) {
|
||||||
case ADDR_TYPE_NULL:
|
case ADDR_TYPE_NULL:
|
||||||
|
return 0;
|
||||||
break;
|
break;
|
||||||
case ADDR_TYPE_SSI:
|
case ADDR_TYPE_SSI:
|
||||||
case ADDR_TYPE_USSI:
|
case ADDR_TYPE_USSI:
|
||||||
|
@ -148,16 +173,26 @@ int macpdu_decode_resource(struct tetra_resrc_decoded *rsd, const uint8_t *bits)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
cur += addr_len_by_type[rsd->addr.type];
|
cur += addr_len_by_type[rsd->addr.type];
|
||||||
/* no intermediate mapping in pi/4 */
|
/* no intermediate napping in pi/4 */
|
||||||
rsd->power_control_pres = *cur++;
|
rsd->power_control_pres = *cur++;
|
||||||
if (rsd->power_control_pres)
|
if (rsd->power_control_pres)
|
||||||
cur += 4;
|
cur += 4;
|
||||||
rsd->slot_granting_pres = *cur++;
|
rsd->slot_granting.pres = *cur++;
|
||||||
if (rsd->slot_granting_pres) {
|
if (rsd->slot_granting.pres) {
|
||||||
if (*cur++)
|
#if 0
|
||||||
|
/* check for multiple slot granting flag (can only exist in QAM) */
|
||||||
|
if (*cur++) {
|
||||||
cur += 0; //FIXME;
|
cur += 0; //FIXME;
|
||||||
else
|
} else {
|
||||||
cur += 8;
|
#endif
|
||||||
|
rsd->slot_granting.nr_slots =
|
||||||
|
decode_nr_slots(bits_to_uint(cur, 4));
|
||||||
|
cur += 4;
|
||||||
|
rsd->slot_granting.delay = bits_to_uint(cur, 4);
|
||||||
|
cur += 4;
|
||||||
|
#if 0
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
rsd->chan_alloc_pres = *cur++;
|
rsd->chan_alloc_pres = *cur++;
|
||||||
/* FIXME: If encryption is enabled, Channel Allocation is encrypted !!! */
|
/* FIXME: If encryption is enabled, Channel Allocation is encrypted !!! */
|
||||||
|
|
|
@ -207,7 +207,11 @@ struct tetra_resrc_decoded {
|
||||||
|
|
||||||
uint8_t power_control_pres;
|
uint8_t power_control_pres;
|
||||||
|
|
||||||
uint8_t slot_granting_pres;
|
struct {
|
||||||
|
uint8_t nr_slots;
|
||||||
|
uint8_t delay;
|
||||||
|
uint8_t pres;
|
||||||
|
} slot_granting;
|
||||||
|
|
||||||
uint8_t chan_alloc_pres;
|
uint8_t chan_alloc_pres;
|
||||||
struct tetra_chan_alloc_decoded cad;
|
struct tetra_chan_alloc_decoded cad;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue