Change in osmo-bts[master]: Add severity to OML FAILURE EVENT REPORT

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

Harald Welte gerrit-no-reply at lists.osmocom.org
Sat May 25 08:20:40 UTC 2019


Harald Welte has uploaded this change for review. ( https://gerrit.osmocom.org/14173


Change subject: Add severity to OML FAILURE EVENT REPORT
......................................................................

Add severity to OML FAILURE EVENT REPORT

Example: The fact that the PCU has connected with a given version is not
a *failure* in the first place, particularly not a MAJOR one.  Let's
allow callers of oml_tx_failure_event_rep() specify the serverity of the
event that they're reporting to the BSC.

Change-Id: I49af04212568892648e0e8704ba1cc6de8c8ae89
---
M include/osmo-bts/oml.h
M src/common/bts.c
M src/common/bts_ctrl_commands.c
M src/common/l1sap.c
M src/common/main.c
M src/common/oml.c
M src/common/pcu_sock.c
M src/common/rsl.c
M src/osmo-bts-oc2g/calib_file.c
9 files changed, 49 insertions(+), 48 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/73/14173/1

diff --git a/include/osmo-bts/oml.h b/include/osmo-bts/oml.h
index 5136058..14da70e 100644
--- a/include/osmo-bts/oml.h
+++ b/include/osmo-bts/oml.h
@@ -45,7 +45,7 @@
 extern const unsigned int oml_default_t200_ms[7];
 
 /* Transmit failure event report */
-int oml_tx_failure_event_rep(const struct gsm_abis_mo *mo, uint16_t cause_value,
-			     const char *fmt, ...);
+int oml_tx_failure_event_rep(const struct gsm_abis_mo *mo, enum abis_nm_severity severity,
+			     uint16_t cause_value, const char *fmt, ...);
 
 #endif // _OML_H */
diff --git a/src/common/bts.c b/src/common/bts.c
index 5220406..97e7a8b 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -340,7 +340,7 @@
 	else
 		rc = bts_model_trx_deact_rf(trx);
 	if (rc < 0) {
-		oml_tx_failure_event_rep(&trx->bb_transc.mo, OSMO_EVT_MAJ_RSL_FAIL,
+		oml_tx_failure_event_rep(&trx->bb_transc.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_RSL_FAIL,
 					 link ?
 					 "Failed to establish RSL link (%d)" :
 					 "Failed to deactivate RF (%d)", rc);
diff --git a/src/common/bts_ctrl_commands.c b/src/common/bts_ctrl_commands.c
index 47d8a5d..0d31890 100644
--- a/src/common/bts_ctrl_commands.c
+++ b/src/common/bts_ctrl_commands.c
@@ -77,7 +77,7 @@
 static int set_oml_alert(struct ctrl_cmd *cmd, void *data)
 {
 	/* Note: we expect signal dispatch to be synchronous */
-	oml_tx_failure_event_rep(&g_bts->mo, OSMO_EVT_EXT_ALARM, cmd->value);
+	oml_tx_failure_event_rep(&g_bts->mo, NM_SEVER_INDETERMINATE, OSMO_EVT_EXT_ALARM, cmd->value);
 
 	cmd->reply = "OK";
 
diff --git a/src/common/l1sap.c b/src/common/l1sap.c
index 52f2b33..59d5b93 100644
--- a/src/common/l1sap.c
+++ b/src/common/l1sap.c
@@ -1358,7 +1358,7 @@
 	default:
 		LOGP(DL1P, LOGL_NOTICE, "unknown prim %d op %d\n",
 			l1sap->oph.primitive, l1sap->oph.operation);
-		oml_tx_failure_event_rep(&trx->mo, OSMO_EVT_MAJ_UKWN_MSG,
+		oml_tx_failure_event_rep(&trx->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,
 					 "unknown prim %d op %d",
 					 l1sap->oph.primitive,
 					 l1sap->oph.operation);
diff --git a/src/common/main.c b/src/common/main.c
index 0d84c18..25ecd11 100644
--- a/src/common/main.c
+++ b/src/common/main.c
@@ -184,7 +184,7 @@
 	case SIGTERM:
 		if (!quit) {
 			oml_tx_failure_event_rep(&bts->mo,
-						 OSMO_EVT_CRIT_PROC_STOP,
+						 NM_SEVER_CRITICAL, OSMO_EVT_CRIT_PROC_STOP,
 						 "BTS: SIGINT received -> shutdown");
 			bts_shutdown(bts, "SIGINT");
 		}
diff --git a/src/common/oml.c b/src/common/oml.c
index 67eb6d8..d44b395 100644
--- a/src/common/oml.c
+++ b/src/common/oml.c
@@ -81,8 +81,8 @@
 }
 
 /* 3GPP TS 12.21 § 8.8.2 */
-int oml_tx_failure_event_rep(const struct gsm_abis_mo *mo, uint16_t cause_value,
-			     const char *fmt, ...)
+int oml_tx_failure_event_rep(const struct gsm_abis_mo *mo, enum abis_nm_severity severity,
+			     uint16_t cause_value, const char *fmt, ...)
 {
 	struct msgb *nmsg;
 	va_list ap;
@@ -558,12 +558,14 @@
 
 	rc = oml_tlv_parse(&tp, foh->data, msgb_l3len(msg) - sizeof(*foh));
 	if (rc < 0) {
-		oml_tx_failure_event_rep(mo, OSMO_EVT_MAJ_UNSUP_ATTR, "Get Attribute parsing failure");
+		oml_tx_failure_event_rep(mo, NM_SEVER_MINOR, OSMO_EVT_MAJ_UNSUP_ATTR,
+					 "Get Attribute parsing failure");
 		return oml_mo_fom_ack_nack(mo, NM_MT_GET_ATTR, NM_NACK_INCORR_STRUCT);
 	}
 
 	if (!TLVP_PRES_LEN(&tp, NM_ATT_LIST_REQ_ATTR, 1)) {
-		oml_tx_failure_event_rep(mo, OSMO_EVT_MAJ_UNSUP_ATTR, "Get Attribute without Attribute List");
+		oml_tx_failure_event_rep(mo, NM_SEVER_MINOR, OSMO_EVT_MAJ_UNSUP_ATTR,
+					 "Get Attribute without Attribute List");
 		return oml_mo_fom_ack_nack(mo, NM_MT_GET_ATTR, NM_NACK_INCORR_STRUCT);
 	}
 
@@ -588,7 +590,7 @@
 
 	rc = oml_tlv_parse(&tp, foh->data, msgb_l3len(msg) - sizeof(*foh));
 	if (rc < 0) {
-		oml_tx_failure_event_rep(&bts->mo, OSMO_EVT_MAJ_UNSUP_ATTR,
+		oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UNSUP_ATTR,
 					 "New value for Attribute not supported");
 		return oml_fom_ack_nack(msg, NM_NACK_INCORR_STRUCT);
 	}
@@ -597,7 +599,7 @@
 	if (TLVP_PRES_LEN(&tp, NM_ATT_BCCH_ARFCN, 2)) {
 		uint16_t arfcn = ntohs(tlvp_val16_unal(&tp, NM_ATT_BCCH_ARFCN));
 		if (arfcn > 1024) {
-			oml_tx_failure_event_rep(&bts->mo, OSMO_EVT_WARN_SW_WARN,
+			oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_WARN_SW_WARN,
 						 "Given ARFCN %u is not supported",
 						 arfcn);
 			LOGPFOH(DOML, LOGL_ERROR, foh, "Given ARFCN %u is not supported.\n", arfcn);
@@ -606,7 +608,7 @@
 	}
 	/* 9.4.52 Starting Time */
 	if (TLVP_PRESENT(&tp, NM_ATT_START_TIME)) {
-		oml_tx_failure_event_rep(&bts->mo, OSMO_EVT_MAJ_UNSUP_ATTR,
+		oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UNSUP_ATTR,
 					 "NM_ATT_START_TIME Attribute not "
 					 "supported");
 		return oml_fom_ack_nack(msg, NM_NACK_SPEC_IMPL_NOTSUPP);
@@ -756,7 +758,7 @@
 
 	rc = oml_tlv_parse(&tp, foh->data, msgb_l3len(msg) - sizeof(*foh));
 	if (rc < 0) {
-		oml_tx_failure_event_rep(&trx->mo, OSMO_EVT_MAJ_UNSUP_ATTR,
+		oml_tx_failure_event_rep(&trx->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UNSUP_ATTR,
 					 "New value for Set Radio Attribute not"
 					 " supported");
 		return oml_fom_ack_nack(msg, NM_NACK_INCORR_STRUCT);
@@ -820,10 +822,8 @@
 		arfcn = ntohs(_value);
 		value += 2;
 		if (arfcn > 1024) {
-			oml_tx_failure_event_rep(&trx->bts->mo,
-						 OSMO_EVT_WARN_SW_WARN,
-						 "Given ARFCN %u is unsupported",
-						 arfcn);
+			oml_tx_failure_event_rep(&trx->bts->mo, NM_SEVER_MAJOR, OSMO_EVT_WARN_SW_WARN,
+						 "Given ARFCN %u is unsupported", arfcn);
 			LOGPFOH(DOML, LOGL_NOTICE, foh, "Given ARFCN %u is unsupported.\n", arfcn);
 			return oml_fom_ack_nack(msg, NM_NACK_FREQ_NOTAVAIL);
 		}
@@ -926,9 +926,8 @@
 
 	rc = oml_tlv_parse(&tp, foh->data, msgb_l3len(msg) - sizeof(*foh));
 	if (rc < 0) {
-		oml_tx_failure_event_rep(&ts->mo, OSMO_EVT_MAJ_UNSUP_ATTR,
-					 "New value for Set Channel Attribute "
-					 "not supported");
+		oml_tx_failure_event_rep(&ts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UNSUP_ATTR,
+					 "New value for Set Channel Attribute not supported");
 		return oml_fom_ack_nack(msg, NM_NACK_INCORR_STRUCT);
 	}
 
@@ -1073,7 +1072,8 @@
 		trx = gsm_bts_trx_num(bts, foh->obj_inst.trx_nr);
 		if (trx)
 			mo = &trx->mo;
-		oml_tx_failure_event_rep(mo, OSMO_EVT_MAJ_UKWN_MSG, form, foh->obj_inst.bts_nr,
+		oml_tx_failure_event_rep(mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG, form,
+					 foh->obj_inst.bts_nr,
 					 get_value_string(abis_nm_msgtype_names, foh->msg_type));
 
 		return true;
@@ -1094,7 +1094,8 @@
 		trx = gsm_bts_trx_num(bts, foh->obj_inst.trx_nr);
 		if (trx)
 			mo = &trx->mo;
-		oml_tx_failure_event_rep(mo, OSMO_EVT_MAJ_UKWN_MSG, "Formatted O&M message too short");
+		oml_tx_failure_event_rep(mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,
+					 "Formatted O&M message too short");
 		return -EIO;
 	}
 
@@ -1149,8 +1150,8 @@
 		trx = gsm_bts_trx_num(bts, foh->obj_inst.trx_nr);
 		if (trx)
 			mo = &trx->mo;
-		oml_tx_failure_event_rep(mo, OSMO_EVT_MAJ_UKWN_MSG, "unknown Formatted O&M "
-					 "msg_type 0x%02x", foh->msg_type);
+		oml_tx_failure_event_rep(mo, NM_SEVER_MINOR, OSMO_EVT_MAJ_UKWN_MSG,
+					 "unknown Formatted O&M msg_type 0x%02x", foh->msg_type);
 		ret = oml_fom_ack_nack(msg, NM_NACK_MSGTYPE_INVAL);
 	}
 
@@ -1317,9 +1318,8 @@
 		mo = gsm_objclass2mo(bts, foh->obj_class, &foh->obj_inst);
 		if (!mo)
 			return oml_fom_ack_nack(msg, NM_NACK_OBJINST_UNKN);
-		oml_tx_failure_event_rep(mo, OSMO_EVT_MAJ_UNSUP_ATTR,
-					 "New value for IPAC Set Attribute not "
-					 "supported\n");
+		oml_tx_failure_event_rep(mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UNSUP_ATTR,
+					 "New value for IPAC Set Attribute not supported\n");
 		return oml_fom_ack_nack(msg, NM_NACK_INCORR_STRUCT);
 	}
 
@@ -1392,13 +1392,13 @@
 	int ret;
 
 	if (msgb_l2len(msg) < sizeof(*foh)) {
-		oml_tx_failure_event_rep(&bts->mo, OSMO_EVT_MAJ_UKWN_MSG,
+		oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,
 					 "Manufacturer O&M message too short\n");
 		return -EIO;
 	}
 
 	if (strncmp((char *)&oh->data[1], abis_nm_ipa_magic, idstrlen)) {
-		oml_tx_failure_event_rep(&bts->mo, OSMO_EVT_MAJ_UKWN_MSG,
+		oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,
 					 "Manufacturer OML message != ipaccess not supported\n");
 		return -EINVAL;
 	}
@@ -1437,8 +1437,8 @@
 		trx = gsm_bts_trx_num(bts, foh->obj_inst.trx_nr);
 		if (trx)
 			mo = &trx->mo;
-		oml_tx_failure_event_rep(mo, OSMO_EVT_MAJ_UKWN_MSG, "unknown Manufacturer O&M "
-					 "msg_type 0x%02x", foh->msg_type);
+		oml_tx_failure_event_rep(mo, NM_SEVER_MINOR, OSMO_EVT_MAJ_UKWN_MSG,
+					 "unknown Manufacturer O&M msg_type 0x%02x", foh->msg_type);
 		ret = oml_fom_ack_nack(msg, NM_NACK_MSGTYPE_INVAL);
 	}
 
@@ -1452,7 +1452,7 @@
 	int ret = 0;
 
 	if (msgb_l2len(msg) < sizeof(*oh)) {
-		oml_tx_failure_event_rep(&bts->mo, OSMO_EVT_MAJ_UKWN_MSG,
+		oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,
 					 "OML message too short\n");
 		msgb_free(msg);
 		return -EIO;
@@ -1461,14 +1461,14 @@
 
 	/* We don't implement de-segmentation of segmented OML messages */
 	if (oh->placement != ABIS_OM_PLACEMENT_ONLY || oh->sequence != 0) {
-		oml_tx_failure_event_rep(&bts->mo, OSMO_EVT_MAJ_UKWN_MSG,
+		oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,
 					 "Unsupported segmented O&M message\n");
 		msgb_free(msg);
 		return -EIO;
 	}
 
 	if (msgb_l3len(msg) < oh->length) {
-		oml_tx_failure_event_rep(&bts->mo, OSMO_EVT_MAJ_UKWN_MSG,
+		oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,
 					 "Short OML message: %u < %u\n",
 					 msgb_l3len(msg), oh->length);
 		msgb_free(msg);
@@ -1478,7 +1478,7 @@
 	switch (oh->mdisc) {
 	case ABIS_OM_MDISC_FOM:
 		if (msgb_l2len(msg) < sizeof(*oh)) {
-			oml_tx_failure_event_rep(&bts->mo, OSMO_EVT_MAJ_UKWN_MSG,
+			oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,
 						"Formatted O&M message too short\n");
 			ret = -EIO;
 			break;
@@ -1487,7 +1487,7 @@
 		break;
 	case ABIS_OM_MDISC_MANUF:
 		if (msgb_l2len(msg) < sizeof(*oh)) {
-			oml_tx_failure_event_rep(&bts->mo, OSMO_EVT_MAJ_UKWN_MSG,
+			oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,
 						"Manufacturer O&M message too short\n");
 			ret = -EIO;
 			break;
@@ -1495,7 +1495,7 @@
 		ret = down_mom(bts, msg);
 		break;
 	default:
-		oml_tx_failure_event_rep(&bts->mo, OSMO_EVT_MAJ_UKWN_MSG,
+		oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MINOR, OSMO_EVT_MAJ_UKWN_MSG,
 					 "unknown O&M msg_disc 0x%02x\n", oh->mdisc);
 		ret = -EINVAL;
 	}
diff --git a/src/common/pcu_sock.c b/src/common/pcu_sock.c
index 31097ba..a20a7fc 100644
--- a/src/common/pcu_sock.c
+++ b/src/common/pcu_sock.c
@@ -595,7 +595,7 @@
 	case PCU_VERSION:
 		LOGP(DPCU, LOGL_INFO, "OsmoPCU version %s connected\n",
 		     txt->text);
-		oml_tx_failure_event_rep(&bts->gprs.cell.mo, OSMO_EVT_PCU_VERS, txt->text);
+		oml_tx_failure_event_rep(&bts->gprs.cell.mo, NM_SEVER_MINOR, OSMO_EVT_PCU_VERS, txt->text);
 		osmo_strlcpy(bts->pcu_version, txt->text, MAX_VERSION_LENGTH);
 
 		if (GSM_BTS_HAS_SI(bts, SYSINFO_TYPE_13))
@@ -604,7 +604,8 @@
 		LOGP(DPCU, LOGL_INFO, "SI13 is not available on PCU connection\n");
 		break;
 	case PCU_OML_ALERT:
-		oml_tx_failure_event_rep(&bts->gprs.cell.mo, OSMO_EVT_EXT_ALARM, txt->text);
+		oml_tx_failure_event_rep(&bts->gprs.cell.mo, NM_SEVER_INDETERMINATE, OSMO_EVT_EXT_ALARM,
+					 txt->text);
 		break;
 	default:
 		LOGP(DPCU, LOGL_ERROR, "Unknown TXT_IND type %u received\n",
@@ -731,7 +732,7 @@
 	bts = llist_entry(state->net->bts_list.next, struct gsm_bts, list);
 
 	LOGP(DPCU, LOGL_NOTICE, "PCU socket has LOST connection\n");
-	oml_tx_failure_event_rep(&bts->gprs.cell.mo, OSMO_EVT_PCU_VERS,
+	oml_tx_failure_event_rep(&bts->gprs.cell.mo, NM_SEVER_MAJOR, OSMO_EVT_PCU_VERS,
 				 "PCU socket has LOST connection");
 
 	bts->pcu_version[0] = '\0';
diff --git a/src/common/rsl.c b/src/common/rsl.c
index cc653ce..92575b5 100644
--- a/src/common/rsl.c
+++ b/src/common/rsl.c
@@ -471,8 +471,8 @@
 	if (rc < 0) {
 		/* FIXME: notfiy the BSC on other errors? */
 		if (rc == -ENOSPC) {
-			oml_tx_failure_event_rep(&trx->bts->mo, OSMO_EVT_MIN_PAG_TAB_FULL,
-						 "BTS paging table is full");
+			oml_tx_failure_event_rep(&trx->bts->mo, NM_SEVER_WARNING,
+						 OSMO_EVT_MIN_PAG_TAB_FULL, "BTS paging table is full");
 		}
 	}
 
@@ -2013,7 +2013,7 @@
 		if (!lchan->abis_ip.rtp_socket) {
 			LOGPLCHAN(lchan, DRTP, LOGL_ERROR, "IPAC Failed to create RTP/RTCP sockets\n");
 			oml_tx_failure_event_rep(&lchan->ts->trx->mo,
-						 OSMO_EVT_CRIT_RTP_TOUT,
+						 NM_SEVER_MINOR, OSMO_EVT_CRIT_RTP_TOUT,
 						 "%s IPAC Failed to create RTP/RTCP sockets",
 						 gsm_lchan_name(lchan));
 			return tx_ipac_XXcx_nack(lchan, RSL_ERR_RES_UNAVAIL,
@@ -2050,7 +2050,7 @@
 		if (rc < 0) {
 			LOGPLCHAN(lchan, DRTP, LOGL_ERROR, "IPAC Failed to bind RTP/RTCP sockets\n");
 			oml_tx_failure_event_rep(&lchan->ts->trx->mo,
-						 OSMO_EVT_CRIT_RTP_TOUT,
+						 NM_SEVER_MINOR, OSMO_EVT_CRIT_RTP_TOUT,
 						 "%s IPAC Failed to bind RTP/RTCP sockets",
 						 gsm_lchan_name(lchan));
 			osmo_rtp_socket_free(lchan->abis_ip.rtp_socket);
diff --git a/src/osmo-bts-oc2g/calib_file.c b/src/osmo-bts-oc2g/calib_file.c
index 72ec266..6d2d561 100644
--- a/src/osmo-bts-oc2g/calib_file.c
+++ b/src/osmo-bts-oc2g/calib_file.c
@@ -134,7 +134,7 @@
 	st->fp = fopen(fname, "rb");
 	if (!st->fp) {
 		LOGP(DL1C, LOGL_FATAL, "Failed to open '%s' for calibration data.\n", fname);
-		oml_tx_failure_event_rep(&fl1h->phy_inst->trx->mo, OSMO_EVT_WARN_SW_WARN,
+		oml_tx_failure_event_rep(&fl1h->phy_inst->trx->mo, NM_SEVER_MAJOR, OSMO_EVT_WARN_SW_WARN,
 					 "Failed to open '%s' for calibration data", fname);
 		return -1;
 	}
@@ -221,7 +221,7 @@
 	rc = calib_verify(fl1h, desc);
 	if (rc < 0) {
 		LOGP(DL1C, LOGL_FATAL, "Verify L1 calibration table %s -> failed (%d)\n", desc->fname, rc);
-		oml_tx_failure_event_rep(&fl1h->phy_inst->trx->mo, OSMO_EVT_WARN_SW_WARN,
+		oml_tx_failure_event_rep(&fl1h->phy_inst->trx->mo, NM_SEVER_MAJOR, OSMO_EVT_WARN_SW_WARN,
 					 "Verify L1 calibration table %s -> failed (%d)", desc->fname, rc);
 
 		st->last_file_idx = get_next_calib_file_idx(fl1h, st->last_file_idx);
@@ -278,7 +278,7 @@
 
 	if (!calib_path) {
 		LOGP(DL1C, LOGL_FATAL, "Calibration file path not specified\n");
-		oml_tx_failure_event_rep(&fl1h->phy_inst->trx->mo, OSMO_EVT_WARN_SW_WARN,
+		oml_tx_failure_event_rep(&fl1h->phy_inst->trx->mo, NM_SEVER_MAJOR, OSMO_EVT_WARN_SW_WARN,
 					 "Calibration file path not specified");
 		return -1;
 	}

-- 
To view, visit https://gerrit.osmocom.org/14173
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I49af04212568892648e0e8704ba1cc6de8c8ae89
Gerrit-Change-Number: 14173
Gerrit-PatchSet: 1
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20190525/5381a159/attachment.htm>


More information about the gerrit-log mailing list