From b56c00197d8dfaaeaee96b8817a15e3fd4b0e085 Mon Sep 17 00:00:00 2001 From: Neels Hofmeyr Date: Tue, 27 Feb 2018 22:40:07 +0100 Subject: Revert "Rewrite Packet Uplink Assignment" This reverts commit 93d947f5e8a30acc9250c124bf9d5bb6a8863526, I44db2eeea7448ff67e688ae716487bc6dbfc96a3. Commit I52ec9b07413daabba8cd5f1fba5c7b3af6a33389 / 896574e92bea09ed8d39688b6fdf504e84521746 was found (empirically) to be a regression, rendering GPRS service fatally unreliable. This reverted commit seems to follow after the regression and is reverted along with it. Related: OS#3013 Change-Id: If7038127e9a663c93006475b3add961adc0b1922 --- src/encoding.cpp | 96 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/src/encoding.cpp b/src/encoding.cpp index e96894f2..279bbfe8 100644 --- a/src/encoding.cpp +++ b/src/encoding.cpp @@ -230,51 +230,50 @@ static inline int write_ia_rest_downlink(const gprs_rlcmac_dl_tbf *tbf, bitvec * return 0; } -/* 3GPP TS 44.018 ยง10.5.2.16 IA Rest Octets ::= Packet Uplink Assignment */ -static inline int write_ia_rest_uplink(const gprs_rlcmac_ul_tbf *tbf, bitvec * dest, - uint8_t usf, uint32_t fn, uint8_t alpha, uint8_t gamma, int8_t ta_idx) +static int write_ia_rest_uplink( + gprs_rlcmac_ul_tbf *tbf, + bitvec * dest, unsigned& wp, + uint8_t usf, uint32_t fn, + uint8_t alpha, uint8_t gamma, int8_t ta_idx) { - int rc; - - set_H(dest); set_H(dest); - set_0(dest); set_0(dest); /* 00 Packet Uplink Assignment */ - - if (tbf) { - set_1(dest); /* Multi Block Allocation */ - - rc = write_tfi_usf(dest, tbf, usf); - check(rc); - - /* 3GPP TS 44.060 Table 11.2.28.2 Channel Coding Indicator */ - rc = bitvec_set_u64(dest, tbf->current_cs().to_num() - 1, 2, false); /* CHANNEL_CODING_COMMAND */ - check(rc); - - rc = bitvec_set_bit(dest, (bit_value)tbf->tlli()); /* TLLI_BLOCK_CHANNEL_CODING */ - check(rc); - - rc = write_alpha_gamma(dest, alpha, gamma); - check(rc); - - set_0(dest); /* No TIMING_ADVANCE_INDEX */ - set_0(dest); /* No TBF_STARTING_TIME */ + OSMO_ASSERT(!tbf || !tbf->is_egprs_enabled()); + + // GMS 04.08 10.5.2.37b 10.5.2.16 + bitvec_write_field(dest, &wp, 3, 2); // "HH" + bitvec_write_field(dest, &wp, 0, 2); // "0" Packet Uplink Assignment + if (tbf == NULL) { + bitvec_write_field(dest, &wp, 0, 1); // Block Allocation : Single Block Allocation + if (alpha) { + bitvec_write_field(dest, &wp,0x1,1); // ALPHA = present + bitvec_write_field(dest, &wp,alpha,4); // ALPHA = present + } else + bitvec_write_field(dest, &wp,0x0,1); // ALPHA = not present + bitvec_write_field(dest, &wp,gamma,5); // GAMMA power control parameter + write_tai(dest, wp, ta_idx); + bitvec_write_field(dest, &wp, 1, 1); // TBF_STARTING_TIME_FLAG + bitvec_write_field(dest, &wp,(fn / (26 * 51)) % 32,5); // T1' + bitvec_write_field(dest, &wp,fn % 51,6); // T3 + bitvec_write_field(dest, &wp,fn % 26,5); // T2 } else { - set_0(dest); /* Single Block Allocation */ - rc = write_alpha_gamma(dest, alpha, gamma); - check(rc); - - /* A 'Timing Advance index' shall not be allocated at a Single Block allocation. - A 'TBF Starting Time' shall be allocated at a Single Block allocation. */ - set_0(dest); - set_1(dest); - - rc = write_tbf_start_time(dest, fn); /* TBF_STARTING_TIME */ - check(rc); - - set_L(dest); /* No P0 nor PR_MODE */ - set_L(dest); /* No Additions for R99 */ - set_L(dest); /* No Additions for Rel-6 */ + bitvec_write_field(dest, &wp, 1, 1); // Block Allocation : Not Single Block Allocation + bitvec_write_field(dest, &wp, tbf->tfi(), 5); // TFI_ASSIGNMENT Temporary Flow Identity + bitvec_write_field(dest, &wp, 0, 1); // POLLING + bitvec_write_field(dest, &wp, 0, 1); // ALLOCATION_TYPE: dynamic + bitvec_write_field(dest, &wp, usf, 3); // USF + bitvec_write_field(dest, &wp, 0, 1); // USF_GRANULARITY + bitvec_write_field(dest, &wp, 0, 1); // "0" power control: Not Present + bitvec_write_field(dest, &wp, tbf->current_cs().to_num()-1, 2); // CHANNEL_CODING_COMMAND + bitvec_write_field(dest, &wp, 1, 1); // TLLI_BLOCK_CHANNEL_CODING + if (alpha) { + bitvec_write_field(dest, &wp,0x1,1); // ALPHA = present + bitvec_write_field(dest, &wp,alpha,4); // ALPHA + } else + bitvec_write_field(dest, &wp,0x0,1); // ALPHA = not present + bitvec_write_field(dest, &wp,gamma,5); // GAMMA power control parameter + /* note: there is no choise for TAI and no starting time */ + bitvec_write_field(dest, &wp, 0, 1); // switch TIMING_ADVANCE_INDEX = off + bitvec_write_field(dest, &wp, 0, 1); // TBF_STARTING_TIME_FLAG } - return 0; } @@ -482,21 +481,22 @@ int Encoding::write_immediate_assignment( plen = wp / 8; - dest->cur_bit = wp; if (downlink) { if (!as_dl_tbf(tbf)) { LOGP(DRLCMACDL, LOGL_ERROR, "Cannot encode DL IMMEDIATE ASSIGNMENT without TBF\n"); return -EINVAL; } + dest->cur_bit = wp; rc = write_ia_rest_downlink(as_dl_tbf(tbf), dest, polling, gsm48_ta_is_valid(ta), fn, alpha, gamma, ta_idx); } else if (((burst_type == GSM_L1_BURST_TYPE_ACCESS_1) || - (burst_type == GSM_L1_BURST_TYPE_ACCESS_2))) + (burst_type == GSM_L1_BURST_TYPE_ACCESS_2))) { + dest->cur_bit = wp; rc = write_ia_rest_egprs_uplink(as_ul_tbf(tbf), dest, usf, fn, alpha, gamma, ta_idx, burst_type, ra); - else { - OSMO_ASSERT(!as_ul_tbf(tbf) || !as_ul_tbf(tbf)->is_egprs_enabled()); - rc = write_ia_rest_uplink(as_ul_tbf(tbf), dest, usf, fn, alpha, gamma, ta_idx); - } + } else + rc = write_ia_rest_uplink(as_ul_tbf(tbf), dest, wp, + usf, fn, + alpha, gamma, ta_idx); if (rc < 0) { LOGP(DRLCMAC, LOGL_ERROR, -- cgit v1.2.3