Revert "Rewrite Packet Uplink Assignment"
This reverts commit93d947f5e8
, I44db2eeea7448ff67e688ae716487bc6dbfc96a3. Commit I52ec9b07413daabba8cd5f1fba5c7b3af6a33389 /896574e92b
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
This commit is contained in:
parent
89b85e078e
commit
782da2cf95
|
@ -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;
|
||||
OSMO_ASSERT(!tbf || !tbf->is_egprs_enabled());
|
||||
|
||||
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 */
|
||||
// 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,
|
||||
|
|
Loading…
Reference in New Issue