aboutsummaryrefslogtreecommitdiffstats
path: root/src/tbf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/tbf.cpp')
-rw-r--r--src/tbf.cpp42
1 files changed, 37 insertions, 5 deletions
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 51b2aa5c..0771969f 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -51,10 +51,42 @@ uint32_t gprs_rlcmac_tbf::tlli() const
return m_ms ? m_ms->tlli() : 0;
}
-void gprs_rlcmac_tbf::assign_imsi(const char *imsi)
+const char *gprs_rlcmac_tbf::imsi() const
{
- strncpy(m_imsi, imsi, sizeof(m_imsi));
- m_imsi[sizeof(m_imsi) - 1] = '\0';
+ static const char nullc = 0;
+ return m_ms ? m_ms->imsi() : &nullc;
+}
+
+void gprs_rlcmac_tbf::assign_imsi(const char *imsi_)
+{
+ GprsMs *old_ms;
+
+ if (!imsi_ || !m_ms) {
+ LOGP(DRLCMAC, LOGL_ERROR,
+ "%s failed to assign IMSI: missing IMSI or MS object\n",
+ name());
+ return;
+ }
+
+ if (strcmp(imsi_, imsi()) == 0)
+ return;
+
+ /* really change the IMSI */
+
+ old_ms = bts->ms_store().get_ms(0, 0, imsi_);
+ if (old_ms) {
+ /* We cannot find m_ms by IMSI since we know that it has a
+ * different IMSI */
+ OSMO_ASSERT(old_ms != m_ms);
+
+ LOGP(DRLCMAC, LOGL_INFO,
+ "%s the IMSI '%s' was already assigned to another "
+ "MS object: TLLI = 0x%08x, that IMSI will be removed\n",
+ name(), imsi_, old_ms->tlli());
+ old_ms->set_imsi("");
+ }
+
+ m_ms->set_imsi(imsi_);
}
void gprs_rlcmac_tbf::set_new_tbf(gprs_rlcmac_tbf *tbf)
@@ -404,9 +436,9 @@ void gprs_rlcmac_tbf::poll_timeout()
LOGP(DRLCMAC, LOGL_DEBUG, "Re-send dowlink assignment "
"for %s on PCH (IMSI=%s)\n",
tbf_name(dl_tbf),
- m_imsi);
+ imsi());
/* send immediate assignment */
- dl_tbf->bts->snd_dl_ass(dl_tbf, 0, m_imsi);
+ dl_tbf->bts->snd_dl_ass(dl_tbf, 0, imsi());
dl_tbf->m_wait_confirm = 1;
}
} else