From 2b3121eebf1ec6cbcb25422d6a254d2b4fc15d18 Mon Sep 17 00:00:00 2001 From: Jacob Erlbeck Date: Mon, 21 Dec 2015 17:23:16 +0100 Subject: [PATCH] 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 --- src/encoding.cpp | 65 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file 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)