aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2015-12-21 17:23:16 +0100
committerJacob Erlbeck <jerlbeck@sysmocom.de>2016-02-01 13:58:12 +0100
commit2b3121eebf1ec6cbcb25422d6a254d2b4fc15d18 (patch)
treeab08b06d00e4295857d81f9359b5949344d4f6b2 /src
parent2e3a81e4b3454ec5aa3b332215044008ed8014aa (diff)
edge: Support EGPRS uplink Ack/Nack messages
This commit adds EGPRS UL Ack/Nack encoding based on the CSN1 code. Note that the bitmap encoding is still broken and not easy to fix with the CSN1 framework, especially w.r.t. the length field. Therefore this implementation will be abandoned and replaced by a bitvec based one. Sponsored-by: On-Waves ehf
Diffstat (limited to 'src')
-rw-r--r--src/encoding.cpp65
1 files changed, 61 insertions, 4 deletions
diff --git a/src/encoding.cpp b/src/encoding.cpp
index b57117f4..d05177fb 100644
--- a/src/encoding.cpp
+++ b/src/encoding.cpp
@@ -431,6 +431,54 @@ static void write_packet_uplink_ack_gprs(struct gprs_rlcmac_bts *bts,
acknack_data->Exist_Power_Control_Parameters = 0x0;
}
+static void write_packet_uplink_ack_egprs(struct gprs_rlcmac_bts *bts,
+ PU_AckNack_EGPRS_00_t *acknack, struct gprs_rlcmac_ul_tbf *tbf,
+ int is_final)
+{
+ Common_Uplink_Ack_Nack_Data_t *acknack_data =
+ &acknack->Common_Uplink_Ack_Nack_Data;
+ char rbb[65];
+
+ int bow = 1;
+ int eow = 1;
+ int ssn = (tbf->m_window.v_q() + 1) & tbf->m_window.mod_sns();
+
+ tbf->m_window.update_rbb(rbb);
+
+ /* rbb is not NULL terminated */
+ rbb[64] = 0;
+ LOGP(DRLCMACUL, LOGL_DEBUG, "- V(N): \"%s\" R=Received "
+ "I=Invalid\n", rbb);
+
+ /* TODO: Use tbf->current_cs() when it supports EGPRS */
+ acknack->EGPRS_ChannelCodingCommand = 2; /* MCS-3 */
+ acknack->RESEGMENT = 0; /* NYI */
+ acknack->PRE_EMPTIVE_TRANSMISSION = 1; /* TODO: This resembles GPRS, change it? */
+ acknack->PRR_RETRANSMISSION_REQUEST = 0; /* TODO: Needs clarification */
+ acknack->ARAC_RETRANSMISSION_REQUEST = 0; /* TODO: Needs clarification */
+
+ acknack_data->Exist_CONTENTION_RESOLUTION_TLLI = 0x1;
+ acknack_data->CONTENTION_RESOLUTION_TLLI = tbf->tlli();
+
+ acknack->TBF_EST = 1; /* Enable RR on PACCH */
+
+ acknack_data->Exist_Packet_Timing_Advance = 0x0;
+ acknack->Exist_Packet_Extended_Timing_Advance = 0x0;
+ acknack_data->Exist_Power_Control_Parameters = 0x0;
+ acknack_data->Exist_Extension_Bits = 0x0;
+
+ acknack->EGPRS_AckNack.UnionType = 0;
+
+ acknack->EGPRS_AckNack.Desc.FINAL_ACK_INDICATION = is_final;
+ acknack->EGPRS_AckNack.Desc.BEGINNING_OF_WINDOW = eow;
+ acknack->EGPRS_AckNack.Desc.END_OF_WINDOW = bow;
+ acknack->EGPRS_AckNack.Desc.STARTING_SEQUENCE_NUMBER = ssn;
+ acknack->EGPRS_AckNack.Desc.Exist_CRBB = 0; /* TODO: Implement compressed bitmaps */
+ acknack->EGPRS_AckNack.Desc.URBB_LENGTH = 64;
+
+ Encoding::encode_rbb(rbb, acknack->EGPRS_AckNack.Desc.URBB);
+}
+
/* generate uplink ack */
void Encoding::write_packet_uplink_ack(struct gprs_rlcmac_bts *bts,
RlcMacDownlink_t * block, struct gprs_rlcmac_ul_tbf *tbf,
@@ -453,10 +501,19 @@ void Encoding::write_packet_uplink_ack(struct gprs_rlcmac_bts *bts,
acknack->PAGE_MODE = 0x0; // Normal Paging
acknack->UPLINK_TFI = tbf->tfi(); // Uplink TFI
- /* PU_AckNack_GPRS = on */
- acknack->UnionType = 0x0;
- write_packet_uplink_ack_gprs(bts,
- &acknack->u.PU_AckNack_GPRS_Struct, tbf, final);
+ if (tbf->is_egprs_enabled()) {
+ /* PU_AckNack_EGPRS = on */
+ acknack->UnionType = 0x1;
+ acknack->u.PU_AckNack_EGPRS_Struct.UnionType = 0x0;
+ write_packet_uplink_ack_egprs(bts,
+ &acknack->u.PU_AckNack_EGPRS_Struct.u.PU_AckNack_EGPRS_00,
+ tbf, final);
+ } else {
+ /* PU_AckNack_GPRS = on */
+ acknack->UnionType = 0x0;
+ write_packet_uplink_ack_gprs(bts,
+ &acknack->u.PU_AckNack_GPRS_Struct, tbf, final);
+ }
}
unsigned Encoding::write_packet_paging_request(bitvec * dest)