aboutsummaryrefslogtreecommitdiffstats
path: root/gsm_rlcmac.cpp
diff options
context:
space:
mode:
authorIvan Kluchnikov <kluchnikovi@gmail.com>2012-02-05 01:41:25 +0400
committerIvan Kluchnikov <ivan@kluchnikov.(none)>2012-02-05 01:42:57 +0400
commitd5f0133eb289fe79f2680df2c7c7fda22aac7e76 (patch)
tree1d8520a7ec0886b677c751f945a54c2339dd31b8 /gsm_rlcmac.cpp
parent9c2c699435ddf9170f61ddca835491ef376dc462 (diff)
Added function for decoding GPRS RLC/MAC uplink data block.
Diffstat (limited to 'gsm_rlcmac.cpp')
-rw-r--r--gsm_rlcmac.cpp75
1 files changed, 75 insertions, 0 deletions
diff --git a/gsm_rlcmac.cpp b/gsm_rlcmac.cpp
index d3c6da8f..f22ac325 100644
--- a/gsm_rlcmac.cpp
+++ b/gsm_rlcmac.cpp
@@ -5294,3 +5294,78 @@ void encode_gsm_rlcmac_downlink(BitVector * vector, RlcMacDownlink_t * data)
break;
}
}
+
+void decode_gsm_rlcmac_uplink_data(BitVector * vector, RlcMacUplinkDataBlock_t * data)
+{
+ size_t readIndex = 0;
+ //unsigned dataLen = 0;
+ guint8 payload_type = vector->readField(readIndex, 2);
+ if (payload_type == PAYLOAD_TYPE_DATA)
+ {
+ readIndex = 0;
+ // MAC header
+ data->PAYLOAD_TYPE = vector->readField(readIndex, 2);
+ data->CV = vector->readField(readIndex, 4);
+ data->SI = vector->readField(readIndex, 1);
+ data->R = vector->readField(readIndex, 1);
+ LOG(INFO) << " PAYLOAD_TYPE = " << (unsigned)(data->PAYLOAD_TYPE);
+ LOG(INFO) << " CV = " << (unsigned)(data->CV);
+ LOG(INFO) << " SI = " << (unsigned)(data->SI);
+ LOG(INFO) << " R = " << (unsigned)(data->R);
+ // Octet 1
+ data->spare = vector->readField(readIndex, 1);
+ data->PI = vector->readField(readIndex, 1);
+ data->TFI = vector->readField(readIndex, 5);
+ data->TI = vector->readField(readIndex, 1);
+ LOG(INFO) << " spare = " << (unsigned)(data->spare);
+ LOG(INFO) << " PI = " << (unsigned)(data->PI);
+ LOG(INFO) << " TFI = " << (unsigned)(data->TFI);
+ LOG(INFO) << " TI = " << (unsigned)(data->TI);
+
+ // Octet 2
+ data->BSN = vector->readField(readIndex, 7);
+ data->E_1 = vector->readField(readIndex, 1);
+ LOG(INFO) << " BSN = " << (unsigned)(data->BSN);
+ LOG(INFO) << " E_1 = " << (unsigned)(data->E_1);
+
+ if(data->E_1 == 0) // Extension octet follows immediately
+ {
+ // Octet 3 (optional)
+ unsigned i = 0;
+ do
+ {
+ data->LENGTH_INDICATOR[i] = vector->readField(readIndex, 6);
+ data->M[i] = vector->readField(readIndex, 1);
+ data->E[i] = vector->readField(readIndex, 1);
+ LOG(INFO) << " LENGTH_INDICATOR[" << i << "] = " << (unsigned)(data->LENGTH_INDICATOR[i]);
+ LOG(INFO) << " M[" << i << "] = " << (unsigned)(data->M[i]);
+ LOG(INFO) << " E[" << i << "] = " << (unsigned)(data->E[i]);
+ i++;
+ } while((data->M[i-1] == 1)&&(data->E[i-1] == 0));
+ }
+ if(data->TI == 1) // TLLI field is present
+ {
+ data->TLLI = vector->readField(readIndex, 32);
+ LOG(INFO) << " TLLI = " << data->TLLI;
+ if (data->PI == 1) // PFI is present if TI field indicates presence of TLLI
+ {
+ data->PFI = vector->readField(readIndex, 7);
+ data->E_2 = vector->readField(readIndex, 1);
+ LOG(INFO) << " PFI = " << (unsigned)(data->PFI);
+ LOG(INFO) << " E_2 = " << (unsigned)(data->E_2);
+ }
+ }
+ unsigned dataLen = 23 - readIndex/8;
+ for (unsigned i = 0; i < dataLen; i++)
+ {
+ data->RLC_DATA[i] = vector->readField(readIndex, 8);
+ LOG(INFO) << " DATA[" << i << "] = " << (unsigned)(data->RLC_DATA[i]);
+ }
+ LOG(INFO) << "\n";
+ }
+ else
+ {
+ LOG(INFO) << "Payload Type: RESERVED (3)";
+ return;
+ }
+}