laforge has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmo-hnbgw/+/36788?usp=email )
Change subject: KPI: Add initial set of DTAP message type rate counters
......................................................................
KPI: Add initial set of DTAP message type rate counters
From an operational perspective, it may be interesting to know how many
LU/RAU/Attach attempts, rejects and accepts are happening in a given
hNodeB. Let's add some common infrastructure for DTAP related
statistics as well as some initial counters.
Related: SYS#6885
Change-Id: I3e1ad7a2aa71674a22a27c31512600f2de139032
---
M include/osmocom/hnbgw/hnbgw.h
M include/osmocom/hnbgw/kpi.h
M src/osmo-hnbgw/Makefile.am
M src/osmo-hnbgw/context_map_rua.c
M src/osmo-hnbgw/hnbgw.c
A src/osmo-hnbgw/kpi_dtap.c
M src/osmo-hnbgw/kpi_ranap.c
7 files changed, 195 insertions(+), 3 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-hnbgw refs/changes/88/36788/1
diff --git a/include/osmocom/hnbgw/hnbgw.h b/include/osmocom/hnbgw/hnbgw.h
index 8daf713..dc046a0 100644
--- a/include/osmocom/hnbgw/hnbgw.h
+++ b/include/osmocom/hnbgw/hnbgw.h
@@ -136,6 +136,18 @@
HNB_CTR_CS_PAGING_ATTEMPTED,
HNB_CTR_RAB_ACTIVE_MILLISECONDS_TOTAL,
+
+ HNB_CTR_DTAP_CS_LU_REQ,
+ HNB_CTR_DTAP_CS_LU_ACC,
+ HNB_CTR_DTAP_CS_LU_REJ,
+
+ HNB_CTR_DTAP_PS_ATT_REQ,
+ HNB_CTR_DTAP_PS_ATT_ACK,
+ HNB_CTR_DTAP_PS_ATT_REJ,
+
+ HNB_CTR_DTAP_PS_RAU_REQ,
+ HNB_CTR_DTAP_PS_RAU_ACK,
+ HNB_CTR_DTAP_PS_RAU_REJ,
};
enum hnb_stat {
diff --git a/include/osmocom/hnbgw/kpi.h b/include/osmocom/hnbgw/kpi.h
index 63f3477..2a13972 100644
--- a/include/osmocom/hnbgw/kpi.h
+++ b/include/osmocom/hnbgw/kpi.h
@@ -6,3 +6,6 @@
void kpi_ranap_process_ul(struct hnbgw_context_map *map, ranap_message *ranap);
void kpi_ranap_process_dl(struct hnbgw_context_map *map, ranap_message *ranap);
+
+void kpi_dtap_process_ul(struct hnbgw_context_map *map, const uint8_t *buf, unsigned int
len, uint8_t sapi);
+void kpi_dtap_process_dl(struct hnbgw_context_map *map, const uint8_t *buf, unsigned int
len, uint8_t sapi);
diff --git a/src/osmo-hnbgw/Makefile.am b/src/osmo-hnbgw/Makefile.am
index 0727f30..9dffabf 100644
--- a/src/osmo-hnbgw/Makefile.am
+++ b/src/osmo-hnbgw/Makefile.am
@@ -44,6 +44,7 @@
cnlink.c \
ranap_rab_ass.c \
mgw_fsm.c \
+ kpi_dtap.c \
kpi_ranap.c \
tdefs.c \
$(NULL)
diff --git a/src/osmo-hnbgw/context_map_rua.c b/src/osmo-hnbgw/context_map_rua.c
index f37ded8..d5b2cb7 100644
--- a/src/osmo-hnbgw/context_map_rua.c
+++ b/src/osmo-hnbgw/context_map_rua.c
@@ -220,10 +220,9 @@
switch (event) {
case MAP_RUA_EV_RX_CONNECT:
+ /* not needed for RAB assignment scanning, but for KPI scanning */
+ handle_rx_rua(fi, ranap_msg);
map_rua_fsm_state_chg(MAP_RUA_ST_CONNECTED);
- /* The Connect will never be a RAB Assignment response, so no need for handle_rx_rua()
(which decodes
- * the RANAP message to detect a RAB Assignment response). Just forward to SCCP as is.
*/
- map_sccp_dispatch(map, MAP_SCCP_EV_TX_DATA_REQUEST, ranap_msg);
return;
case MAP_RUA_EV_RX_DISCONNECT:
diff --git a/src/osmo-hnbgw/hnbgw.c b/src/osmo-hnbgw/hnbgw.c
index fe29c29..b102bcf 100644
--- a/src/osmo-hnbgw/hnbgw.c
+++ b/src/osmo-hnbgw/hnbgw.c
@@ -464,6 +464,18 @@
[HNB_CTR_RAB_ACTIVE_MILLISECONDS_TOTAL] = {
"rab:cs:active_milliseconds:total", "Cumulative number of milliseconds
of CS RAB activity" },
+
+ [HNB_CTR_DTAP_CS_LU_REQ] = { "dtap:cs:location_update:req", "CS Location
Update Requests" },
+ [HNB_CTR_DTAP_CS_LU_ACC] = { "dtap:cs:location_update:accept", "CS
Location Update Accepts" },
+ [HNB_CTR_DTAP_CS_LU_REJ] = { "dtap:cs:location_update:reject", "CS
Location Update Rejects" },
+
+ [HNB_CTR_DTAP_PS_ATT_REQ] = { "dtap:ps:attach:req", "PS Attach
Requests" },
+ [HNB_CTR_DTAP_PS_ATT_ACK] = { "dtap:ps:attach:accept", "PS Attach
Accepts" },
+ [HNB_CTR_DTAP_PS_ATT_REJ] = { "dtap:ps:attach:reject", "PS Attach
Rejects" },
+
+ [HNB_CTR_DTAP_PS_RAU_REQ] = { "dtap:ps:routing_area_update:req", "PS
Attach Requests" },
+ [HNB_CTR_DTAP_PS_RAU_ACK] = { "dtap:ps:routing_area_update:accept", "PS
Attach Accepts" },
+ [HNB_CTR_DTAP_PS_RAU_REJ] = { "dtap:ps:routing_area_update:reject", "PS
Attach Rejects" },
};
const struct rate_ctr_group_desc hnb_ctrg_desc = {
diff --git a/src/osmo-hnbgw/kpi_dtap.c b/src/osmo-hnbgw/kpi_dtap.c
new file mode 100644
index 0000000..8d47208
--- /dev/null
+++ b/src/osmo-hnbgw/kpi_dtap.c
@@ -0,0 +1,111 @@
+/* KPI (statistics, counters) at DTAP level */
+/* (C) 2024 by Harald Welte <laforge(a)osmocom.org>
+ * All Rights Reserved
+ *
+ * SPDX-License-Identifier: AGPL-3.0+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <osmocom/core/utils.h>
+
+#include <osmocom/ranap/ranap_common_ran.h>
+#include <osmocom/gsm/protocol/gsm_04_08.h>
+#include <osmocom/gsm/protocol/gsm_04_08_gprs.h>
+
+#include <osmocom/hnbgw/hnbgw.h>
+#include <osmocom/hnbgw/context_map.h>
+#include <osmocom/hnbgw/kpi.h>
+
+/***********************************************************************
+ * DOWNLINK messages
+ ***********************************************************************/
+
+void kpi_dtap_process_dl(struct hnbgw_context_map *map, const uint8_t *buf, unsigned int
len,
+ uint8_t sapi)
+{
+ struct hnb_persistent *hnbp = map->hnb_ctx->persistent;
+ const struct gsm48_hdr *gh = (const struct gsm48_hdr *)buf;
+ if (len < sizeof(*gh))
+ return;
+
+ /* if you make use of any data beyond the fixed-size gsm48_hdr, you must make sure the
underlying
+ * buffer length is actually long enough! */
+
+ if (map->is_ps) {
+ /* Packet Switched Domain (from SGSN) */
+ switch (gsm48_hdr_msg_type(gh)) {
+ case GSM48_MT_GMM_ATTACH_ACK:
+ HNBP_CTR_INC(hnbp, HNB_CTR_DTAP_PS_ATT_ACK);
+ break;
+ case GSM48_MT_GMM_ATTACH_REJ:
+ HNBP_CTR_INC(hnbp, HNB_CTR_DTAP_PS_ATT_REJ);
+ break;
+ case GSM48_MT_GMM_RA_UPD_ACK:
+ HNBP_CTR_INC(hnbp, HNB_CTR_DTAP_PS_RAU_ACK);
+ break;
+ case GSM48_MT_GMM_RA_UPD_REJ:
+ HNBP_CTR_INC(hnbp, HNB_CTR_DTAP_PS_RAU_REJ);
+ break;
+ }
+ } else {
+ /* Circuit Switched Domain (from MSC) */
+ switch (gsm48_hdr_msg_type(gh)) {
+ case GSM48_MT_MM_LOC_UPD_ACCEPT:
+ /* FIXME: many LU are acknwoeldged implicitly with TMSI allocation */
+ HNBP_CTR_INC(hnbp, HNB_CTR_DTAP_CS_LU_ACC);
+ break;
+ case GSM48_MT_MM_LOC_UPD_REJECT:
+ HNBP_CTR_INC(hnbp, HNB_CTR_DTAP_CS_LU_REJ);
+ break;
+ }
+ }
+}
+
+/***********************************************************************
+ * UPLINK messages
+ ***********************************************************************/
+
+void kpi_dtap_process_ul(struct hnbgw_context_map *map, const uint8_t *buf, unsigned int
len,
+ uint8_t sapi)
+{
+ struct hnb_persistent *hnbp = map->hnb_ctx->persistent;
+ const struct gsm48_hdr *gh = (const struct gsm48_hdr *)buf;
+ if (len < sizeof(*gh))
+ return;
+
+ /* if you make use of any data beyond the fixed-size gsm48_hdr, you must make sure the
underlying
+ * buffer length is actually long enough! */
+
+ if (map->is_ps) {
+ /* Packet Switched Domain (to SGSN) */
+ switch (gsm48_hdr_msg_type(gh)) {
+ case GSM48_MT_GMM_ATTACH_REQ:
+ HNBP_CTR_INC(hnbp, HNB_CTR_DTAP_PS_ATT_REQ);
+ break;
+ case GSM48_MT_GMM_RA_UPD_REQ:
+ HNBP_CTR_INC(hnbp, HNB_CTR_DTAP_PS_RAU_REQ);
+ break;
+ }
+ } else {
+ /* Circuit Switched Domain (to MSC) */
+ switch (gsm48_hdr_msg_type(gh)) {
+ case GSM48_MT_MM_LOC_UPD_REQUEST:
+ HNBP_CTR_INC(hnbp, HNB_CTR_DTAP_CS_LU_REQ);
+ break;
+ }
+ }
+}
diff --git a/src/osmo-hnbgw/kpi_ranap.c b/src/osmo-hnbgw/kpi_ranap.c
index c4460ff..59631cf 100644
--- a/src/osmo-hnbgw/kpi_ranap.c
+++ b/src/osmo-hnbgw/kpi_ranap.c
@@ -165,6 +165,18 @@
}
}
+static void kpi_ranap_process_dl_direct_transfer(struct hnbgw_context_map *map,
ranap_message *ranap)
+{
+ const RANAP_DirectTransferIEs_t *dt_ies = &ranap->msg.directTransferIEs;
+ uint8_t sapi = 0;
+
+ if (dt_ies->presenceMask & DIRECTTRANSFERIES_RANAP_SAPI_PRESENT) {
+ if (dt_ies->sapi == RANAP_SAPI_sapi_3)
+ sapi = 3;
+ }
+ kpi_dtap_process_dl(map, dt_ies->nas_pdu.buf, dt_ies->nas_pdu.size, sapi);
+}
+
void kpi_ranap_process_dl(struct hnbgw_context_map *map, ranap_message *ranap)
{
switch (ranap->procedureCode) {
@@ -174,6 +186,9 @@
case RANAP_ProcedureCode_id_Iu_Release:
kpi_ranap_process_dl_iu_rel_cmd(map, ranap); /* IU RELEASE CMD (8.5) */
break;
+ case RANAP_ProcedureCode_id_DirectTransfer:
+ kpi_ranap_process_dl_direct_transfer(map, ranap);
+ break;
default:
break;
}
@@ -370,6 +385,24 @@
}
}
+static void kpi_ranap_process_ul_initial_ue(struct hnbgw_context_map *map, ranap_message
*ranap)
+{
+ const RANAP_InitialUE_MessageIEs_t *iue_ies = &ranap->msg.initialUE_MessageIEs;
+ kpi_dtap_process_ul(map, iue_ies->nas_pdu.buf, iue_ies->nas_pdu.size, 0);
+}
+
+static void kpi_ranap_process_ul_direct_transfer(struct hnbgw_context_map *map,
ranap_message *ranap)
+{
+ const RANAP_DirectTransferIEs_t *dt_ies = &ranap->msg.directTransferIEs;
+ uint8_t sapi = 0;
+
+ if (dt_ies->presenceMask & DIRECTTRANSFERIES_RANAP_SAPI_PRESENT) {
+ if (dt_ies->sapi == RANAP_SAPI_sapi_3)
+ sapi = 3;
+ }
+ kpi_dtap_process_ul(map, dt_ies->nas_pdu.buf, dt_ies->nas_pdu.size, sapi);
+}
+
void kpi_ranap_process_ul(struct hnbgw_context_map *map, ranap_message *ranap)
{
switch (ranap->procedureCode) {
@@ -382,6 +415,12 @@
* processing of the downlink Iu Release Command. It's not like the RNC/HNB has
any way to
* refuse the release anyway. */
break;
+ case RANAP_ProcedureCode_id_InitialUE_Message:
+ kpi_ranap_process_ul_initial_ue(map, ranap);
+ break;
+ case RANAP_ProcedureCode_id_DirectTransfer:
+ kpi_ranap_process_ul_direct_transfer(map, ranap);
+ break;
default:
break;
}
--
To view, visit
https://gerrit.osmocom.org/c/osmo-hnbgw/+/36788?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-hnbgw
Gerrit-Branch: master
Gerrit-Change-Id: I3e1ad7a2aa71674a22a27c31512600f2de139032
Gerrit-Change-Number: 36788
Gerrit-PatchSet: 1
Gerrit-Owner: laforge <laforge(a)osmocom.org>
Gerrit-MessageType: newchange