aboutsummaryrefslogtreecommitdiffstats
path: root/src/encoding.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/encoding.cpp')
-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)