diff options
-rw-r--r-- | openbsc/include/openbsc/gsm_data.h | 8 | ||||
-rw-r--r-- | openbsc/src/libmsc/gsm_04_08.c | 42 | ||||
-rw-r--r-- | openbsc/src/libmsc/vty_interface_layer3.c | 6 |
3 files changed, 37 insertions, 19 deletions
diff --git a/openbsc/include/openbsc/gsm_data.h b/openbsc/include/openbsc/gsm_data.h index a0a34c57a..7eef79201 100644 --- a/openbsc/include/openbsc/gsm_data.h +++ b/openbsc/include/openbsc/gsm_data.h @@ -228,8 +228,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, @@ -250,8 +250,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 4aca15ef3..4999f6581 100644 --- a/openbsc/src/libmsc/gsm_04_08.c +++ b/openbsc/src/libmsc/gsm_04_08.c @@ -303,7 +303,7 @@ static bool authorize_subscriber(struct gsm_loc_updating_operation *loc, return subscr_authorized(subscriber); } -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; @@ -318,11 +318,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); @@ -356,9 +376,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; } @@ -428,7 +450,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) { @@ -481,8 +503,6 @@ int gsm0408_loc_upd_rej(struct gsm_subscriber_connection *conn, uint8_t cause) { 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"); @@ -525,8 +545,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); } @@ -581,7 +599,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) @@ -610,7 +628,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) @@ -687,7 +705,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; @@ -1442,7 +1460,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 d6c5bea23..34f120f51 100644 --- a/openbsc/src/libmsc/vty_interface_layer3.c +++ b/openbsc/src/libmsc/vty_interface_layer3.c @@ -837,9 +837,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", |