implement bts.N.cm_serv_rej:<cause> rate counters

Related: I0214b27da18af87eca9715ebf7eeeff945e3e12a (osmo-ttcn3-hacks)
Related: SYS#4878
Change-Id: I79b1261e5a281d9797eaaf9c27d90edd8e27c78b
This commit is contained in:
Neels Hofmeyr 2021-11-07 14:05:02 +01:00 committed by neels
parent c5b16956a7
commit a249babf20
3 changed files with 202 additions and 0 deletions

View File

@ -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[];

View File

@ -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);

View File

@ -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 = {