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:
parent
bd449f57a7
commit
474685e26e
46
src/bts.cpp
46
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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
||||
|
|
42
src/tbf.cpp
42
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;
|
||||
|
|
26
src/tbf.h
26
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);
|
||||
|
|
Loading…
Reference in New Issue