Modify DL tbf flow for ARQ-II in EGPRS DL Retx

Modify the DL TBF flow to support ARQ-II EGPRS DL retransmission

Change-Id: I7a845c98f2018795f0f62240f228411b0bc030c7
This commit is contained in:
Aravind Sirsikar 2016-07-13 18:46:17 +05:30 committed by Holger Freyther
parent e8ccafc63d
commit cf2152b24c
2 changed files with 43 additions and 17 deletions

View File

@ -355,13 +355,12 @@ int gprs_rlcmac_dl_tbf::take_next_bsn(uint32_t fn,
{
int bsn;
int data_len2, force_data_len = -1;
GprsCodingScheme cs2;
GprsCodingScheme force_cs;
bsn = m_window.resend_needed();
if (previous_bsn >= 0) {
force_cs = m_rlc.block(previous_bsn)->cs_last;
force_cs = m_rlc.block(previous_bsn)->cs_current_trans;
if (!force_cs.isEgprs())
return -1;
force_data_len = m_rlc.block(previous_bsn)->len;
@ -375,7 +374,28 @@ int gprs_rlcmac_dl_tbf::take_next_bsn(uint32_t fn,
m_window.mod_sns(bsn - previous_bsn) > RLC_EGPRS_MAX_BSN_DELTA)
return -1;
cs2 = m_rlc.block(bsn)->cs_last;
if (is_egprs_enabled()) {
m_rlc.block(bsn)->cs_current_trans =
GprsCodingScheme::get_retx_mcs(
m_rlc.block(bsn)->cs_last, ms()->current_cs_dl());
LOGP(DRLCMACDL, LOGL_DEBUG,
"- current_cs_dl(%d) demanded_mcs(%d) cs_trans(%d)\n",
m_rlc.block(bsn)->cs_last.to_num(),
ms()->current_cs_dl().to_num(),
m_rlc.block(bsn)->cs_current_trans.to_num());
/* TODO: Need to remove this check when MCS-8 -> MCS-6
* transistion is handled.
* Refer commit be881c028fc4da00c4046ecd9296727975c206a3
*/
if (m_rlc.block(bsn)->cs_last == GprsCodingScheme::MCS8)
m_rlc.block(bsn)->cs_current_trans =
GprsCodingScheme::MCS8;
} else
m_rlc.block(bsn)->cs_current_trans =
m_rlc.block(bsn)->cs_last;
data_len2 = m_rlc.block(bsn)->len;
if (force_data_len > 0 && force_data_len != data_len2)
return -1;
@ -398,13 +418,14 @@ int gprs_rlcmac_dl_tbf::take_next_bsn(uint32_t fn,
if (restart_bsn_cycle())
return take_next_bsn(fn, previous_bsn, may_combine);
} else if (have_data()) {
GprsCodingScheme new_cs;
/* New blocks may be send */
cs2 = force_cs ? force_cs : current_cs();
new_cs = force_cs ? force_cs : current_cs();
LOGP(DRLCMACDL, LOGL_DEBUG,
"- Sending new block at BSN %d, CS=%s\n",
m_window.v_s(), cs2.name());
m_window.v_s(), new_cs.name());
bsn = create_new_bsn(fn, cs2);
bsn = create_new_bsn(fn, new_cs);
} else if (!m_window.window_empty()) {
LOGP(DRLCMACDL, LOGL_DEBUG, "- Restarting at BSN %d, "
"because all blocks have been transmitted (FLOW).\n",
@ -418,7 +439,7 @@ int gprs_rlcmac_dl_tbf::take_next_bsn(uint32_t fn,
"- Sending new dummy block at BSN %d, CS=%s\n",
m_window.v_s(), current_cs().name());
bsn = create_new_bsn(fn, current_cs());
/* Don't send a second block, so don't set cs2 */
/* Don't send a second block, so don't set cs_current_trans */
}
if (bsn < 0) {
@ -429,7 +450,7 @@ int gprs_rlcmac_dl_tbf::take_next_bsn(uint32_t fn,
bts->rlc_resent();
}
*may_combine = cs2.numDataBlocks() > 1;
*may_combine = m_rlc.block(bsn)->cs_current_trans.numDataBlocks() > 1;
return bsn;
}
@ -501,6 +522,7 @@ int gprs_rlcmac_dl_tbf::create_new_bsn(const uint32_t fn, GprsCodingScheme cs)
rlc_data = m_rlc.block(bsn);
data = rlc_data->prepare(block_data_len);
rlc_data->cs_last = cs;
rlc_data->cs_current_trans = cs;
rlc_data->len = block_data_len;
rdbi = &(rlc_data->block_info);
@ -590,7 +612,6 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
bool is_final = false;
gprs_rlc_data_info rlc;
GprsCodingScheme cs;
GprsCodingScheme cs_current_trans;
int bsns[ARRAY_SIZE(rlc.block_info)];
unsigned num_bsns;
enum egprs_puncturing_values punct[ARRAY_SIZE(rlc.block_info)];
@ -604,7 +625,7 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
* be put into the data area, even if the resulting CS is higher than
* the current limit.
*/
cs = m_rlc.block(index)->cs_last;
cs = m_rlc.block(index)->cs_current_trans;
bsns[0] = index;
num_bsns = 1;
@ -616,6 +637,11 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
if (num_bsns == 1) {
/* TODO: remove the conditional when MCS-6 padding isn't
* failing to be decoded by MEs anymore */
/* TODO: support of MCS-8 -> MCS-6 transition should be
* handled
* Refer commit be881c028fc4da00c4046ecd9296727975c206a3
* dated 2016-02-07 23:45:40 (UTC)
*/
if (cs != GprsCodingScheme(GprsCodingScheme::MCS8))
cs.decToSingleBlock(&need_padding);
}
@ -650,18 +676,14 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
else
bsn = bsns[0];
cs_enc = m_rlc.block(bsn)->cs_last;
cs_enc = m_rlc.block(bsn)->cs_current_trans;
/* get data and header from current block */
block_data = m_rlc.block(bsn)->block;
/* TODO: Need to support MCS change during retx */
cs_current_trans = cs;
/* Get current puncturing scheme from block */
punct_scheme = gprs_get_punct_scheme(
m_rlc.block(bsn)->next_ps,
cs, cs_current_trans);
m_rlc.block(bsn)->cs_last, cs);
if (cs.isEgprs()) {
OSMO_ASSERT(punct_scheme >= EGPRS_PS_1);
@ -685,8 +707,9 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
* in header type 1
*/
gprs_update_punct_scheme(&m_rlc.block(bsn)->next_ps,
cs_current_trans);
cs);
m_rlc.block(bsn)->cs_last = cs;
rdbi->e = block_info->e;
rdbi->cv = block_info->cv;
rdbi->bsn = bsn;

View File

@ -4746,6 +4746,7 @@ TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) append
Received RTS for PDCH: TRX=0 TS=4 FN=8 block_nr=2 scheduling free USF for polling at FN=13 of TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)
Scheduling data message at RTS for DL TFI=0 (TRX=0, TS=4) prio=3
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink (V(A)==0 .. V(S)==1)
- current_cs_dl(5) demanded_mcs(7) cs_trans(7)
- Resending BSN 0
- Sending new block at BSN 1, CS=MCS-7
- Dequeue next LLC for TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) (len=512)
@ -4895,6 +4896,7 @@ TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) append
Received RTS for PDCH: TRX=0 TS=4 FN=8 block_nr=2 scheduling free USF for polling at FN=13 of TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)
Scheduling data message at RTS for DL TFI=0 (TRX=0, TS=4) prio=3
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink (V(A)==0 .. V(S)==1)
- current_cs_dl(8) demanded_mcs(8) cs_trans(8)
- Resending BSN 0
- Sending new block at BSN 1, CS=MCS-8
- Dequeue next LLC for TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) (len=512)
@ -5030,6 +5032,7 @@ TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) append
Received RTS for PDCH: TRX=0 TS=4 FN=8 block_nr=2 scheduling free USF for polling at FN=13 of TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS)
Scheduling data message at RTS for DL TFI=0 (TRX=0, TS=4) prio=3
TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) downlink (V(A)==0 .. V(S)==1)
- current_cs_dl(6) demanded_mcs(9) cs_trans(9)
- Resending BSN 0
- Sending new block at BSN 1, CS=MCS-9
- Dequeue next LLC for TBF(TFI=0 TLLI=0xffeeddcc DIR=DL STATE=FLOW EGPRS) (len=512)