tbf/bts, encoding: Keep track of WAIT_RELEASE state for DL assignment
The current code does not properly distinguish between DL assignments to reuse a tbf (after it was put in state WAIT_RELEASE) and DL assignments for an active tbf to change the allocation of the PDCH timeslots. This patch introduces a new variable was_releasing which remembers if trigger_dl_ass() was called with a tbf in state WAIT_RELEASE. In that case we have to set the CONTROL_ACK field in the download assignment. This should allow us to send DL assignments to change PDCH TS allocation of a tbf before we enter FLOW state.
This commit is contained in:
parent
fc03bbe078
commit
73191a443f
|
@ -474,6 +474,7 @@ void BTS::trigger_dl_ass(
|
|||
old_tbf->dl_ass_state = GPRS_RLCMAC_DL_ASS_SEND_ASS;
|
||||
/* use TA from old TBF */
|
||||
tbf->ta = old_tbf->ta;
|
||||
tbf->was_releasing = tbf->state_is(GPRS_RLCMAC_WAIT_RELEASE);
|
||||
/* change state */
|
||||
tbf_new_state(tbf, GPRS_RLCMAC_ASSIGN);
|
||||
tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_PACCH);
|
||||
|
@ -485,6 +486,7 @@ void BTS::trigger_dl_ass(
|
|||
LOGP(DRLCMAC, LOGL_ERROR, "No valid IMSI!\n");
|
||||
return;
|
||||
}
|
||||
tbf->was_releasing = tbf->state_is(GPRS_RLCMAC_WAIT_RELEASE);
|
||||
/* change state */
|
||||
tbf_new_state(tbf, GPRS_RLCMAC_ASSIGN);
|
||||
tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_CCCH);
|
||||
|
|
|
@ -267,7 +267,7 @@ void Encoding::write_packet_downlink_assignment(RlcMacDownlink_t * block, uint8_
|
|||
|
||||
block->u.Packet_Downlink_Assignment.MAC_MODE = 0x0; // Dynamic Allocation
|
||||
block->u.Packet_Downlink_Assignment.RLC_MODE = 0x0; // RLC acknowledged mode
|
||||
block->u.Packet_Downlink_Assignment.CONTROL_ACK = old_downlink; // NW establishes no new DL TBF for the MS with running timer T3192
|
||||
block->u.Packet_Downlink_Assignment.CONTROL_ACK = tbf->was_releasing; // NW establishes no new DL TBF for the MS with running timer T3192
|
||||
block->u.Packet_Downlink_Assignment.TIMESLOT_ALLOCATION = 0; // timeslot(s)
|
||||
for (tn = 0; tn < 8; tn++) {
|
||||
if (tbf->pdch[tn])
|
||||
|
|
|
@ -1405,6 +1405,8 @@ int gprs_rlcmac_tbf::maybe_start_new_window()
|
|||
/* report all outstanding packets as received */
|
||||
gprs_rlcmac_received_lost(this, received, 0);
|
||||
|
||||
tbf_new_state(this, GPRS_RLCMAC_WAIT_RELEASE);
|
||||
|
||||
/* check for LLC PDU in the LLC Queue */
|
||||
msg = llc_dequeue(gprs_bssgp_pcu_current_bctx());
|
||||
if (!msg) {
|
||||
|
@ -1414,7 +1416,6 @@ int gprs_rlcmac_tbf::maybe_start_new_window()
|
|||
tbf_timer_start(this, 3193,
|
||||
bts_data()->t3193_msec / 1000,
|
||||
(bts_data()->t3193_msec % 1000) * 1000);
|
||||
tbf_new_state(this, GPRS_RLCMAC_WAIT_RELEASE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -217,6 +217,10 @@ struct gprs_rlcmac_tbf {
|
|||
* stops to iterate over all tbf in its current form */
|
||||
enum gprs_rlcmac_tbf_state state;
|
||||
|
||||
/* Remember if the tbf was in wait_release state when we want to
|
||||
* schedule a new dl assignment */
|
||||
uint8_t was_releasing;
|
||||
|
||||
/* store the BTS this TBF belongs to */
|
||||
BTS *bts;
|
||||
|
||||
|
|
Loading…
Reference in New Issue