aboutsummaryrefslogtreecommitdiffstats
path: root/src/tbf_dl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tbf_dl.cpp')
-rw-r--r--src/tbf_dl.cpp191
1 files changed, 87 insertions, 104 deletions
diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp
index 5a42aa0d..9a0bf78c 100644
--- a/src/tbf_dl.cpp
+++ b/src/tbf_dl.cpp
@@ -147,7 +147,7 @@ static int tbf_new_dl_assignment(struct gprs_rlcmac_bts *bts,
dl_tbf = tbf_alloc_dl_tbf(bts, ms, use_trx, ms_class, egprs_ms_class, ss);
if (!dl_tbf) {
- LOGP(DRLCMAC, LOGL_NOTICE, "No PDCH resource\n");
+ LOGP(DTBF, LOGL_NOTICE, "No PDCH resource\n");
return -EBUSY;
}
dl_tbf->update_ms(tlli, GPRS_RLCMAC_DL_TBF);
@@ -197,19 +197,16 @@ int gprs_rlcmac_dl_tbf::handle(struct gprs_rlcmac_bts *bts,
if (ms_old && ms_old != ms) {
/* The TLLI has changed (RAU), so there are two MS
* objects for the same MS */
- LOGP(DRLCMAC, LOGL_NOTICE,
- "There is a new MS object for the same MS: "
- "(0x%08x, '%s') -> (0x%08x, '%s')\n",
- ms_old->tlli(), ms_old->imsi(),
- ms->tlli(), ms->imsi());
+ LOGP(DTBF, LOGL_NOTICE,
+ "There is a new MS object for the same MS: (0x%08x, '%s') -> (0x%08x, '%s')\n",
+ ms_old->tlli(), ms_old->imsi(), ms->tlli(), ms->imsi());
GprsMs::Guard guard_old(ms_old);
if (!dl_tbf && ms_old->dl_tbf()) {
- LOGP(DRLCMAC, LOGL_NOTICE,
- "%s IMSI %s: "
- "moving DL TBF to new MS object\n",
- ms_old->dl_tbf()->name(), imsi);
+ LOGP(DTBF, LOGL_NOTICE,
+ "IMSI %s, old TBF %s: moving DL TBF to new MS object\n",
+ imsi, ms_old->dl_tbf()->name());
dl_tbf = ms_old->dl_tbf();
/* Move the DL TBF to the new MS */
dl_tbf->set_ms(ms);
@@ -326,7 +323,7 @@ bool gprs_rlcmac_dl_tbf::restart_bsn_cycle()
* should never happen if MS works correctly.
*/
if (m_window.window_empty()) {
- LOGP(DRLCMACDL, LOGL_DEBUG, "- MS acked all blocks\n");
+ LOGPTBFDL(this, LOGL_DEBUG, "MS acked all blocks\n");
return false;
}
@@ -336,9 +333,8 @@ bool gprs_rlcmac_dl_tbf::restart_bsn_cycle()
/* At this point there should be at least one unacked block
* to be resent. If not, this is an software error. */
if (resend == 0) {
- LOGP(DRLCMACDL, LOGL_ERROR, "Software error: "
- "There are no unacknowledged blocks, but V(A) "
- " != V(S). PLEASE FIX!\n");
+ LOGPTBFDL(this, LOGL_ERROR,
+ "FIXME: Software error: There are no unacknowledged blocks, but V(A) != V(S). PLEASE FIX!\n");
return false;
}
@@ -377,15 +373,13 @@ int gprs_rlcmac_dl_tbf::take_next_bsn(uint32_t fn,
ms()->current_cs_dl(),
bts->bts_data()->dl_arq_type);
- LOGP(DRLCMACDL, LOGL_DEBUG,
- "- initial_cs_dl(%d) last_mcs(%d)"
- " demanded_mcs(%d) cs_trans(%d)"
- " arq_type(%d) bsn(%d)\n",
- m_rlc.block(bsn)->cs_init.to_num(),
- m_rlc.block(bsn)->cs_last.to_num(),
- ms()->current_cs_dl().to_num(),
- m_rlc.block(bsn)->cs_current_trans.to_num(),
- bts->bts_data()->dl_arq_type, bsn);
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "initial_cs_dl(%d) last_mcs(%d) demanded_mcs(%d) cs_trans(%d) arq_type(%d) bsn(%d)\n",
+ m_rlc.block(bsn)->cs_init.to_num(),
+ m_rlc.block(bsn)->cs_last.to_num(),
+ ms()->current_cs_dl().to_num(),
+ m_rlc.block(bsn)->cs_current_trans.to_num(),
+ bts->bts_data()->dl_arq_type, bsn);
/* TODO: Need to remove this check when MCS-8 -> MCS-6
* transistion is handled.
@@ -401,21 +395,21 @@ int gprs_rlcmac_dl_tbf::take_next_bsn(uint32_t fn,
data_len2 = m_rlc.block(bsn)->len;
if (force_data_len > 0 && force_data_len != data_len2)
return -1;
- LOGP(DRLCMACDL, LOGL_DEBUG, "- Resending BSN %d\n", bsn);
+ LOGPTBFDL(this, LOGL_DEBUG, "Resending BSN %d\n", bsn);
/* re-send block with negative aknowlegement */
m_window.m_v_b.mark_unacked(bsn);
bts->rlc_resent();
} else if (state_is(GPRS_RLCMAC_FINISHED)) {
- LOGP(DRLCMACDL, LOGL_DEBUG, "- Restarting at BSN %d, "
- "because all blocks have been transmitted.\n",
- m_window.v_a());
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "Restarting at BSN %d, because all blocks have been transmitted.\n",
+ m_window.v_a());
bts->rlc_restarted();
if (restart_bsn_cycle())
return take_next_bsn(fn, previous_bsn, may_combine);
} else if (dl_window_stalled()) {
- LOGP(DRLCMACDL, LOGL_NOTICE, "- Restarting at BSN %d, "
- "because the window is stalled.\n",
- m_window.v_a());
+ LOGPTBFDL(this, LOGL_NOTICE,
+ "Restarting at BSN %d, because the window is stalled.\n",
+ m_window.v_a());
bts->rlc_stalled();
if (restart_bsn_cycle())
return take_next_bsn(fn, previous_bsn, may_combine);
@@ -423,31 +417,31 @@ int gprs_rlcmac_dl_tbf::take_next_bsn(uint32_t fn,
GprsCodingScheme new_cs;
/* New blocks may be send */
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(), new_cs.name());
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "Sending new block at BSN %d, CS=%s\n",
+ m_window.v_s(), new_cs.name());
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",
- m_window.v_a());
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "Restarting at BSN %d, because all blocks have been transmitted (FLOW).\n",
+ m_window.v_a());
bts->rlc_restarted();
if (restart_bsn_cycle())
return take_next_bsn(fn, previous_bsn, may_combine);
} else {
/* Nothing left to send, create dummy LLC commands */
- LOGP(DRLCMACDL, LOGL_DEBUG,
- "- Sending new dummy block at BSN %d, CS=%s\n",
- m_window.v_s(), current_cs().name());
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "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 cs_current_trans */
}
if (bsn < 0) {
/* we just send final block again */
- LOGP(DRLCMACDL, LOGL_DEBUG,
- "- Nothing else to send, Re-transmit final block!\n");
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "Nothing else to send, Re-transmit final block!\n");
bsn = m_window.v_s_mod(-1);
bts->rlc_final_block_resent();
bts->rlc_resent();
@@ -589,11 +583,9 @@ int gprs_rlcmac_dl_tbf::create_new_bsn(const uint32_t fn, GprsCodingScheme cs)
* arrive, so request a DL ack/nack now */
request_dl_ack();
- LOGP(DRLCMACDL, LOGL_DEBUG,
- "-- Empty chunk, "
- "added LLC dummy command of size %d, "
- "drained_since=%d\n",
- m_llc.frame_length(), frames_since_last_drain(fn));
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "Empty chunk, added LLC dummy command of size %d, drained_since=%d\n",
+ m_llc.frame_length(), frames_since_last_drain(fn));
}
is_final = llc_queue_size() == 0 && !keep_open(fn);
@@ -621,9 +613,9 @@ int gprs_rlcmac_dl_tbf::create_new_bsn(const uint32_t fn, GprsCodingScheme cs)
schedule_next_frame();
} while (ar == Encoding::AR_COMPLETED_SPACE_LEFT);
- LOGP(DRLCMACDL, LOGL_DEBUG, "data block (BSN %d, %s): %s\n",
- bsn, rlc_data->cs_last.name(),
- osmo_hexdump(rlc_data->block, block_data_len));
+ LOGPTBFDL(this, LOGL_DEBUG, "data block (BSN %d, %s): %s\n",
+ bsn, rlc_data->cs_last.name(),
+ osmo_hexdump(rlc_data->block, block_data_len));
/* raise send state and set ack state array */
m_window.m_v_b.mark_unacked(bsn);
m_window.increment_send();
@@ -719,10 +711,8 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
spb = get_egprs_dl_spb(index);
- LOGP(DRLCMACDL, LOGL_DEBUG, "- need_padding %d spb_status %d spb %d"
- "(BSN1 %d BSN2 %d)\n",
- need_padding,
- spb_status, spb, index, index2);
+ LOGPTBFDL(this, LOGL_DEBUG, "need_padding %d spb_status %d spb %d (BSN1 %d BSN2 %d)\n",
+ need_padding, spb_status, spb, index, index2);
gprs_rlc_data_info_init_dl(&rlc, cs, need_padding, spb);
@@ -741,7 +731,7 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
OSMO_ASSERT(rlc.num_data_blocks <= ARRAY_SIZE(rlc.block_info));
OSMO_ASSERT(rlc.num_data_blocks > 0);
- LOGP(DRLCMACDL, LOGL_DEBUG, "- Copying %u RLC blocks, %u BSNs\n", rlc.num_data_blocks, num_bsns);
+ LOGPTBFDL(this, LOGL_DEBUG, "Copying %u RLC blocks, %u BSNs\n", rlc.num_data_blocks, num_bsns);
/* Copy block(s) to RLC message: the num_data_blocks cannot be more than 2 - see assert above */
for (data_block_idx = 0; data_block_idx < OSMO_MIN(rlc.num_data_blocks, 2);
@@ -803,8 +793,8 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
rdbi->bsn = bsn;
is_final = is_final || rdbi->cv == 0;
- LOGP(DRLCMACDL, LOGL_DEBUG, "- Copying data unit %d (BSN %d)\n",
- data_block_idx, bsn);
+ LOGPTBFDL(this, LOGL_DEBUG, "Copying data unit %d (BSN %d)\n",
+ data_block_idx, bsn);
Encoding::rlc_copy_from_aligned_buffer(&rlc, data_block_idx,
msg_data, block_data);
@@ -826,15 +816,15 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
if (m_tx_counter >= POLL_ACK_AFTER_FRAMES || m_dl_ack_requested ||
need_poll) {
if (m_dl_ack_requested) {
- LOGP(DRLCMACDL, LOGL_DEBUG, "- Scheduling Ack/Nack "
- "polling, because is was requested explicitly "
- "(e.g. first final block sent).\n");
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "Scheduling Ack/Nack polling, because is was requested explicitly "
+ "(e.g. first final block sent).\n");
} else if (need_poll) {
- LOGP(DRLCMACDL, LOGL_DEBUG, "- Scheduling Ack/Nack "
- "polling, because polling timed out.\n");
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "Scheduling Ack/Nack polling, because polling timed out.\n");
} else {
- LOGP(DRLCMACDL, LOGL_DEBUG, "- Scheduling Ack/Nack "
- "polling, because %d blocks sent.\n",
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "Scheduling Ack/Nack polling, because %d blocks sent.\n",
POLL_ACK_AFTER_FRAMES);
}
@@ -858,18 +848,18 @@ struct msgb *gprs_rlcmac_dl_tbf::create_dl_acked_block(
m_last_dl_poll_fn = poll_fn;
- LOGP(DRLCMACDL, LOGL_INFO,
- "%s Scheduled Ack/Nack polling on FN=%d, TS=%d\n",
- name(), poll_fn, poll_ts);
+ LOGPTBFDL(this, LOGL_INFO,
+ "Scheduled Ack/Nack polling on FN=%d, TS=%d\n",
+ poll_fn, poll_ts);
}
}
Encoding::rlc_write_dl_data_header(&rlc, msg_data);
- LOGP(DRLCMACDL, LOGL_DEBUG, "msg block (BSN %d, %s%s): %s\n",
- index, cs.name(),
- need_padding ? ", padded" : "",
- msgb_hexdump(dl_msg));
+ LOGPTBFDL(this, LOGL_DEBUG, "msg block (BSN %d, %s%s): %s\n",
+ index, cs.name(),
+ need_padding ? ", padded" : "",
+ msgb_hexdump(dl_msg));
/* Increment TX-counter */
m_tx_counter++;
@@ -953,10 +943,9 @@ int gprs_rlcmac_dl_tbf::analyse_errors(char *show_rbb, uint8_t ssn,
}
}
- LOGP(DRLCMACDL, LOGL_DEBUG, "%s DL analysis, range=%d:%d, lost=%d, recv=%d, "
- "skipped=%d, bsn=%d, info='%s'\n",
- name(), m_window.v_a(), m_window.v_s(), lost, received,
- skipped, bsn, info);
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "DL analysis, range=%d:%d, lost=%d, recv=%d, skipped=%d, bsn=%d, info='%s'\n",
+ m_window.v_a(), m_window.v_s(), lost, received, skipped, bsn, info);
res->received_packets = received_packets;
res->lost_packets = lost_packets;
@@ -990,9 +979,9 @@ int gprs_rlcmac_dl_tbf::update_window(unsigned first_bsn,
Decoding::extract_rbb(rbb, show_rbb);
/* show received array in debug */
- LOGP(DRLCMACDL, LOGL_DEBUG, "- ack: (BSN=%d)\"%s\""
- "(BSN=%d) R=ACK I=NACK\n", first_bsn,
- show_rbb, m_window.mod_sns(behind_last_bsn - 1));
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "ack: (BSN=%d)\"%s\"(BSN=%d) R=ACK I=NACK\n",
+ first_bsn, show_rbb, m_window.mod_sns(behind_last_bsn - 1));
error_rate = analyse_errors(show_rbb, behind_last_bsn, &ana_res);
@@ -1014,11 +1003,9 @@ int gprs_rlcmac_dl_tbf::update_window(unsigned first_bsn,
/* show receive state array in debug (V(A)..V(S)-1) */
m_window.show_state(show_v_b);
- LOGP(DRLCMACDL, LOGL_DEBUG, "- V(B): (V(A)=%d)\"%s\""
- "(V(S)-1=%d) A=Acked N=Nacked U=Unacked "
- "X=Resend-Unacked I=Invalid\n",
- m_window.v_a(), show_v_b,
- m_window.v_s_mod(-1));
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "V(B): (V(A)=%d)\"%s\"(V(S)-1=%d) A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid\n",
+ m_window.v_a(), show_v_b, m_window.v_s_mod(-1));
return 0;
}
@@ -1033,9 +1020,9 @@ int gprs_rlcmac_dl_tbf::update_window(const uint8_t ssn, const uint8_t *rbb)
Decoding::extract_rbb(rbb, show_rbb);
/* show received array in debug (bit 64..1) */
- LOGP(DRLCMACDL, LOGL_DEBUG, "- ack: (BSN=%d)\"%s\""
- "(BSN=%d) R=ACK I=NACK\n", m_window.mod_sns(ssn - 64),
- show_rbb, m_window.mod_sns(ssn - 1));
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "ack: (BSN=%d)\"%s\"(BSN=%d) R=ACK I=NACK\n",
+ m_window.mod_sns(ssn - 64), show_rbb, m_window.mod_sns(ssn - 1));
/* apply received array to receive state (SSN-64..SSN-1) */
/* calculate distance of ssn from V(S) */
@@ -1072,16 +1059,13 @@ int gprs_rlcmac_dl_tbf::update_window(const uint8_t ssn, const uint8_t *rbb)
/* show receive state array in debug (V(A)..V(S)-1) */
m_window.show_state(show_v_b);
- LOGP(DRLCMACDL, LOGL_DEBUG, "- V(B): (V(A)=%d)\"%s\""
- "(V(S)-1=%d) A=Acked N=Nacked U=Unacked "
- "X=Resend-Unacked I=Invalid\n",
- m_window.v_a(), show_v_b,
- m_window.v_s_mod(-1));
+ LOGPTBFDL(this, LOGL_DEBUG,
+ "V(B): (V(A)=%d)\"%s\"(V(S)-1=%d) A=Acked N=Nacked U=Unacked X=Resend-Unacked I=Invalid\n",
+ m_window.v_a(), show_v_b, m_window.v_s_mod(-1));
if (state_is(GPRS_RLCMAC_FINISHED) && m_window.window_empty()) {
- LOGP(DRLCMACDL, LOGL_NOTICE, "Received acknowledge of "
- "all blocks, but without final ack "
- "inidcation (don't worry)\n");
+ LOGPTBFDL(this, LOGL_NOTICE,
+ "Received acknowledge of all blocks, but without final ack inidcation (don't worry)\n");
}
return 0;
}
@@ -1164,12 +1148,11 @@ int gprs_rlcmac_dl_tbf::rcvd_dl_ack(bool final_ack, unsigned first_bsn,
rc = update_window(first_bsn, rbb);
if (final_ack) {
- LOGP(DRLCMACDL, LOGL_DEBUG, "- Final ACK received.\n");
+ LOGPTBFDL(this, LOGL_DEBUG, "Final ACK received.\n");
rc = maybe_start_new_window();
} else if (state_is(GPRS_RLCMAC_FINISHED) && m_window.window_empty()) {
- LOGP(DRLCMACDL, LOGL_NOTICE, "Received acknowledge of "
- "all blocks, but without final ack "
- "indication (don't worry)\n");
+ LOGPTBFDL(this, LOGL_NOTICE,
+ "Received acknowledge of all blocks, but without final ack indication (don't worry)\n");
}
return rc;
@@ -1288,11 +1271,11 @@ enum egprs_rlc_dl_reseg_bsn_state
*block_data = &rlc_data->block[22];
break;
default:
- LOGP(DRLCMACDL, LOGL_ERROR, "Software error: "
- "--%s hit invalid condition. headerType(%d) "
- " blockstatus(%d) cs(%s) PLEASE FIX!\n", name(),
- cs_current_trans.headerTypeData(),
- *block_status_dl, cs_init.name());
+ LOGPTBFDL(this, LOGL_ERROR,
+ "FIXME: Software error: hit invalid condition. "
+ "headerType(%d) blockstatus(%d) cs(%s) PLEASE FIX!\n",
+ cs_current_trans.headerTypeData(),
+ *block_status_dl, cs_init.name());
break;
}
@@ -1369,8 +1352,8 @@ enum egprs_rlcmac_dl_spb gprs_rlcmac_dl_tbf::get_egprs_dl_spb(const int bsn)
void gprs_rlcmac_dl_tbf::set_window_size()
{
uint16_t ws = egprs_window_size(bts->bts_data(), dl_slots());
- LOGP(DRLCMAC, LOGL_INFO, "%s: setting EGPRS DL window size to %u, base(%u) slots(%u) ws_pdch(%u)\n",
- name(), ws, bts->bts_data()->ws_base, pcu_bitcount(dl_slots()), bts->bts_data()->ws_pdch);
+ LOGPTBFDL(this, LOGL_INFO, "setting EGPRS DL window size to %u, base(%u) slots(%u) ws_pdch(%u)\n",
+ ws, bts->bts_data()->ws_base, pcu_bitcount(dl_slots()), bts->bts_data()->ws_pdch);
m_window.set_ws(ws);
}