laforge has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bsc/+/18190 )
Change subject: stats: Add counters for Tx BSSMAP messages. ...................................................................... stats: Add counters for Tx BSSMAP messages. We already have counters for Rx side, now we also count Tx side. See comments in the msc_ctr_description array implementation for the details. Change-Id: I89a173f6bdd9a3c21233fe01d07ab2ff0442bb10 --- M include/osmocom/bsc/bsc_msc_data.h M src/osmo-bsc/assignment_fsm.c M src/osmo-bsc/bsc_subscr_conn_fsm.c M src/osmo-bsc/gsm_08_08.c M src/osmo-bsc/handover_fsm.c M src/osmo-bsc/osmo_bsc_bssap.c M src/osmo-bsc/osmo_bsc_msc.c M src/osmo-bsc/osmo_bsc_sigtran.c 8 files changed, 105 insertions(+), 3 deletions(-) Approvals: Jenkins Builder: Verified pespin: Looks good to me, but someone else must approve laforge: Looks good to me, approved diff --git a/include/osmocom/bsc/bsc_msc_data.h b/include/osmocom/bsc/bsc_msc_data.h index dc9628b..7db0625 100644 --- a/include/osmocom/bsc/bsc_msc_data.h +++ b/include/osmocom/bsc/bsc_msc_data.h @@ -58,6 +58,7 @@ /* Constants for the MSC rate counters */ enum { + /* Rx message counters */ MSC_CTR_BSSMAP_RX_UDT_RESET_ACKNOWLEDGE, MSC_CTR_BSSMAP_RX_UDT_RESET, MSC_CTR_BSSMAP_RX_UDT_PAGING, @@ -71,6 +72,35 @@ MSC_CTR_BSSMAP_RX_DT1_UNKNOWN, MSC_CTR_BSSMAP_RX_DTAP_MSG, MSC_CTR_BSSMAP_RX_DTAP_ERROR, + + /* Tx message counters (per connection type) */ + MSC_CTR_BSSMAP_TX_BSS_MANAGEMENT, + MSC_CTR_BSSMAP_TX_DTAP, + MSC_CTR_BSSMAP_TX_UNKNOWN, + MSC_CTR_BSSMAP_TX_SHORT, + MSC_CTR_BSSMAP_TX_ERR_CONN_NOT_READY, + MSC_CTR_BSSMAP_TX_ERR_SEND, + MSC_CTR_BSSMAP_TX_SUCCESS, + + /* Tx message counters (per message type) */ + MSC_CTR_BSSMAP_TX_UDT_RESET, + MSC_CTR_BSSMAP_TX_UDT_RESET_ACK, + MSC_CTR_BSSMAP_TX_DT1_CLEAR_RQST, + MSC_CTR_BSSMAP_TX_DT1_CLEAR_COMPLETE, + MSC_CTR_BSSMAP_TX_DT1_ASSIGMENT_FAILURE, + MSC_CTR_BSSMAP_TX_DT1_ASSIGMENT_COMPLETE, + MSC_CTR_BSSMAP_TX_DT1_SAPI_N_REJECT, + MSC_CTR_BSSMAP_TX_DT1_CIPHER_COMPLETE, + MSC_CTR_BSSMAP_TX_DT1_CIPHER_REJECT, + MSC_CTR_BSSMAP_TX_DT1_CLASSMARK_UPDATE, + MSC_CTR_BSSMAP_TX_DT1_LCLS_CONNECT_CTRL_ACK, + MSC_CTR_BSSMAP_TX_DT1_HANDOVER_REQUIRED, + MSC_CTR_BSSMAP_TX_DT1_HANDOVER_PERFORMED, + MSC_CTR_BSSMAP_TX_DT1_HANDOVER_RQST_ACKNOWLEDGE, + MSC_CTR_BSSMAP_TX_DT1_HANDOVER_DETECT, + MSC_CTR_BSSMAP_TX_DT1_HANDOVER_COMPLETE, + MSC_CTR_BSSMAP_TX_DT1_HANDOVER_FAILURE, + MSC_CTR_BSSMAP_TX_DT1_DTAP, }; /* Constants for the MSC stats */ diff --git a/src/osmo-bsc/assignment_fsm.c b/src/osmo-bsc/assignment_fsm.c index 16e04cd..674dcbc 100644 --- a/src/osmo-bsc/assignment_fsm.c +++ b/src/osmo-bsc/assignment_fsm.c @@ -116,10 +116,12 @@ { struct msgb *resp = gsm0808_create_assignment_failure(conn->assignment.failure_cause, NULL); - if (!resp) + if (!resp) { LOG_ASSIGNMENT(conn, LOGL_ERROR, "Unable to compose BSSMAP Assignment Failure message\n"); - else + } else { + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_ASSIGMENT_FAILURE]); gscon_sigtran_send(conn, resp); + } /* If assignment failed as early as in assignment_fsm_start(), there may not be an fi yet. */ if (conn->assignment.fi) { @@ -206,6 +208,7 @@ conn->assignment.req.use_osmux) _gsm0808_ass_compl_extend_osmux(resp, osmux_cid); + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_ASSIGMENT_COMPLETE]); rc = gscon_sigtran_send(conn, resp); if (rc) { assignment_fail(GSM0808_CAUSE_EQUIPMENT_FAILURE, diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c index 77d5d1a..0b475ff 100644 --- a/src/osmo-bsc/bsc_subscr_conn_fsm.c +++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c @@ -143,6 +143,7 @@ LOGPFSML(conn->fi, LOGL_ERROR, "Unable to compose BSSMAP Clear Request message\n"); return; } + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_CLEAR_RQST]); rc = osmo_bsc_sigtran_send(conn, resp); if (rc < 0) LOGPFSML(conn->fi, LOGL_ERROR, "Unable to deliver BSSMAP Clear Request message\n"); @@ -157,6 +158,7 @@ OSMO_ASSERT(conn); resp = gsm0808_create_dtap(msg, OBSC_LINKID_CB(msg)); + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_DTAP]); gscon_sigtran_send(conn, resp); } @@ -761,6 +763,7 @@ /* Close MGCP connections */ osmo_mgcpc_ep_clear(conn->user_plane.mgw_endpoint); + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_CLEAR_COMPLETE]); gscon_sigtran_send(conn, gsm0808_create_clear_complete()); break; case GSCON_EV_A_DISC_IND: diff --git a/src/osmo-bsc/gsm_08_08.c b/src/osmo-bsc/gsm_08_08.c index 3efc665..4f9c69e 100644 --- a/src/osmo-bsc/gsm_08_08.c +++ b/src/osmo-bsc/gsm_08_08.c @@ -133,6 +133,7 @@ LOGP(DMSC, LOGL_NOTICE, "Tx MSC SAPI N REJECT DLCI=0x%02x\n", dlci); resp = gsm0808_create_sapi_reject(dlci); + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_SAPI_N_REJECT]); rc = osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_TX_SCCP, resp); if (rc != 0) msgb_free(resp); @@ -149,6 +150,7 @@ LOGP(DMSC, LOGL_DEBUG, "CIPHER MODE COMPLETE from MS, forwarding to MSC\n"); resp = gsm0808_create_cipher_complete(msg, chosen_encr); + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_CIPHER_COMPLETE]); rc = osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_TX_SCCP, resp); if (rc != 0) msgb_free(resp); @@ -712,6 +714,7 @@ return 1; } + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_CLEAR_RQST]); rc = osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_TX_SCCP, resp); if (rc != 0) msgb_free(resp); @@ -742,6 +745,7 @@ if (!msc_connected(conn)) return; + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_CLASSMARK_UPDATE]); resp = gsm0808_create_classmark_update(cm2, cm2_len, cm3, cm3_len); rc = osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_TX_SCCP, resp); if (rc != 0) diff --git a/src/osmo-bsc/handover_fsm.c b/src/osmo-bsc/handover_fsm.c index e36aaae..0b88b27 100644 --- a/src/osmo-bsc/handover_fsm.c +++ b/src/osmo-bsc/handover_fsm.c @@ -773,6 +773,7 @@ return; } + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_HANDOVER_PERFORMED]); rc = gscon_sigtran_send(conn, msg); if (rc < 0) { LOG_HO(conn, LOGL_ERROR, "message sending failed, can't send HANDOVER PERFORMED!\n"); diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c index b92e39a..276657f 100644 --- a/src/osmo-bsc/osmo_bsc_bssap.c +++ b/src/osmo-bsc/osmo_bsc_bssap.c @@ -560,6 +560,7 @@ return -1; } + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_CIPHER_REJECT]); osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_TX_SCCP, resp); return -1; } @@ -640,6 +641,7 @@ LOGPFSM(conn->fi, "Tx LCLS CONNECT CTRL ACK (%s)\n", gsm0808_lcls_status_name(lcls_get_status(conn))); resp = gsm0808_create_lcls_conn_ctrl_ack(lcls_get_status(conn)); + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_LCLS_CONNECT_CTRL_ACK]); osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_TX_SCCP, resp); return 0; @@ -954,6 +956,7 @@ resp = gsm0808_create_assignment_failure(cause, NULL); OSMO_ASSERT(resp); + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_ASSIGMENT_FAILURE]); osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_TX_SCCP, resp); return -1; } @@ -1273,6 +1276,7 @@ return -EINVAL; } + rate_ctr_inc(&lchan->conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_HANDOVER_REQUIRED]); rc = gscon_sigtran_send(lchan->conn, msg); if (rc) { LOG_HO(lchan->conn, LOGL_ERROR, "Cannot send BSSMAP Handover Required message\n"); @@ -1318,6 +1322,7 @@ params.aoip_transport_layer = &ss; } + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_HANDOVER_RQST_ACKNOWLEDGE]); LOG_HO(conn, LOGL_DEBUG, "Sending BSSMAP Handover Request Acknowledge\n"); msg = gsm0808_create_handover_request_ack2(¶ms); msgb_free(rr_ho_command); @@ -1333,6 +1338,7 @@ if (!msg) return -ENOMEM; + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_HANDOVER_DETECT]); return osmo_bsc_sigtran_send(conn, msg); } @@ -1372,6 +1378,7 @@ return HO_RESULT_ERROR; } + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_HANDOVER_COMPLETE]); rc = osmo_bsc_sigtran_send(conn, msg); if (rc) { LOG_HO(conn, LOGL_ERROR, "Cannot send BSSMAP Handover Complete message\n"); @@ -1393,6 +1400,7 @@ return; } + rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_HANDOVER_FAILURE]); rc = osmo_bsc_sigtran_send(conn, msg); if (rc) LOG_HO(conn, LOGL_ERROR, "Cannot send BSSMAP Handover Failure message (rc=%d %s)\n", diff --git a/src/osmo-bsc/osmo_bsc_msc.c b/src/osmo-bsc/osmo_bsc_msc.c index 544341b..0dbe9d4 100644 --- a/src/osmo-bsc/osmo_bsc_msc.c +++ b/src/osmo-bsc/osmo_bsc_msc.c @@ -44,6 +44,7 @@ #include <unistd.h> static const struct rate_ctr_desc msc_ctr_description[] = { + /* Rx message counters */ [MSC_CTR_BSSMAP_RX_UDT_RESET_ACKNOWLEDGE] = {"bssmap:rx_udt_reset_acknowledge", "Number of received BSSMAP UDT RESET ACKNOWLEDGE messages"}, [MSC_CTR_BSSMAP_RX_UDT_RESET] = {"bssmap:rx_udt_reset", "Number of received BSSMAP UDT RESET messages"}, [MSC_CTR_BSSMAP_RX_UDT_PAGING] = {"bssmap:rx_udt_paging", "Number of received BSSMAP UDT PAGING messages"}, @@ -57,6 +58,46 @@ [MSC_CTR_BSSMAP_RX_DT1_UNKNOWN] = {"bssmap:rx_dt1_unknown", "Number of received BSSMAP unknown DT1 messages"}, [MSC_CTR_BSSMAP_RX_DTAP_MSG] = {"bssmap:rx_dtap_msg", "Number of received BSSMAP DTAP messages"}, [MSC_CTR_BSSMAP_RX_DTAP_ERROR] = {"bssmap:rx_dtap_error", "Number of received BSSMAP DTAP messages with errors"}, + + /* Tx message counters (per message type) + * + * The counters here follow the logic of the osmo_bsc_sigtran_send() function + * which receives DT1 messages from the upper layers and actually sends them to the MSC. + * These counters cover all messages passed to the function by the upper layers: */ + [MSC_CTR_BSSMAP_TX_BSS_MANAGEMENT] = {"bssmap:tx:type:bss_management", "Number of transmitted BSS MANAGEMENT messages"}, + [MSC_CTR_BSSMAP_TX_DTAP] = {"bssmap:tx:type:dtap", "Number of transmitted DTAP messages"}, + [MSC_CTR_BSSMAP_TX_UNKNOWN] = {"bssmap:tx:type:err_unknown", "Number of transmitted messages with unknown type (an error in our code?)"}, + [MSC_CTR_BSSMAP_TX_SHORT] = {"bssmap:tx:type:err_short", "Number of transmitted messages which are too short (an error in our code?)"}, + /* The next counters are also counted in the osmo_bsc_sigtran_send() function and + * sum up to the exactly same number as the counters above but instead of message + * classes they split by the result of the sending attempt: */ + [MSC_CTR_BSSMAP_TX_ERR_CONN_NOT_READY] = {"bssmap:tx:result:err_conn_not_ready", "Number of BSSMAP messages we tried to send when the connection was not ready yet"}, + [MSC_CTR_BSSMAP_TX_ERR_SEND] = {"bssmap:tx:result:err_send", "Number of socket errors while sending BSSMAP messages"}, + [MSC_CTR_BSSMAP_TX_SUCCESS] = {"bssmap:tx:result:success", "Number of successfully sent BSSMAP messages"}, + + /* Tx message counters (per specific message) + * + * Theoretically, the DT1 counters should sum up to the same number as the Tx counters + * above but since these counters are coming from the upper layers, there might be + * some difference if we forget some code path. */ + [MSC_CTR_BSSMAP_TX_UDT_RESET] = {"bssmap:tx:udt:reset:request", "Number of transmitted BSSMAP UDT RESET messages"}, + [MSC_CTR_BSSMAP_TX_UDT_RESET_ACK] = {"bssmap:tx:udt:reset:ack", "Number of transmitted BSSMAP UDT RESET ACK messages"}, + [MSC_CTR_BSSMAP_TX_DT1_CLEAR_RQST] = {"bssmap:tx:dt1:clear:rqst", "Number of transmitted BSSMAP DT1 CLEAR RQSTtx messages"}, + [MSC_CTR_BSSMAP_TX_DT1_CLEAR_COMPLETE] = {"bssmap:tx:dt1:clear:complete", "Number of transmitted BSSMAP DT1 CLEAR COMPLETE messages"}, + [MSC_CTR_BSSMAP_TX_DT1_ASSIGMENT_FAILURE] = {"bssmap:tx:dt1:assigment:failure", "Number of transmitted BSSMAP DT1 ASSIGMENT FAILURE messages"}, + [MSC_CTR_BSSMAP_TX_DT1_ASSIGMENT_COMPLETE] = {"bssmap:tx:dt1:assigment:complete", "Number of transmitted BSSMAP DT1 ASSIGMENT COMPLETE messages"}, + [MSC_CTR_BSSMAP_TX_DT1_SAPI_N_REJECT] = {"bssmap:tx:dt1:sapi_n:reject", "Number of transmitted BSSMAP DT1 SAPI N REJECT messages"}, + [MSC_CTR_BSSMAP_TX_DT1_CIPHER_COMPLETE] = {"bssmap:tx:dt1:cipher_mode:complete", "Number of transmitted BSSMAP DT1 CIPHER COMPLETE messages"}, + [MSC_CTR_BSSMAP_TX_DT1_CIPHER_REJECT] = {"bssmap:tx:dt1:cipher_mode:reject", "Number of transmitted BSSMAP DT1 CIPHER REJECT messages"}, + [MSC_CTR_BSSMAP_TX_DT1_CLASSMARK_UPDATE] = {"bssmap:tx:dt1:classmark:update", "Number of transmitted BSSMAP DT1 CLASSMARK UPDATE messages"}, + [MSC_CTR_BSSMAP_TX_DT1_LCLS_CONNECT_CTRL_ACK] = {"bssmap:tx:dt1:lcls_connect_ctrl:ack", "Number of transmitted BSSMAP DT1 LCLS CONNECT CTRL ACK messages"}, + [MSC_CTR_BSSMAP_TX_DT1_HANDOVER_REQUIRED] = {"bssmap:tx:dt1:handover:required", "Number of transmitted BSSMAP DT1 HANDOVER REQUIRED messages"}, + [MSC_CTR_BSSMAP_TX_DT1_HANDOVER_PERFORMED] = {"bssmap:tx:dt1:handover:performed", "Number of transmitted BSSMAP DT1 HANDOVER PERFORMED messages"}, + [MSC_CTR_BSSMAP_TX_DT1_HANDOVER_RQST_ACKNOWLEDGE] = {"bssmap:tx:dt1:handover:rqst_acknowledge", "Number of transmitted BSSMAP DT1 HANDOVER RQST ACKNOWLEDGE messages"}, + [MSC_CTR_BSSMAP_TX_DT1_HANDOVER_DETECT] = {"bssmap:tx:dt1:handover:detect", "Number of transmitted BSSMAP DT1 HANDOVER DETECT messages"}, + [MSC_CTR_BSSMAP_TX_DT1_HANDOVER_COMPLETE] = {"bssmap:tx:dt1:handover:complete", "Number of transmitted BSSMAP DT1 HANDOVER COMPLETE messages"}, + [MSC_CTR_BSSMAP_TX_DT1_HANDOVER_FAILURE] = {"bssmap:tx:dt1:handover:failure", "Number of transmitted BSSMAP DT1 HANDOVER FAILURE messages"}, + [MSC_CTR_BSSMAP_TX_DT1_DTAP] = {"bssmap:tx:dt1:dtap", "Number of transmitted BSSMAP DT1 DTAP messages"}, }; static const struct rate_ctr_group_desc msc_ctrg_desc = { diff --git a/src/osmo-bsc/osmo_bsc_sigtran.c b/src/osmo-bsc/osmo_bsc_sigtran.c index e4530bf..3871682 100644 --- a/src/osmo-bsc/osmo_bsc_sigtran.c +++ b/src/osmo-bsc/osmo_bsc_sigtran.c @@ -105,6 +105,7 @@ if (msc_is_aoip(msc) && msc->use_osmux != OSMUX_USAGE_OFF) _gsm0808_extend_announce_osmux(msg); + rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_UDT_RESET]); osmo_sccp_tx_unitdata_msg(msc->a.sccp_user, &msc->a.bsc_addr, &msc->a.msc_addr, msg); } @@ -124,6 +125,7 @@ if (msc_is_aoip(msc) && msc->use_osmux != OSMUX_USAGE_OFF) _gsm0808_extend_announce_osmux(msg); + rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_UDT_RESET_ACK]); osmo_sccp_tx_unitdata_msg(msc->a.sccp_user, &msc->a.bsc_addr, &msc->a.msc_addr, msg); } @@ -383,20 +385,26 @@ if (msg->len >= 3) { switch (msg->data[0]) { case BSSAP_MSG_BSS_MANAGEMENT: + rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_BSS_MANAGEMENT]); LOGP(DMSC, LOGL_INFO, "Tx MSC: BSSMAP: %s\n", gsm0808_bssmap_name(msg->data[2])); break; case BSSAP_MSG_DTAP: + rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DTAP]); LOGP(DMSC, LOGL_INFO, "Tx MSC: DTAP\n"); break; default: + rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_UNKNOWN]); LOGP(DMSC, LOGL_ERROR, "Tx MSC: unknown message type: 0x%x\n", msg->data[0]); } - } else + } else { + rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_SHORT]); LOGP(DMSC, LOGL_ERROR, "Tx MSC: message too short: %u\n", msg->len); + } if (a_reset_conn_ready(msc) == false) { + rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_ERR_CONN_NOT_READY]); LOGP(DMSC, LOGL_ERROR, "MSC is not connected. Dropping.\n"); msgb_free(msg); return -EINVAL; @@ -410,6 +418,10 @@ conn_id, osmo_sccp_addr_name(ss7, &msc->a.msc_addr), osmo_hexdump(msg->data, msg->len)); rc = osmo_sccp_tx_data_msg(msc->a.sccp_user, conn_id, msg); + if (rc >= 0) + rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_SUCCESS]); + else + rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_ERR_SEND]); return rc; } -- To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/18190 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bsc Gerrit-Branch: master Gerrit-Change-Id: I89a173f6bdd9a3c21233fe01d07ab2ff0442bb10 Gerrit-Change-Number: 18190 Gerrit-PatchSet: 3 Gerrit-Owner: ipse <alexander.cheme...@gmail.com> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: ipse <alexander.cheme...@gmail.com> Gerrit-Reviewer: laforge <lafo...@osmocom.org> Gerrit-Reviewer: pespin <pes...@sysmocom.de> Gerrit-MessageType: merged