summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--openbsc/include/openbsc/gsm_data.h8
-rw-r--r--openbsc/src/libmsc/gsm_04_08.c44
-rw-r--r--openbsc/src/libmsc/vty_interface_layer3.c6
3 files changed, 38 insertions, 20 deletions
diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h
index e9ba173ce..17cc80475 100644
--- a/openbsc/include/openbsc/gsm_data.h
+++ b/openbsc/include/openbsc/gsm_data.h
@@ -218,8 +218,8 @@ enum {
MSC_CTR_LOC_UPDATE_TYPE_NORMAL,
MSC_CTR_LOC_UPDATE_TYPE_PERIODIC,
MSC_CTR_LOC_UPDATE_TYPE_DETACH,
- MSC_CTR_LOC_UPDATE_RESP_REJECT,
- MSC_CTR_LOC_UPDATE_RESP_ACCEPT,
+ MSC_CTR_LOC_UPDATE_FAILED,
+ MSC_CTR_LOC_UPDATE_COMPLETED,
MSC_CTR_SMS_SUBMITTED,
MSC_CTR_SMS_NO_RECEIVER,
MSC_CTR_SMS_DELIVERED,
@@ -240,8 +240,8 @@ static const struct rate_ctr_desc msc_ctr_description[] = {
[MSC_CTR_LOC_UPDATE_TYPE_NORMAL] = {"loc_update_type.normal", "Received location update normal requests."},
[MSC_CTR_LOC_UPDATE_TYPE_PERIODIC] = {"loc_update_type.periodic", "Received location update periodic requests."},
[MSC_CTR_LOC_UPDATE_TYPE_DETACH] = {"loc_update_type.detach", "Received location update detach indication."},
- [MSC_CTR_LOC_UPDATE_RESP_REJECT] = {"loc_update_resp.reject", "Sent location update reject responses."},
- [MSC_CTR_LOC_UPDATE_RESP_ACCEPT] = {"loc_update_resp.accept", "Sent location update accept responses."},
+ [MSC_CTR_LOC_UPDATE_FAILED] = {"loc_update_resp.failed", "Rejected location updates."},
+ [MSC_CTR_LOC_UPDATE_COMPLETED] = {"loc_update_resp.completed", "Successful location updates."},
[MSC_CTR_SMS_SUBMITTED] = {"sms.submitted", "Received a RPDU from a MS (MO)."},
[MSC_CTR_SMS_NO_RECEIVER] = {"sms.no_receiver", "Counts SMS which couldn't routed because no receiver found."},
[MSC_CTR_SMS_DELIVERED] = {"sms.delivered", "Global SMS Deliver attempts."},
diff --git a/openbsc/src/libmsc/gsm_04_08.c b/openbsc/src/libmsc/gsm_04_08.c
index c910d7192..31392f357 100644
--- a/openbsc/src/libmsc/gsm_04_08.c
+++ b/openbsc/src/libmsc/gsm_04_08.c
@@ -295,7 +295,7 @@ static int authorize_subscriber(struct gsm_loc_updating_operation *loc,
}
}
-static void release_loc_updating_req(struct gsm_subscriber_connection *conn, int release)
+static void _release_loc_updating_req(struct gsm_subscriber_connection *conn, int release)
{
if (!conn->loc_operation)
return;
@@ -310,11 +310,31 @@ static void release_loc_updating_req(struct gsm_subscriber_connection *conn, int
msc_release_connection(conn);
}
+static void loc_updating_failure(struct gsm_subscriber_connection *conn, int release)
+{
+ if (!conn->loc_operation)
+ return;
+ LOGP(DMM, LOGL_ERROR, "Location Updating failed for %s\n",
+ subscr_name(conn->subscr));
+ rate_ctr_inc(&conn->network->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_FAILED]);
+ _release_loc_updating_req(conn, release);
+}
+
+static void loc_updating_success(struct gsm_subscriber_connection *conn, int release)
+{
+ if (!conn->loc_operation)
+ return;
+ LOGP(DMM, LOGL_INFO, "Location Updating completed for %s\n",
+ subscr_name(conn->subscr));
+ rate_ctr_inc(&conn->network->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_COMPLETED]);
+ _release_loc_updating_req(conn, release);
+}
+
static void allocate_loc_updating_req(struct gsm_subscriber_connection *conn)
{
if (conn->loc_operation)
LOGP(DMM, LOGL_ERROR, "Connection already had operation.\n");
- release_loc_updating_req(conn, 0);
+ loc_updating_failure(conn, 0);
conn->loc_operation = talloc_zero(tall_locop_ctx,
struct gsm_loc_updating_operation);
@@ -349,9 +369,11 @@ static int finish_lu(struct gsm_subscriber_connection *conn)
* The gsm0408_loc_upd_acc sends a MI with the TMSI. The
* MS needs to respond with a TMSI REALLOCATION COMPLETE
* (even if the TMSI is the same).
+ * If avoid_tmsi == true, we don't send a TMSI, we don't
+ * expect a reply and Location Updating is done.
*/
if (avoid_tmsi)
- release_loc_updating_req(conn, 1);
+ loc_updating_success(conn, 1);
return rc;
}
@@ -364,7 +386,7 @@ static int _gsm0408_authorize_sec_cb(unsigned int hooknum, unsigned int event,
switch (event) {
case GSM_SECURITY_AUTH_FAILED:
- release_loc_updating_req(conn, 1);
+ loc_updating_failure(conn, 1);
break;
case GSM_SECURITY_ALREADY:
@@ -407,7 +429,7 @@ void gsm0408_clear_request(struct gsm_subscriber_connection *conn, uint32_t caus
* Cancel any outstanding location updating request
* operation taking place on the subscriber connection.
*/
- release_loc_updating_req(conn, 0);
+ loc_updating_failure(conn, 0);
/* We might need to cancel the paging response or such. */
if (conn->sec_operation && conn->sec_operation->cb) {
@@ -459,8 +481,6 @@ int gsm0408_loc_upd_rej(struct gsm_subscriber_connection *conn, uint8_t cause)
struct gsm_bts *bts = conn->bts;
struct msgb *msg;
- rate_ctr_inc(&conn->network->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_RESP_REJECT]);
-
msg = gsm48_create_loc_upd_rej(cause);
if (!msg) {
LOGP(DMM, LOGL_ERROR, "Failed to create msg for LOCATION UPDATING REJECT.\n");
@@ -508,8 +528,6 @@ static int gsm0408_loc_upd_acc(struct gsm_subscriber_connection *conn)
DEBUGP(DMM, "-> LOCATION UPDATE ACCEPT\n");
- rate_ctr_inc(&conn->network->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_RESP_ACCEPT]);
-
return gsm48_conn_sendmsg(msg, conn, NULL);
}
@@ -566,7 +584,7 @@ static int mm_rx_id_resp(struct gsm_subscriber_connection *conn, struct msgb *ms
}
if (!conn->subscr && conn->loc_operation) {
gsm0408_loc_upd_rej(conn, net->reject_cause);
- release_loc_updating_req(conn, 1);
+ loc_updating_failure(conn, 1);
return 0;
}
if (conn->loc_operation)
@@ -595,7 +613,7 @@ static void loc_upd_rej_cb(void *data)
LOGP(DMM, LOGL_DEBUG, "Location Updating Request procedure timedout.\n");
gsm0408_loc_upd_rej(conn, conn->network->reject_cause);
- release_loc_updating_req(conn, 1);
+ loc_updating_failure(conn, 1);
}
static void schedule_reject(struct gsm_subscriber_connection *conn)
@@ -672,7 +690,7 @@ static int mm_rx_loc_upd_req(struct gsm_subscriber_connection *conn, struct msgb
subscr = subscr_create(conn->network, mi_string);
if (!subscr) {
gsm0408_loc_upd_rej(conn, conn->network->reject_cause);
- release_loc_updating_req(conn, 0);
+ loc_updating_failure(conn, 0); /* FIXME: set release == true? */
return 0;
}
break;
@@ -1401,7 +1419,7 @@ static int gsm0408_rcv_mm(struct gsm_subscriber_connection *conn, struct msgb *m
case GSM48_MT_MM_TMSI_REALL_COMPL:
DEBUGP(DMM, "TMSI Reallocation Completed. Subscriber: %s\n",
subscr_name(conn->subscr));
- release_loc_updating_req(conn, 1);
+ loc_updating_success(conn, 1);
break;
case GSM48_MT_MM_IMSI_DETACH_IND:
rc = gsm48_rx_mm_imsi_detach_ind(conn, msg);
diff --git a/openbsc/src/libmsc/vty_interface_layer3.c b/openbsc/src/libmsc/vty_interface_layer3.c
index 1bc9372a6..f631bccdf 100644
--- a/openbsc/src/libmsc/vty_interface_layer3.c
+++ b/openbsc/src/libmsc/vty_interface_layer3.c
@@ -827,9 +827,9 @@ DEFUN(show_stats,
vty_out(vty, "IMSI Detach Indications : %lu%s",
net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_TYPE_DETACH].current,
VTY_NEWLINE);
- vty_out(vty, "Location Update Response: %lu accept, %lu reject%s",
- net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_RESP_ACCEPT].current,
- net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_RESP_REJECT].current,
+ vty_out(vty, "Location Updating Results: %lu completed, %lu failed%s",
+ net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_COMPLETED].current,
+ net->msc_ctrs->ctr[MSC_CTR_LOC_UPDATE_FAILED].current,
VTY_NEWLINE);
vty_out(vty, "Handover : %lu attempted, %lu no_channel, %lu timeout, "
"%lu completed, %lu failed%s",