tbf: Make the tlli "private" and update the updating code

Now all updates to the tlli/tlli_valid are in one place. If we
implement the policy to update the matching/linked TBF we can
now to do it in a single place. Add a todo item for that as I
am waiting for feedback from the mailinglist.
This commit is contained in:
Holger Hans Peter Freyther 2013-10-27 17:01:14 +01:00
parent bd449f57a7
commit 474685e26e
6 changed files with 80 additions and 46 deletions

View File

@ -216,13 +216,13 @@ gprs_rlcmac_tbf *BTS::tbf_by_tlli(uint32_t tlli, enum gprs_rlcmac_tbf_direction
if (dir == GPRS_RLCMAC_UL_TBF) {
llist_for_each_entry(tbf, &m_bts.ul_tbfs, list) {
if (tbf->state_is_not(GPRS_RLCMAC_RELEASING)
&& tbf->tlli == tlli && tbf->tlli_valid)
&& tbf->tlli() == tlli && tbf->is_tlli_valid())
return tbf;
}
} else {
llist_for_each_entry(tbf, &m_bts.dl_tbfs, list) {
if (tbf->state_is_not(GPRS_RLCMAC_RELEASING)
&& tbf->tlli == tlli)
&& tbf->tlli() == tlli)
return tbf;
}
}
@ -499,7 +499,7 @@ void BTS::snd_dl_ass(gprs_rlcmac_tbf *tbf, uint8_t poll, const char *imsi)
* so the assignment will not conflict with possible RACH requests. */
plen = Encoding::write_immediate_assignment(&m_bts, immediate_assignment, 1, 125,
(tbf->pdch[tbf->first_ts]->last_rts_fn + 21216) % 2715648, tbf->ta,
tbf->trx->arfcn, tbf->first_ts, tbf->tsc, tbf->tfi, 0, tbf->tlli, poll,
tbf->trx->arfcn, tbf->first_ts, tbf->tsc, tbf->tfi, 0, tbf->tlli(), poll,
tbf->poll_fn, 0, m_bts.alpha, m_bts.gamma, -1);
pcu_l1if_tx_pch(immediate_assignment, plen, imsi);
bitvec_free(immediate_assignment);
@ -690,8 +690,9 @@ int gprs_rlcmac_pdch::rcv_data_block_acknowledged(uint8_t *data, uint8_t len, in
gprs_rlcmac_rssi(tbf, rssi);
/* get TLLI */
if (!tbf->tlli_valid) {
if (!tbf->is_tlli_valid()) {
struct gprs_rlcmac_tbf *dl_tbf, *ul_tbf;
uint32_t tlli;
/* no TLLI yet */
if (!rh->ti) {
@ -699,36 +700,36 @@ int gprs_rlcmac_pdch::rcv_data_block_acknowledged(uint8_t *data, uint8_t len, in
"TLLI, but no TLLI received yet\n", rh->tfi);
return 0;
}
#warning "Silent TLLI change possible.. Should update TA.."
rc = Decoding::tlli_from_ul_data(data, len, &tbf->tlli);
rc = Decoding::tlli_from_ul_data(data, len, &tlli);
if (rc) {
bts()->decode_error();
LOGP(DRLCMACUL, LOGL_NOTICE, "Failed to decode TLLI "
"of UL DATA TFI=%d.\n", rh->tfi);
return 0;
}
tbf->update_tlli(tlli);
LOGP(DRLCMACUL, LOGL_INFO, "Decoded premier TLLI=0x%08x of "
"UL DATA TFI=%d.\n", tbf->tlli, rh->tfi);
if ((dl_tbf = bts()->tbf_by_tlli(tbf->tlli, GPRS_RLCMAC_DL_TBF))) {
"UL DATA TFI=%d.\n", tbf->tlli(), rh->tfi);
if ((dl_tbf = bts()->tbf_by_tlli(tbf->tlli(), GPRS_RLCMAC_DL_TBF))) {
LOGP(DRLCMACUL, LOGL_NOTICE, "Got RACH from "
"TLLI=0x%08x while DL TFI=%d still exists. "
"Killing pending DL TBF\n", tbf->tlli,
"Killing pending DL TBF\n", tbf->tlli(),
dl_tbf->tfi);
tbf_free(dl_tbf);
}
/* tbf_by_tlli will not find your TLLI, because it is not
* yet marked valid */
if ((ul_tbf = bts()->tbf_by_tlli(tbf->tlli, GPRS_RLCMAC_UL_TBF))) {
if ((ul_tbf = bts()->tbf_by_tlli(tbf->tlli(), GPRS_RLCMAC_UL_TBF))) {
LOGP(DRLCMACUL, LOGL_NOTICE, "Got RACH from "
"TLLI=0x%08x while UL TFI=%d still exists. "
"Killing pending UL TBF\n", tbf->tlli,
ul_tbf->tfi);
"TLLI=0x%08x while %s still exists. "
"Killing pending UL TBF\n", tbf->tlli(),
tbf_name(ul_tbf));
tbf_free(ul_tbf);
}
/* mark TLLI valid now */
tbf->tlli_valid = 1;
tbf->tlli_mark_valid();
/* store current timing advance */
bts()->timing_advance()->remember(tbf->tlli, tbf->ta);
bts()->timing_advance()->remember(tbf->tlli(), tbf->ta);
/* already have TLLI, but we stille get another one */
} else if (rh->ti) {
uint32_t tlli;
@ -738,7 +739,7 @@ int gprs_rlcmac_pdch::rcv_data_block_acknowledged(uint8_t *data, uint8_t len, in
"of UL DATA TFI=%d.\n", rh->tfi);
return 0;
}
if (tlli != tbf->tlli) {
if (tlli != tbf->tlli()) {
LOGP(DRLCMACUL, LOGL_NOTICE, "TLLI mismatch on UL "
"DATA TFI=%d. (Ignoring due to contention "
"resolution)\n", rh->tfi);
@ -877,12 +878,7 @@ void gprs_rlcmac_pdch::rcv_control_ack(Packet_Control_Acknowledgement_t *packet,
fn, tlli, trx_no(), ts_no);
return;
}
if (tlli != tbf->tlli) {
LOGP(DRLCMAC, LOGL_INFO, "Phone changed TLLI to "
"0x%08x\n", tlli);
#warning "Silent TLLI changes... update TA.. and other structs"
tbf->tlli = tlli;
}
tbf->update_tlli(tlli);
LOGP(DRLCMAC, LOGL_DEBUG, "RX: [PCU <- BTS] %s Packet Control Ack\n", tbf_name(tbf));
tbf->poll_state = GPRS_RLCMAC_POLL_NONE;
@ -908,7 +904,7 @@ void gprs_rlcmac_pdch::rcv_control_ack(Packet_Control_Acknowledgement_t *packet,
tbf->dl_ass_state = GPRS_RLCMAC_DL_ASS_NONE;
debug_diagram(bts(), tbf->diag, "got CTL-ACK DL-ASS");
if (tbf->direction == GPRS_RLCMAC_UL_TBF)
tbf = bts()->tbf_by_tlli(tbf->tlli,
tbf = bts()->tbf_by_tlli(tbf->tlli(),
GPRS_RLCMAC_DL_TBF);
#warning "TBF is changing on the way... *sigh*"
if (!tbf) {
@ -937,7 +933,7 @@ void gprs_rlcmac_pdch::rcv_control_ack(Packet_Control_Acknowledgement_t *packet,
debug_diagram(bts(), tbf->diag, "got CTL-AC UL-ASS");
#warning "TBF is changing on the way... *sigh*"
if (tbf->direction == GPRS_RLCMAC_DL_TBF)
tbf = bts()->tbf_by_tlli(tbf->tlli,
tbf = bts()->tbf_by_tlli(tbf->tlli(),
GPRS_RLCMAC_UL_TBF);
if (!tbf) {
LOGP(DRLCMAC, LOGL_ERROR, "Got ACK, but UL "
@ -1003,7 +999,7 @@ void gprs_rlcmac_pdch::rcv_control_dl_ack_nack(Packet_Downlink_Ack_Nack_t *ack_n
if (ack_nack->Exist_Channel_Request_Description) {
LOGP(DRLCMAC, LOGL_DEBUG, "MS requests UL TBF in ack "
"message, so we provide one:\n");
tbf_alloc_ul(bts_data(), tbf->trx->trx_no, tbf->ms_class, tbf->tlli, tbf->ta, tbf);
tbf_alloc_ul(bts_data(), tbf->trx->trx_no, tbf->ms_class, tbf->tlli(), tbf->ta, tbf);
/* schedule uplink assignment */
tbf->ul_ass_state = GPRS_RLCMAC_UL_ASS_SEND_ASS;
}

View File

@ -408,7 +408,7 @@ void Encoding::write_packet_uplink_ack(struct gprs_rlcmac_bts *bts,
block->u.Packet_Uplink_Ack_Nack.u.PU_AckNack_GPRS_Struct.Exist_AdditionsR99 = 0x0; // AdditionsR99 = off
block->u.Packet_Uplink_Ack_Nack.u.PU_AckNack_GPRS_Struct.Common_Uplink_Ack_Nack_Data.Exist_CONTENTION_RESOLUTION_TLLI = 0x1;
block->u.Packet_Uplink_Ack_Nack.u.PU_AckNack_GPRS_Struct.Common_Uplink_Ack_Nack_Data.CONTENTION_RESOLUTION_TLLI = tbf->tlli;
block->u.Packet_Uplink_Ack_Nack.u.PU_AckNack_GPRS_Struct.Common_Uplink_Ack_Nack_Data.CONTENTION_RESOLUTION_TLLI = tbf->tlli();
block->u.Packet_Uplink_Ack_Nack.u.PU_AckNack_GPRS_Struct.Common_Uplink_Ack_Nack_Data.Exist_Packet_Timing_Advance = 0x0;
block->u.Packet_Uplink_Ack_Nack.u.PU_AckNack_GPRS_Struct.Common_Uplink_Ack_Nack_Data.Exist_Extension_Bits = 0x0;
block->u.Packet_Uplink_Ack_Nack.u.PU_AckNack_GPRS_Struct.Common_Uplink_Ack_Nack_Data.Exist_Power_Control_Parameters = 0x0;

View File

@ -133,7 +133,7 @@ int gprs_rlcmac_tx_ul_ud(gprs_rlcmac_tbf *tbf)
qos_profile[0] = QOS_PROFILE >> 16;
qos_profile[1] = QOS_PROFILE >> 8;
qos_profile[2] = QOS_PROFILE;
bssgp_tx_ul_ud(bctx, tbf->tlli, qos_profile, llc_pdu);
bssgp_tx_ul_ud(bctx, tbf->tlli(), qos_profile, llc_pdu);
return 0;
}

View File

@ -100,7 +100,7 @@ int gprs_rlcmac_rssi_rep(struct gprs_rlcmac_tbf *tbf)
return -EINVAL;
LOGP(DRLCMACMEAS, LOGL_INFO, "UL RSSI of TLLI=0x%08x: %d dBm\n",
tbf->tlli, tbf->meas.rssi_sum / tbf->meas.rssi_num);
tbf->tlli(), tbf->meas.rssi_sum / tbf->meas.rssi_num);
return 0;
}
@ -123,7 +123,7 @@ int gprs_rlcmac_received_lost(struct gprs_rlcmac_tbf *tbf, uint16_t received,
return -EINVAL;
LOGP(DRLCMACMEAS, LOGL_DEBUG, "DL Loss of TLLI 0x%08x: Received: %4d "
"Lost: %4d Sum: %4d\n", tbf->tlli, received, lost, sum);
"Lost: %4d Sum: %4d\n", tbf->tlli(), received, lost, sum);
tbf->meas.dl_loss_received += received;
tbf->meas.dl_loss_lost += lost;
@ -154,7 +154,7 @@ int gprs_rlcmac_lost_rep(struct gprs_rlcmac_tbf *tbf)
return -EINVAL;
LOGP(DRLCMACMEAS, LOGL_INFO, "DL packet loss of IMSI=%s / TLLI=0x%08x: "
"%d%%\n", tbf->meas.imsi, tbf->tlli,
"%d%%\n", tbf->meas.imsi, tbf->tlli(),
tbf->meas.dl_loss_lost * 100 / sum);
return 0;
@ -179,7 +179,7 @@ int gprs_rlcmac_dl_bw(struct gprs_rlcmac_tbf *tbf, uint16_t octets)
return 0;
LOGP(DRLCMACMEAS, LOGL_INFO, "DL Bandwitdh of IMSI=%s / TLLI=0x%08x: "
"%d KBits/s\n", tbf->meas.imsi, tbf->tlli,
"%d KBits/s\n", tbf->meas.imsi, tbf->tlli(),
tbf->meas.dl_bw_octets / elapsed);
/* reset bandwidth values timestamp */

View File

@ -195,8 +195,8 @@ static int tbf_new_dl_assignment(struct gprs_rlcmac_bts *bts,
/* FIXME: send reject */
return -EBUSY;
}
tbf->tlli = tlli;
tbf->tlli_valid = 1;
tbf->m_tlli = tlli;
tbf->m_tlli_valid = 1;
tbf->ta = ta;
LOGP(DRLCMAC, LOGL_DEBUG, "%s [DOWNLINK] START\n", tbf_name(tbf));
@ -262,8 +262,8 @@ struct gprs_rlcmac_tbf *tbf_alloc_ul(struct gprs_rlcmac_bts *bts,
/* FIXME: send reject */
return NULL;
}
tbf->tlli = tlli;
tbf->tlli_valid = 1; /* no contention resolution */
tbf->m_tlli = tlli;
tbf->m_tlli_valid = 1; /* no contention resolution */
tbf->dir.ul.contention_resolution_done = 1;
tbf->ta = ta; /* use current TA */
tbf_new_state(tbf, GPRS_RLCMAC_ASSIGN);
@ -355,7 +355,7 @@ int gprs_rlcmac_tbf::update()
return -EINVAL;
}
ul_tbf = bts->tbf_by_tlli(tlli, GPRS_RLCMAC_UL_TBF);
ul_tbf = bts->tbf_by_tlli(m_tlli, GPRS_RLCMAC_UL_TBF);
tbf_unlink_pdch(this);
rc = bts_data->alloc_algorithm(bts_data, ul_tbf, this, bts_data->alloc_algorithm_curst, 0);
@ -727,7 +727,7 @@ struct msgb *gprs_rlcmac_tbf::llc_dequeue(bssgp_bvc_ctx *bctx)
frames = 0xff;
if (octets > 0xffffff)
octets = 0xffffff;
bssgp_tx_llc_discarded(bctx, tlli, frames, octets);
bssgp_tx_llc_discarded(bctx, m_tlli, frames, octets);
}
return msg;
@ -1264,7 +1264,7 @@ struct msgb *gprs_rlcmac_tbf::create_dl_ass(uint32_t fn)
return NULL;
}
#warning "THIS should probably go over the IMSI too"
new_tbf = bts->tbf_by_tlli(tlli, GPRS_RLCMAC_DL_TBF);
new_tbf = bts->tbf_by_tlli(m_tlli, GPRS_RLCMAC_DL_TBF);
} else
new_tbf = this;
if (!new_tbf) {
@ -1285,7 +1285,7 @@ struct msgb *gprs_rlcmac_tbf::create_dl_ass(uint32_t fn)
}
bitvec_unhex(ass_vec,
"2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
LOGP(DRLCMAC, LOGL_INFO, "TBF: START TFI: %u TLLI: 0x%08x Packet Downlink Assignment (PACCH)\n", new_tbf->tfi, new_tbf->tlli);
LOGP(DRLCMAC, LOGL_INFO, "%s start Packet Downlink Assignment (PACCH)\n", tbf_name(new_tbf));
RlcMacDownlink_t * mac_control_block = (RlcMacDownlink_t *)talloc_zero(tall_pcu_ctx, RlcMacDownlink_t);
Encoding::write_packet_downlink_assignment(mac_control_block, tfi,
(direction == GPRS_RLCMAC_DL_TBF), new_tbf,
@ -1337,7 +1337,7 @@ struct msgb *gprs_rlcmac_tbf::create_ul_ass(uint32_t fn)
/* on down TBF we get the uplink TBF to be assigned. */
#warning "Probably want to find by IMSI too"
if (direction == GPRS_RLCMAC_DL_TBF)
new_tbf = bts->tbf_by_tlli(tlli, GPRS_RLCMAC_UL_TBF);
new_tbf = bts->tbf_by_tlli(m_tlli, GPRS_RLCMAC_UL_TBF);
else
new_tbf = this;
@ -1352,7 +1352,7 @@ struct msgb *gprs_rlcmac_tbf::create_ul_ass(uint32_t fn)
msg = msgb_alloc(23, "rlcmac_ul_ass");
if (!msg)
return NULL;
LOGP(DRLCMAC, LOGL_INFO, "TBF: START TFI: %u TLLI: 0x%08x Packet Uplink Assignment (PACCH)\n", new_tbf->tfi, new_tbf->tlli);
LOGP(DRLCMAC, LOGL_INFO, "%ss start Packet Uplink Assignment (PACCH)\n", tbf_name(new_tbf));
bitvec *ass_vec = bitvec_alloc(23);
if (!ass_vec) {
msgb_free(msg);
@ -1361,8 +1361,8 @@ struct msgb *gprs_rlcmac_tbf::create_ul_ass(uint32_t fn)
bitvec_unhex(ass_vec,
"2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b");
Encoding::write_packet_uplink_assignment(bts_data(), ass_vec, tfi,
(direction == GPRS_RLCMAC_DL_TBF), tlli,
tlli_valid, new_tbf, POLLING_ASSIGNMENT_UL, bts_data()->alpha,
(direction == GPRS_RLCMAC_DL_TBF), m_tlli,
m_tlli_valid, new_tbf, POLLING_ASSIGNMENT_UL, bts_data()->alpha,
bts_data()->gamma, -1);
bitvec_pack(ass_vec, msgb_put(msg, 23));
RlcMacDownlink_t * mac_control_block = (RlcMacDownlink_t *)talloc_zero(tall_pcu_ctx, RlcMacDownlink_t);
@ -1607,11 +1607,27 @@ void gprs_rlcmac_tbf::free_all(struct gprs_rlcmac_pdch *pdch)
}
}
void gprs_rlcmac_tbf::tlli_mark_valid()
{
m_tlli_valid = true;
}
void gprs_rlcmac_tbf::update_tlli(uint32_t tlli)
{
if (tlli == m_tlli)
return;
#warning "TODO.. find the DL/UL opposite and update the TLLI too"
LOGP(DRLCMAC, LOGL_NOTICE, "%s changing tlli to TLLI=0x%08x\n",
tbf_name(this), tlli);
m_tlli = tlli;
}
const char *tbf_name(gprs_rlcmac_tbf *tbf)
{
static char buf[40];
snprintf(buf, sizeof(buf), "TBF(TFI=%d TLLI=0x%08x DIR=%s)",
tbf->tfi, tbf->tlli,
tbf->tfi, tbf->m_tlli,
tbf->direction == GPRS_RLCMAC_UL_TBF ? "UL" : "DL");
buf[sizeof(buf) - 1] = '\0';
return buf;

View File

@ -114,12 +114,16 @@ struct gprs_rlcmac_tbf {
void poll_timeout();
/** tlli handling */
void update_tlli(uint32_t tlli);
uint32_t tlli() const;
bool is_tlli_valid() const;
void tlli_mark_valid();
struct llist_head list;
uint32_t state_flags;
enum gprs_rlcmac_tbf_direction direction;
uint8_t tfi;
uint32_t tlli;
uint8_t tlli_valid;
struct gprs_rlcmac_trx *trx;
uint8_t tsc;
uint8_t first_ts; /* first TS used by TBF */
@ -214,8 +218,16 @@ struct gprs_rlcmac_tbf {
/* store the BTS this TBF belongs to */
BTS *bts;
/*
* private fields. We can't make it private as it is breaking the
* llist macros.
*/
uint32_t m_tlli;
uint8_t m_tlli_valid;
protected:
gprs_rlcmac_bts *bts_data() const;
};
@ -258,4 +270,14 @@ inline void gprs_rlcmac_tbf::set_state(enum gprs_rlcmac_tbf_state new_state)
state = new_state;
}
inline uint32_t gprs_rlcmac_tbf::tlli() const
{
return m_tlli;
}
inline bool gprs_rlcmac_tbf::is_tlli_valid() const
{
return m_tlli_valid;
}
const char *tbf_name(gprs_rlcmac_tbf *tbf);