diff options
author | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2021-11-07 14:05:02 +0100 |
---|---|---|
committer | neels <nhofmeyr@sysmocom.de> | 2021-11-10 17:53:44 +0000 |
commit | a249babf20c5cc42bbb3f8f4554e54a585f8d564 (patch) | |
tree | e355c08255cbbc072f7525fdcfb45168c623fbad | |
parent | c5b16956a73a2c9b49678da5849574fea59a7807 (diff) |
implement bts.N.cm_serv_rej:<cause> rate counters
Related: I0214b27da18af87eca9715ebf7eeeff945e3e12a (osmo-ttcn3-hacks)
Related: SYS#4878
Change-Id: I79b1261e5a281d9797eaaf9c27d90edd8e27c78b
-rw-r--r-- | include/osmocom/bsc/bts.h | 25 | ||||
-rw-r--r-- | src/osmo-bsc/abis_rsl.c | 102 | ||||
-rw-r--r-- | src/osmo-bsc/bts.c | 75 |
3 files changed, 202 insertions, 0 deletions
diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h index 9cf3fa447..89512f379 100644 --- a/include/osmocom/bsc/bts.h +++ b/include/osmocom/bsc/bts.h @@ -162,6 +162,31 @@ enum bts_counter_id { BTS_CTR_ALL_ALLOCATED_STATIC_SDCCH, BTS_CTR_ALL_ALLOCATED_TCH, BTS_CTR_ALL_ALLOCATED_STATIC_TCH, + BTS_CTR_CM_SERV_REJ, + BTS_CTR_CM_SERV_REJ_IMSI_UNKNOWN_IN_HLR, + BTS_CTR_CM_SERV_REJ_ILLEGAL_MS, + BTS_CTR_CM_SERV_REJ_IMSI_UNKNOWN_IN_VLR, + BTS_CTR_CM_SERV_REJ_IMEI_NOT_ACCEPTED, + BTS_CTR_CM_SERV_REJ_ILLEGAL_ME, + BTS_CTR_CM_SERV_REJ_PLMN_NOT_ALLOWED, + BTS_CTR_CM_SERV_REJ_LOC_NOT_ALLOWED, + BTS_CTR_CM_SERV_REJ_ROAMING_NOT_ALLOWED, + BTS_CTR_CM_SERV_REJ_NETWORK_FAILURE, + BTS_CTR_CM_SERV_REJ_SYNCH_FAILURE, + BTS_CTR_CM_SERV_REJ_CONGESTION, + BTS_CTR_CM_SERV_REJ_SRV_OPT_NOT_SUPPORTED, + BTS_CTR_CM_SERV_REJ_RQD_SRV_OPT_NOT_SUPPORTED, + BTS_CTR_CM_SERV_REJ_SRV_OPT_TMP_OUT_OF_ORDER, + BTS_CTR_CM_SERV_REJ_CALL_CAN_NOT_BE_IDENTIFIED, + BTS_CTR_CM_SERV_REJ_INCORRECT_MESSAGE, + BTS_CTR_CM_SERV_REJ_INVALID_MANDANTORY_INF, + BTS_CTR_CM_SERV_REJ_MSG_TYPE_NOT_IMPLEMENTED, + BTS_CTR_CM_SERV_REJ_MSG_TYPE_NOT_COMPATIBLE, + BTS_CTR_CM_SERV_REJ_INF_ELEME_NOT_IMPLEMENTED, + BTS_CTR_CM_SERV_REJ_CONDTIONAL_IE_ERROR, + BTS_CTR_CM_SERV_REJ_MSG_NOT_COMPATIBLE, + BTS_CTR_CM_SERV_REJ_PROTOCOL_ERROR, + BTS_CTR_CM_SERV_REJ_RETRY_IN_NEW_CELL, }; extern const struct rate_ctr_desc bts_ctr_description[]; diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c index c0d621c90..018602441 100644 --- a/src/osmo-bsc/abis_rsl.c +++ b/src/osmo-bsc/abis_rsl.c @@ -1007,6 +1007,106 @@ int rsl_siemens_mrpci(struct gsm_lchan *lchan, struct rsl_mrpci *mrpci) } +/* For 3GPP TS 52.402 unsuccReqsForService, we need to decode the DTAP and count CM Service Reject messages. */ +static void count_unsucc_reqs_for_service(const struct msgb *msg) +{ + struct gsm_bts *bts = msg->lchan->ts->trx->bts; + const struct gsm48_hdr *gh; + uint8_t pdisc, mtype; + uint8_t cause; + + if (msgb_l3len(msg) < sizeof(*gh)) + return; + + gh = msgb_l3(msg); + pdisc = gsm48_hdr_pdisc(gh); + mtype = gsm48_hdr_msg_type(gh); + + if (pdisc != GSM48_PDISC_MM || mtype != GSM48_MT_MM_CM_SERV_REJ) + return; + + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ)); + + cause = gh->data[0]; + switch (cause) { + case GSM48_REJECT_IMSI_UNKNOWN_IN_HLR: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_IMSI_UNKNOWN_IN_HLR)); + break; + case GSM48_REJECT_ILLEGAL_MS: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_ILLEGAL_MS)); + break; + case GSM48_REJECT_IMSI_UNKNOWN_IN_VLR: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_IMSI_UNKNOWN_IN_VLR)); + break; + case GSM48_REJECT_IMEI_NOT_ACCEPTED: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_IMEI_NOT_ACCEPTED)); + break; + case GSM48_REJECT_ILLEGAL_ME: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_ILLEGAL_ME)); + break; + case GSM48_REJECT_PLMN_NOT_ALLOWED: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_PLMN_NOT_ALLOWED)); + break; + case GSM48_REJECT_LOC_NOT_ALLOWED: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_LOC_NOT_ALLOWED)); + break; + case GSM48_REJECT_ROAMING_NOT_ALLOWED: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_ROAMING_NOT_ALLOWED)); + break; + case GSM48_REJECT_NETWORK_FAILURE: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_NETWORK_FAILURE)); + break; + case GSM48_REJECT_SYNCH_FAILURE: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_SYNCH_FAILURE)); + break; + case GSM48_REJECT_CONGESTION: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_CONGESTION)); + break; + case GSM48_REJECT_SRV_OPT_NOT_SUPPORTED: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_SRV_OPT_NOT_SUPPORTED)); + break; + case GSM48_REJECT_RQD_SRV_OPT_NOT_SUPPORTED: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_RQD_SRV_OPT_NOT_SUPPORTED)); + break; + case GSM48_REJECT_SRV_OPT_TMP_OUT_OF_ORDER: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_SRV_OPT_TMP_OUT_OF_ORDER)); + break; + case GSM48_REJECT_CALL_CAN_NOT_BE_IDENTIFIED: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_CALL_CAN_NOT_BE_IDENTIFIED)); + break; + case GSM48_REJECT_INCORRECT_MESSAGE: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_INCORRECT_MESSAGE)); + break; + case GSM48_REJECT_INVALID_MANDANTORY_INF: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_INVALID_MANDANTORY_INF)); + break; + case GSM48_REJECT_MSG_TYPE_NOT_IMPLEMENTED: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_MSG_TYPE_NOT_IMPLEMENTED)); + break; + case GSM48_REJECT_MSG_TYPE_NOT_COMPATIBLE: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_MSG_TYPE_NOT_COMPATIBLE)); + break; + case GSM48_REJECT_INF_ELEME_NOT_IMPLEMENTED: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_INF_ELEME_NOT_IMPLEMENTED)); + break; + case GSM48_REJECT_CONDTIONAL_IE_ERROR: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_CONDTIONAL_IE_ERROR)); + break; + case GSM48_REJECT_MSG_NOT_COMPATIBLE: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_MSG_NOT_COMPATIBLE)); + break; + default: + if (cause >= 48 && cause <= 63) { + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_RETRY_IN_NEW_CELL)); + break; + } + /* else fall thru */ + case GSM48_REJECT_PROTOCOL_ERROR: + rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CM_SERV_REJ_PROTOCOL_ERROR)); + break; + } +} + /* Send "DATA REQUEST" message with given L3 Info payload */ /* Chapter 8.3.1 */ int rsl_data_request(struct msgb *msg, uint8_t link_id) @@ -1019,6 +1119,8 @@ int rsl_data_request(struct msgb *msg, uint8_t link_id) return -EINVAL; } + count_unsucc_reqs_for_service(msg); + chan_nr = gsm_lchan2chan_nr(msg->lchan, true); if (chan_nr < 0) { msgb_free(msg); diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c index 4dd05a9e2..71cf4da89 100644 --- a/src/osmo-bsc/bts.c +++ b/src/osmo-bsc/bts.c @@ -1293,6 +1293,81 @@ const struct rate_ctr_desc bts_ctr_description[] = { [BTS_CTR_ALL_ALLOCATED_STATIC_TCH] = \ { "all_allocated:static_tch", "Cumulative counter of seconds where all non-dynamic TCH channels were allocated" }, + + [BTS_CTR_CM_SERV_REJ] = \ + { "cm_serv_rej", "MSC sent CM Service Reject" }, + [BTS_CTR_CM_SERV_REJ_IMSI_UNKNOWN_IN_HLR] = \ + { "cm_serv_rej:imsi_unknown_in_hlr", + "MSC sent CM Service Reject with cause IMSI_UNKNOWN_IN_HLR" }, + [BTS_CTR_CM_SERV_REJ_ILLEGAL_MS] = \ + { "cm_serv_rej:illegal_ms", + "MSC sent CM Service Reject with cause ILLEGAL_MS" }, + [BTS_CTR_CM_SERV_REJ_IMSI_UNKNOWN_IN_VLR] = \ + { "cm_serv_rej:imsi_unknown_in_vlr", + "MSC sent CM Service Reject with cause IMSI_UNKNOWN_IN_VLR" }, + [BTS_CTR_CM_SERV_REJ_IMEI_NOT_ACCEPTED] = \ + { "cm_serv_rej:imei_not_accepted", + "MSC sent CM Service Reject with cause IMEI_NOT_ACCEPTED" }, + [BTS_CTR_CM_SERV_REJ_ILLEGAL_ME] = \ + { "cm_serv_rej:illegal_me", + "MSC sent CM Service Reject with cause ILLEGAL_ME" }, + [BTS_CTR_CM_SERV_REJ_PLMN_NOT_ALLOWED] = \ + { "cm_serv_rej:plmn_not_allowed", + "MSC sent CM Service Reject with cause PLMN_NOT_ALLOWED" }, + [BTS_CTR_CM_SERV_REJ_LOC_NOT_ALLOWED] = \ + { "cm_serv_rej:loc_not_allowed", + "MSC sent CM Service Reject with cause LOC_NOT_ALLOWED" }, + [BTS_CTR_CM_SERV_REJ_ROAMING_NOT_ALLOWED] = \ + { "cm_serv_rej:roaming_not_allowed", + "MSC sent CM Service Reject with cause ROAMING_NOT_ALLOWED" }, + [BTS_CTR_CM_SERV_REJ_NETWORK_FAILURE] = \ + { "cm_serv_rej:network_failure", + "MSC sent CM Service Reject with cause NETWORK_FAILURE" }, + [BTS_CTR_CM_SERV_REJ_SYNCH_FAILURE] = \ + { "cm_serv_rej:synch_failure", + "MSC sent CM Service Reject with cause SYNCH_FAILURE" }, + [BTS_CTR_CM_SERV_REJ_CONGESTION] = \ + { "cm_serv_rej:congestion", + "MSC sent CM Service Reject with cause CONGESTION" }, + [BTS_CTR_CM_SERV_REJ_SRV_OPT_NOT_SUPPORTED] = \ + { "cm_serv_rej:srv_opt_not_supported", + "MSC sent CM Service Reject with cause SRV_OPT_NOT_SUPPORTED" }, + [BTS_CTR_CM_SERV_REJ_RQD_SRV_OPT_NOT_SUPPORTED] = \ + { "cm_serv_rej:rqd_srv_opt_not_supported", + "MSC sent CM Service Reject with cause RQD_SRV_OPT_NOT_SUPPORTED" }, + [BTS_CTR_CM_SERV_REJ_SRV_OPT_TMP_OUT_OF_ORDER] = \ + { "cm_serv_rej:srv_opt_tmp_out_of_order", + "MSC sent CM Service Reject with cause SRV_OPT_TMP_OUT_OF_ORDER" }, + [BTS_CTR_CM_SERV_REJ_CALL_CAN_NOT_BE_IDENTIFIED] = \ + { "cm_serv_rej:call_can_not_be_identified", + "MSC sent CM Service Reject with cause CALL_CAN_NOT_BE_IDENTIFIED" }, + [BTS_CTR_CM_SERV_REJ_INCORRECT_MESSAGE] = \ + { "cm_serv_rej:incorrect_message", + "MSC sent CM Service Reject with cause INCORRECT_MESSAGE" }, + [BTS_CTR_CM_SERV_REJ_INVALID_MANDANTORY_INF] = \ + { "cm_serv_rej:invalid_mandantory_inf", + "MSC sent CM Service Reject with cause INVALID_MANDANTORY_INF" }, + [BTS_CTR_CM_SERV_REJ_MSG_TYPE_NOT_IMPLEMENTED] = \ + { "cm_serv_rej:msg_type_not_implemented", + "MSC sent CM Service Reject with cause MSG_TYPE_NOT_IMPLEMENTED" }, + [BTS_CTR_CM_SERV_REJ_MSG_TYPE_NOT_COMPATIBLE] = \ + { "cm_serv_rej:msg_type_not_compatible", + "MSC sent CM Service Reject with cause MSG_TYPE_NOT_COMPATIBLE" }, + [BTS_CTR_CM_SERV_REJ_INF_ELEME_NOT_IMPLEMENTED] = \ + { "cm_serv_rej:inf_eleme_not_implemented", + "MSC sent CM Service Reject with cause INF_ELEME_NOT_IMPLEMENTED" }, + [BTS_CTR_CM_SERV_REJ_CONDTIONAL_IE_ERROR] = \ + { "cm_serv_rej:condtional_ie_error", + "MSC sent CM Service Reject with cause CONDTIONAL_IE_ERROR" }, + [BTS_CTR_CM_SERV_REJ_MSG_NOT_COMPATIBLE] = \ + { "cm_serv_rej:msg_not_compatible", + "MSC sent CM Service Reject with cause MSG_NOT_COMPATIBLE" }, + [BTS_CTR_CM_SERV_REJ_PROTOCOL_ERROR] = \ + { "cm_serv_rej:protocol_error", + "MSC sent CM Service Reject with cause PROTOCOL_ERROR" }, + [BTS_CTR_CM_SERV_REJ_RETRY_IN_NEW_CELL] = \ + { "cm_serv_rej:retry_in_new_cell", + "MSC sent CM Service Reject with cause 00110000..00111111, Retry upon entry in a new cell" }, }; const struct rate_ctr_group_desc bts_ctrg_desc = { |