diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2015-12-21 17:23:16 +0100 |
---|---|---|
committer | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2016-02-01 13:58:12 +0100 |
commit | 2b3121eebf1ec6cbcb25422d6a254d2b4fc15d18 (patch) | |
tree | ab08b06d00e4295857d81f9359b5949344d4f6b2 /src | |
parent | 2e3a81e4b3454ec5aa3b332215044008ed8014aa (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.cpp | 65 |
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) |