diff options
author | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2013-10-27 17:01:14 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2013-10-30 21:24:13 +0100 |
commit | 474685e26ec4574aa2fab782b93bc50c23104905 (patch) | |
tree | 92c2559e38b043a344c91091738f9ef66fccb545 /src | |
parent | bd449f57a7914f3929a6b5be1cb31271db2ed1c0 (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.
Diffstat (limited to 'src')
-rw-r--r-- | src/bts.cpp | 46 | ||||
-rw-r--r-- | src/encoding.cpp | 2 | ||||
-rw-r--r-- | src/gprs_rlcmac.cpp | 2 | ||||
-rw-r--r-- | src/gprs_rlcmac_meas.cpp | 8 | ||||
-rw-r--r-- | src/tbf.cpp | 42 | ||||
-rw-r--r-- | src/tbf.h | 26 |
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; @@ -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); |