aboutsummaryrefslogtreecommitdiffstats
path: root/gsm_rlcmac.cpp
diff options
context:
space:
mode:
authorIvan Kluchnikov <kluchnikovi@gmail.com>2012-02-20 15:04:25 +0400
committerIvan Kluchnikov <kluchnikovi@gmail.com>2012-02-20 15:04:25 +0400
commit92ac6379aa0196cbb204c4b193deef2af6e77e53 (patch)
treeb9468d67baad3a9d98c5a87ab950eb9c14b3c5bb /gsm_rlcmac.cpp
parent5c2f9fbfa3e4391ab05279d9e710b1bcd46af3a8 (diff)
Added encoder for RLC/MAC downlink data control block.
Diffstat (limited to 'gsm_rlcmac.cpp')
-rw-r--r--gsm_rlcmac.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/gsm_rlcmac.cpp b/gsm_rlcmac.cpp
index f22ac325..32694fe3 100644
--- a/gsm_rlcmac.cpp
+++ b/gsm_rlcmac.cpp
@@ -5369,3 +5369,55 @@ void decode_gsm_rlcmac_uplink_data(BitVector * vector, RlcMacUplinkDataBlock_t *
return;
}
}
+
+void encode_gsm_rlcmac_downlink_data(BitVector * vector, RlcMacDownlinkDataBlock_t * data)
+{
+ size_t writeIndex = 0;
+
+ if (data->PAYLOAD_TYPE == PAYLOAD_TYPE_DATA)
+ {
+ // MAC header
+ vector->writeField(writeIndex, data->PAYLOAD_TYPE, 2);
+ vector->writeField(writeIndex, data->RRBP, 2);
+ vector->writeField(writeIndex, data->SP, 1);
+ vector->writeField(writeIndex, data->USF, 3);
+ LOG(INFO) << " PAYLOAD_TYPE = " << (unsigned)(data->PAYLOAD_TYPE);
+ LOG(INFO) << " RRBP = " << (unsigned)(data->RRBP);
+ LOG(INFO) << " SP = " << (unsigned)(data->SP);
+ LOG(INFO) << " USF = " << (unsigned)(data->USF);
+ // Octet 1
+ vector->writeField(writeIndex, data->PR, 2);
+ vector->writeField(writeIndex, data->TFI, 5);
+ vector->writeField(writeIndex, data->FBI, 1);
+ LOG(INFO) << " PR = " << (unsigned)(data->PR);
+ LOG(INFO) << " TFI = " << (unsigned)(data->TFI);
+ LOG(INFO) << " FBI = " << (unsigned)(data->FBI);
+ // Octet 2
+ vector->writeField(writeIndex, data->BSN, 7);
+ vector->writeField(writeIndex, data->E_1, 1);
+ LOG(INFO) << " BSN = " << (unsigned)(data->BSN);
+ LOG(INFO) << " E_1 = " << (unsigned)(data->E_1);
+ // Octet 3 (optional)
+ if(data->E_1 == 0)
+ {
+ unsigned i = 0;
+ do
+ {
+ vector->writeField(writeIndex, data->LENGTH_INDICATOR[i], 6);
+ vector->writeField(writeIndex, data->M[i], 1);
+ vector->writeField(writeIndex, data->E[i], 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));
+ }
+ unsigned dataNumOctets = 23 - writeIndex/8;
+ for (unsigned i = 0; i < dataNumOctets; i++)
+ {
+ vector->writeField(writeIndex, data->RLC_DATA[i], 8);
+ LOG(INFO) << " DATA[" << i << "] = " << (unsigned)(data->RLC_DATA[i]);
+ }
+ }
+}