aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc
diff options
context:
space:
mode:
Diffstat (limited to 'openbsc')
-rw-r--r--openbsc/src/gprs/gb_proxy.c13
-rw-r--r--openbsc/src/gprs/gprs_sgsn.c10
2 files changed, 20 insertions, 3 deletions
diff --git a/openbsc/src/gprs/gb_proxy.c b/openbsc/src/gprs/gb_proxy.c
index daa9ba08b..8b5a67269 100644
--- a/openbsc/src/gprs/gb_proxy.c
+++ b/openbsc/src/gprs/gb_proxy.c
@@ -226,6 +226,7 @@ uint32_t gbproxy_make_bss_ptmsi(struct gbproxy_peer *peer,
uint32_t sgsn_ptmsi)
{
uint32_t bss_ptmsi;
+ int max_retries = 23;
if (!peer->cfg->patch_ptmsi) {
bss_ptmsi = sgsn_ptmsi;
} else {
@@ -235,9 +236,12 @@ uint32_t gbproxy_make_bss_ptmsi(struct gbproxy_peer *peer,
if (gbproxy_find_tlli_by_ptmsi(peer, bss_ptmsi))
bss_ptmsi = GSM_RESERVED_TMSI;
- } while (bss_ptmsi == GSM_RESERVED_TMSI);
+ } while (bss_ptmsi == GSM_RESERVED_TMSI && max_retries--);
}
+ if (bss_ptmsi == GSM_RESERVED_TMSI)
+ LOGP(DGPRS, LOGL_ERROR, "Failed to allocate a BSS P-TMSI\n");
+
return bss_ptmsi;
}
@@ -246,6 +250,7 @@ uint32_t gbproxy_make_sgsn_tlli(struct gbproxy_peer *peer,
uint32_t bss_tlli)
{
uint32_t sgsn_tlli;
+ int max_retries = 23;
if (!peer->cfg->patch_ptmsi) {
sgsn_tlli = bss_tlli;
} else if (tlli_info->sgsn_tlli.ptmsi != GSM_RESERVED_TMSI) {
@@ -259,8 +264,12 @@ uint32_t gbproxy_make_sgsn_tlli(struct gbproxy_peer *peer,
if (gbproxy_find_tlli_by_any_sgsn_tlli(peer, sgsn_tlli))
sgsn_tlli = 0;
- } while (!sgsn_tlli);
+ } while (!sgsn_tlli && max_retries--);
}
+
+ if (!sgsn_tlli)
+ LOGP(DGPRS, LOGL_ERROR, "Failed to allocate an SGSN TLLI\n");
+
return sgsn_tlli;
}
diff --git a/openbsc/src/gprs/gprs_sgsn.c b/openbsc/src/gprs/gprs_sgsn.c
index 0c15619b5..4e5163200 100644
--- a/openbsc/src/gprs/gprs_sgsn.c
+++ b/openbsc/src/gprs/gprs_sgsn.c
@@ -359,15 +359,23 @@ uint32_t sgsn_alloc_ptmsi(void)
{
struct sgsn_mm_ctx *mm;
uint32_t ptmsi;
+ int max_retries = 23;
restart:
ptmsi = rand() | 0xC0000000;
llist_for_each_entry(mm, &sgsn_mm_ctxts, list) {
- if (mm->p_tmsi == ptmsi)
+ if (mm->p_tmsi == ptmsi) {
+ if (!max_retries--)
+ goto failed;
goto restart;
+ }
}
return ptmsi;
+
+failed:
+ LOGP(DGPRS, LOGL_ERROR, "Failed to allocate a P-TMSI\n");
+ return GSM_RESERVED_TMSI;
}
static void drop_one_pdp(struct sgsn_pdp_ctx *pdp)