aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-10-27 17:01:14 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-10-30 21:24:13 +0100
commit474685e26ec4574aa2fab782b93bc50c23104905 (patch)
tree92c2559e38b043a344c91091738f9ef66fccb545
parentbd449f57a7914f3929a6b5be1cb31271db2ed1c0 (diff)
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.
-rw-r--r--src/bts.cpp46
-rw-r--r--src/encoding.cpp2
-rw-r--r--src/gprs_rlcmac.cpp2
-rw-r--r--src/gprs_rlcmac_meas.cpp8
-rw-r--r--src/tbf.cpp42
-rw-r--r--src/tbf.h26
6 files changed, 80 insertions, 46 deletions
diff --git a/src/bts.cpp b/src/bts.cpp
index 2357e071..261b5d20 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -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;
}
diff --git a/src/encoding.cpp b/src/encoding.cpp
index 20c995e3..9eda8efb 100644
--- a/src/encoding.cpp
+++ b/src/encoding.cpp
@@ -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;
diff --git a/src/gprs_rlcmac.cpp b/src/gprs_rlcmac.cpp
index d11e37e5..ea5ab4e2 100644
--- a/src/gprs_rlcmac.cpp
+++ b/src/gprs_rlcmac.cpp
@@ -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;
}
diff --git a/src/gprs_rlcmac_meas.cpp b/src/gprs_rlcmac_meas.cpp
index 3229795c..5bb74cd8 100644
--- a/src/gprs_rlcmac_meas.cpp
+++ b/src/gprs_rlcmac_meas.cpp
@@ -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 */
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 143cdcdb..9c61ca1f 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -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;
diff --git a/src/tbf.h b/src/tbf.h
index 83b36487..5d2a10bd 100644
--- a/src/tbf.h
+++ b/src/tbf.h
@@ -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);