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/.
Minh-Quang Nguyen gerrit-no-reply at lists.osmocom.orgHello Jenkins Builder,
I'd like you to reexamine a change. Please visit
https://gerrit.osmocom.org/260
to look at the new patch set (#2).
LC15: Introduce measurement management messages, TS 12.21 section 8.10
Change-Id: Ic930baa69fc09ad5059627ed3d85cce5474085b0
---
M include/osmo-bts/oml.h
M include/osmo-bts/pcu_if.h
M include/osmo-bts/pcuif_proto.h
M src/common/oml.c
M src/common/pcu_sock.c
5 files changed, 455 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/60/260/2
diff --git a/include/osmo-bts/oml.h b/include/osmo-bts/oml.h
index 1182437..77ba751 100644
--- a/include/osmo-bts/oml.h
+++ b/include/osmo-bts/oml.h
@@ -16,6 +16,14 @@
};
/* FIXME: can move to libosmocore */
+enum abis_nm_msgtype_ipacc_appended {
+ NM_MT_IPACC_START_MEAS_ACK = 0xde,
+ NM_MT_IPACC_MEAS_RES_REQ_NACK = 0xfc,
+ NM_MT_IPACC_START_MEAS_NACK = 0xfd,
+ NM_MT_IPACC_STOP_MEAS_ACK = 0xdf,
+ NM_MT_IPACC_STOP_MEAS_NACK = 0xfe,
+};
+
enum abis_mm_event_causes {
/* Critical causes */
NM_MM_EVT_CRIT_SW_FATAL = 0x0000,
@@ -72,4 +80,11 @@
/* Transmit failure event report */
int oml_tx_failure_event_rep(struct gsm_abis_mo *mo, struct gsm_failure_evt_rep failure_evt_rep);
+/* Transmit start/stop/request measurement messages*/
+int oml_tx_mm_start_meas_ack_nack(struct gsm_abis_mo *mo, uint8_t meas_id, uint8_t nack_cause);
+int oml_tx_mm_meas_res_req_nack(struct gsm_abis_mo *mo, uint8_t meas_id, uint8_t nack_cause);
+int oml_tx_mm_meas_res_resp(struct gsm_abis_mo *mo, struct gsm_pcu_if_meas_resp meas_resp);
+int oml_tx_mm_stop_meas_ack_nack(struct gsm_abis_mo *mo, uint8_t meas_id, uint8_t nack_cause);
+
+
#endif // _OML_H */
diff --git a/include/osmo-bts/pcu_if.h b/include/osmo-bts/pcu_if.h
index 0c4fb69..ea00493 100644
--- a/include/osmo-bts/pcu_if.h
+++ b/include/osmo-bts/pcu_if.h
@@ -19,4 +19,8 @@
int pcu_sock_init(const char *path);
void pcu_sock_exit(void);
+int pcu_tx_mm_start_meas(struct gsm_bts *bts, uint8_t meas_id);
+int pcu_tx_mm_meas_res_req(struct gsm_bts *bts, uint8_t meas_id);
+int pcu_tx_mm_stop_meas(struct gsm_bts *bts, uint8_t meas_id);
+
#endif /* _PCU_IF_H */
diff --git a/include/osmo-bts/pcuif_proto.h b/include/osmo-bts/pcuif_proto.h
index 75e911b..14cb770 100644
--- a/include/osmo-bts/pcuif_proto.h
+++ b/include/osmo-bts/pcuif_proto.h
@@ -1,5 +1,6 @@
#ifndef _PCUIF_PROTO_H
#define _PCUIF_PROTO_H
+#include <osmocom/gsm/protocol/gsm_12_21.h>
#define PCU_IF_VERSION 0x05
@@ -15,7 +16,17 @@
#define PCU_IF_MSG_PAG_REQ 0x60 /* paging request */
/*alarms & performance counters */
+#define PCU_IF_MSG_START_MEAS_REQ 0x61 /* PCU start measurement request */
+#define PCU_IF_MSG_START_MEAS_ACK 0x62 /* PCU start measurement ACK */
+#define PCU_IF_MSG_START_MEAS_NACK 0x63 /* PCU start measurement NACK */
+#define PCU_IF_MSG_MEAS_RES_REQ 0x64 /* PCU measurement result request*/
+#define PCU_IF_MSG_MEAS_RES_RESP 0x65 /* PCU measurement result response*/
+#define PCU_IF_MSG_MEAS_RES_NACK 0x66 /* PCU measurement result NACK*/
#define PCU_IF_MSG_FAILURE_EVT_IND 0x67 /* PCU failure event report indication*/
+#define PCU_IF_MSG_STOP_MEAS_REQ 0x68 /* PCU stop measurement request */
+#define PCU_IF_MSG_STOP_MEAS_ACK 0x69 /* PCU stop measurement ACK */
+#define PCU_IF_MSG_STOP_MEAS_NACK 0x6a /* PCU stop measurement NACK */
+
/* sapi */
#define PCU_IF_SAPI_RACH 0x01 /* channel request on CCCH */
@@ -142,6 +153,24 @@
char add_text[100];
}__attribute__ ((packed));
+struct gsm_pcu_if_start_meas_req {
+ uint8_t meas_id; /*measurement ID */
+ uint8_t nack_cause;
+ uint8_t spare[2];
+}__attribute__ ((packed));
+
+struct gsm_pcu_if_meas_req {
+ uint8_t meas_id; /*measurement ID */
+ uint8_t spare[2];
+}__attribute__ ((packed));
+
+struct gsm_pcu_if_meas_resp {
+ uint8_t meas_id; /*measurement ID */
+ uint8_t nack_cause; /*NACK cause */
+ uint16_t len; /*total result length */
+ uint8_t data[100]; /*PM counter result must be started from here */
+}__attribute__ ((packed));
+
struct gsm_pcu_if {
/* context based information */
uint8_t msg_type; /* message type */
@@ -159,6 +188,10 @@
struct gsm_pcu_if_time_ind time_ind;
struct gsm_pcu_if_pag_req pag_req;
struct gsm_pcu_if_fail_evt_ind failure_evt_ind;
+ struct gsm_pcu_if_start_meas_req start_meas_req;
+ struct gsm_pcu_if_start_meas_req stop_meas_req;
+ struct gsm_pcu_if_meas_req meas_req;
+ struct gsm_pcu_if_meas_resp meas_resp;
} u;
} __attribute__ ((packed));
diff --git a/src/common/oml.c b/src/common/oml.c
index 6b42b16..f7f2444 100644
--- a/src/common/oml.c
+++ b/src/common/oml.c
@@ -90,6 +90,9 @@
[NM_ATT_IPACC_SEC_POSSIBLE] = { TLV_TYPE_TL16V },
[NM_ATT_IPACC_IML_SSL_STATE] = { TLV_TYPE_TL16V },
[NM_ATT_IPACC_REVOC_DATE] = { TLV_TYPE_TL16V },
+ /* GSM 12.21 attributes */
+ [NM_ATT_MEAS_TYPE] = { TLV_TYPE_TV },
+ [NM_ATT_MEAS_RES] = { TLV_TYPE_TV },
},
};
@@ -401,6 +404,81 @@
return oml_mo_send_msg(mo, nmsg, NM_MT_FAILURE_EVENT_REP);
+}
+
+/* TS 12.21 8.10.2 */
+int oml_tx_mm_meas_res_resp(struct gsm_abis_mo *mo, struct gsm_pcu_if_meas_resp meas_resp)
+{
+ struct msgb *nmsg;
+
+ LOGP(DOML, LOGL_INFO, "%s Tx MEASurement RESult RESPonse\n", gsm_abis_mo_name(mo));
+
+ nmsg = oml_msgb_alloc();
+ if (!nmsg)
+ return -ENOMEM;
+
+ msgb_tv_put(nmsg, NM_ATT_MEAS_TYPE, meas_resp.meas_id);
+ msgb_tl16v_put(nmsg, NM_ATT_MEAS_RES, meas_resp.len, meas_resp.data);
+
+ return oml_mo_send_msg(mo, nmsg, NM_MT_MEAS_RES_RESP);
+}
+
+int oml_tx_mm_start_meas_ack_nack(struct gsm_abis_mo *mo, uint8_t meas_id, uint8_t nack_cause)
+{
+ struct msgb *msg;
+ uint8_t msg_type;
+
+ msg = oml_msgb_alloc();
+ if (!msg)
+ return -ENOMEM;
+
+ if (nack_cause) {
+ msg_type = NM_MT_IPACC_START_MEAS_NACK;
+ msgb_tv_put(msg, NM_ATT_NACK_CAUSES, nack_cause);
+ msgb_tv_put(msg, NM_ATT_MEAS_TYPE, meas_id);
+ } else {
+ msg_type = NM_MT_IPACC_START_MEAS_ACK;
+ msgb_tv_put(msg, NM_ATT_MEAS_TYPE, meas_id);
+ }
+
+ return oml_mo_send_msg(mo, msg, msg_type);
+}
+
+int oml_tx_mm_stop_meas_ack_nack(struct gsm_abis_mo *mo, uint8_t meas_id, uint8_t nack_cause)
+{
+ struct msgb *msg;
+ uint8_t msg_type;
+
+ msg = oml_msgb_alloc();
+ if (!msg)
+ return -ENOMEM;
+
+ if (nack_cause) {
+ msg_type = NM_MT_IPACC_STOP_MEAS_NACK;
+ msgb_tv_put(msg, NM_ATT_NACK_CAUSES, nack_cause);
+ msgb_tv_put(msg, NM_ATT_MEAS_TYPE, meas_id);
+ } else {
+ msg_type = NM_MT_IPACC_STOP_MEAS_ACK;
+ msgb_tv_put(msg, NM_ATT_MEAS_TYPE, meas_id);
+ }
+
+ return oml_mo_send_msg(mo, msg, msg_type);
+}
+
+int oml_tx_mm_meas_res_req_nack(struct gsm_abis_mo *mo, uint8_t meas_id, uint8_t nack_cause)
+{
+ struct msgb *msg;
+ uint8_t msg_type;
+
+ msg = oml_msgb_alloc();
+ if (!msg)
+ return -ENOMEM;
+
+ msg_type = NM_MT_IPACC_MEAS_RES_REQ_NACK;
+ msgb_tv_put(msg, NM_ATT_NACK_CAUSES, nack_cause);
+ msgb_tv_put(msg, NM_ATT_MEAS_TYPE, meas_id);
+
+ return oml_mo_send_msg(mo, msg, msg_type);
}
/* TS 12.21 9.4.53 */
@@ -976,6 +1054,197 @@
return bts_model_chg_adm_state(bts, mo, obj, adm_state);
}
+/* GSM 12.21 section 8.10.1 */
+static int oml_rx_mm_meas_res_req(struct gsm_bts *bts, struct msgb *msg)
+{
+ struct abis_om_fom_hdr *foh = msgb_l3(msg);
+ struct gsm_abis_mo *mo = &bts->gprs.cell.mo;
+ struct tlv_parsed tp;
+ int rc;
+ char log_msg[100];
+ struct gsm_failure_evt_rep failure_rep;
+ uint8_t meas_id;
+
+ LOGP(DOML, LOGL_DEBUG, "%s Rx MEAS RES REQ\n", gsm_abis_mo_name(mo));
+
+ rc = oml_tlv_parse(&tp, foh->data, msgb_l3len(msg) - sizeof(*foh));
+ if (rc < 0) {
+ snprintf(log_msg, 100, "New value for Attribute not supported\n");
+ LOGP(DOML, LOGL_NOTICE,"%s", log_msg);
+ failure_rep.event_type = NM_EVT_PROC_FAIL;
+ failure_rep.event_serverity = NM_SEVER_MAJOR;
+ failure_rep.cause_type = NM_PCAUSE_T_MANUF;
+ failure_rep.event_cause = NM_MM_EVT_MAJ_UNSUP_ATTR;
+ failure_rep.add_text = (char *)&log_msg;
+
+ oml_tx_failure_event_rep(mo, failure_rep);
+ return oml_fom_ack_nack(msg, NM_NACK_INCORR_STRUCT);
+ }
+
+ if (!TLVP_PRESENT(&tp, NM_ATT_MEAS_TYPE)) {
+ snprintf(log_msg, 100, "%s NM_ATT_MEAS_TYPE not found\n", gsm_abis_mo_name(mo));
+ LOGP(DOML, LOGL_ERROR,"%s", log_msg);
+ failure_rep.event_type = NM_EVT_PROC_FAIL;
+ failure_rep.event_serverity = NM_SEVER_MAJOR;
+ failure_rep.cause_type = NM_PCAUSE_T_MANUF;
+ failure_rep.event_cause = NM_MM_EVT_MAJ_UNSUP_ATTR;
+ failure_rep.add_text = (char *)&log_msg;
+
+ oml_tx_failure_event_rep(mo, failure_rep);
+ return oml_fom_ack_nack(msg, NM_NACK_INCORR_STRUCT);
+ }
+
+ /* Get measurement ID */
+ meas_id = *TLVP_VAL(&tp, NM_ATT_MEAS_TYPE);
+
+ /* send request to PCU */
+ rc = pcu_tx_mm_meas_res_req(bts, meas_id);
+ if (rc < 0) {
+ snprintf(log_msg, 100, "%s PCU socket may not be ready for measurement ID (%d)\n", gsm_abis_mo_name(mo), meas_id);
+ LOGP(DOML, LOGL_ERROR,"%s", log_msg);
+ failure_rep.event_type = NM_EVT_PROC_FAIL;
+ failure_rep.event_serverity = NM_SEVER_MAJOR;
+ failure_rep.cause_type = NM_PCAUSE_T_MANUF;
+ failure_rep.event_cause = NM_MM_EVT_MAJ_NET_CONGEST;
+ failure_rep.add_text = (char *)&log_msg;
+
+ /*send alarm to indicate PCU link is not ready */
+ oml_tx_failure_event_rep(mo, failure_rep);
+
+ /*send MEAS RES REQ NACK */
+ return oml_tx_mm_meas_res_req_nack(mo, meas_id, NM_NACK_NOTH_REPORT_EXIST);
+ }
+
+ return 0;
+}
+
+/* GSM 12.21 section 8.10.3 */
+static int oml_rx_mm_start_meas(struct gsm_bts *bts, struct msgb *msg)
+{
+ struct abis_om_fom_hdr *foh = msgb_l3(msg);
+ struct gsm_abis_mo *mo = &bts->gprs.cell.mo;
+ struct tlv_parsed tp;
+ int rc;
+ char log_msg[100];
+ struct gsm_failure_evt_rep failure_rep;
+ uint8_t meas_id;
+
+ LOGP(DOML, LOGL_DEBUG, "%s Rx START MEAS\n", gsm_abis_mo_name(mo));
+
+ rc = oml_tlv_parse(&tp, foh->data, msgb_l3len(msg) - sizeof(*foh));
+ if (rc < 0) {
+ snprintf(log_msg, 100, "New value for Attribute not supported\n");
+ LOGP(DOML, LOGL_NOTICE,"%s", log_msg);
+ failure_rep.event_type = NM_EVT_PROC_FAIL;
+ failure_rep.event_serverity = NM_SEVER_MAJOR;
+ failure_rep.cause_type = NM_PCAUSE_T_MANUF;
+ failure_rep.event_cause = NM_MM_EVT_MAJ_UNSUP_ATTR;
+ failure_rep.add_text = (char *)&log_msg;
+
+ oml_tx_failure_event_rep(mo, failure_rep);
+ return oml_fom_ack_nack(msg, NM_NACK_INCORR_STRUCT);
+ }
+
+ if (!TLVP_PRESENT(&tp, NM_ATT_MEAS_TYPE)) {
+ snprintf(log_msg, 100, "%s PCU socket may not be ready for measurement ID (%d)\n", gsm_abis_mo_name(mo), meas_id);
+ LOGP(DOML, LOGL_ERROR,"%s", log_msg);
+ failure_rep.event_type = NM_EVT_PROC_FAIL;
+ failure_rep.event_serverity = NM_SEVER_MAJOR;
+ failure_rep.cause_type = NM_PCAUSE_T_MANUF;
+ failure_rep.event_cause = NM_MM_EVT_MAJ_UNSUP_ATTR;
+ failure_rep.add_text = (char *)&log_msg;
+
+ oml_tx_failure_event_rep(mo, failure_rep);
+ return oml_fom_ack_nack(msg, NM_NACK_INCORR_STRUCT);
+ }
+
+ /* Get measurement ID */
+ meas_id = *TLVP_VAL(&tp, NM_ATT_MEAS_TYPE);
+
+ /* send request to PCU */
+ rc = pcu_tx_mm_start_meas(bts, meas_id);
+ if (rc < 0) {
+ snprintf(log_msg, 100, "%s PCU socket may not be ready\n", gsm_abis_mo_name(mo));
+ LOGP(DOML, LOGL_ERROR,"%s", log_msg);
+ failure_rep.event_type = NM_EVT_PROC_FAIL;
+ failure_rep.event_serverity = NM_SEVER_MAJOR;
+ failure_rep.cause_type = NM_PCAUSE_T_MANUF;
+ failure_rep.event_cause = NM_MM_EVT_MAJ_NET_CONGEST;
+ failure_rep.add_text = (char *)&log_msg;
+
+ /*send alarm to indicate PCU link is not ready */
+ oml_tx_failure_event_rep(mo, failure_rep);
+
+ /*send START MEAS NACK */
+ return oml_tx_mm_start_meas_ack_nack(mo, meas_id, NM_NACK_NOTH_REPORT_EXIST);
+ }
+
+ return 0;
+}
+
+static int oml_rx_mm_stop_meas(struct gsm_bts *bts, struct msgb *msg)
+{
+ struct abis_om_fom_hdr *foh = msgb_l3(msg);
+ struct gsm_abis_mo *mo = &bts->gprs.cell.mo;
+ struct tlv_parsed tp;
+ int rc;
+ char log_msg[100];
+ struct gsm_failure_evt_rep failure_rep;
+ uint8_t meas_id;
+
+ LOGP(DOML, LOGL_DEBUG, "%s Rx STOP MEAS\n", gsm_abis_mo_name(mo));
+
+ rc = oml_tlv_parse(&tp, foh->data, msgb_l3len(msg) - sizeof(*foh));
+ if (rc < 0) {
+ snprintf(log_msg, 100, "New value for Attribute not supported\n");
+ LOGP(DOML, LOGL_NOTICE,"%s", log_msg);
+ failure_rep.event_type = NM_EVT_PROC_FAIL;
+ failure_rep.event_serverity = NM_SEVER_MAJOR;
+ failure_rep.cause_type = NM_PCAUSE_T_MANUF;
+ failure_rep.event_cause = NM_MM_EVT_MAJ_UNSUP_ATTR;
+ failure_rep.add_text = (char *)&log_msg;
+
+ oml_tx_failure_event_rep(mo, failure_rep);
+ return oml_fom_ack_nack(msg, NM_NACK_INCORR_STRUCT);
+ }
+
+ if (!TLVP_PRESENT(&tp, NM_ATT_MEAS_TYPE)) {
+ snprintf(log_msg, 100, "%s PCU socket may not be ready for measurement ID (%d)\n", gsm_abis_mo_name(mo), meas_id);
+ LOGP(DOML, LOGL_ERROR,"%s", log_msg);
+ failure_rep.event_type = NM_EVT_PROC_FAIL;
+ failure_rep.event_serverity = NM_SEVER_MAJOR;
+ failure_rep.cause_type = NM_PCAUSE_T_MANUF;
+ failure_rep.event_cause = NM_MM_EVT_MAJ_UNSUP_ATTR;
+ failure_rep.add_text = (char *)&log_msg;
+
+ oml_tx_failure_event_rep(mo, failure_rep);
+ return oml_fom_ack_nack(msg, NM_NACK_INCORR_STRUCT);
+ }
+
+ /* Get measurement ID */
+ meas_id = *TLVP_VAL(&tp, NM_ATT_MEAS_TYPE);
+
+ /* send request to PCU */
+ rc = pcu_tx_mm_stop_meas(bts, meas_id);
+ if (rc < 0) {
+ snprintf(log_msg, 100, "%s PCU socket may not be ready\n", gsm_abis_mo_name(mo));
+ LOGP(DOML, LOGL_ERROR,"%s", log_msg);
+ failure_rep.event_type = NM_EVT_PROC_FAIL;
+ failure_rep.event_serverity = NM_SEVER_MAJOR;
+ failure_rep.cause_type = NM_PCAUSE_T_MANUF;
+ failure_rep.event_cause = NM_MM_EVT_MAJ_NET_CONGEST;
+ failure_rep.add_text = (char *)&log_msg;
+
+ /*send alarm to indicate PCU link is not ready */
+ oml_tx_failure_event_rep(mo, failure_rep);
+
+ /*send STOP MEAS NACK */
+ return oml_tx_mm_stop_meas_ack_nack(mo, meas_id, NM_NACK_NOTH_REPORT_EXIST);
+ }
+
+ return 0;
+}
+
static int down_fom(struct gsm_bts *bts, struct msgb *msg)
{
struct abis_om_fom_hdr *foh = msgb_l3(msg);
@@ -1053,6 +1322,15 @@
case NM_MT_IPACC_SET_ATTR:
ret = oml_ipa_set_attr(bts, msg);
break;
+ case NM_MT_START_MEAS:
+ ret = oml_rx_mm_start_meas(bts, msg);
+ break;
+ case NM_MT_MEAS_RES_REQ:
+ ret = oml_rx_mm_meas_res_req(bts, msg);
+ break;
+ case NM_MT_STOP_MEAS:
+ ret = oml_rx_mm_stop_meas(bts, msg);
+ break;
default:
snprintf(log_msg, 100, "unknown Formatted O&M msg_type 0x%02x\n", foh->msg_type);
LOGP(DOML, LOGL_INFO,"%s", log_msg);
diff --git a/src/common/pcu_sock.c b/src/common/pcu_sock.c
index 77186c0..bff65c6 100644
--- a/src/common/pcu_sock.c
+++ b/src/common/pcu_sock.c
@@ -449,6 +449,64 @@
return pcu_sock_send(&bts_gsmnet, msg);
}
+int pcu_tx_mm_start_meas(struct gsm_bts *bts, uint8_t meas_id)
+{
+ struct gsm_pcu_if *pcu_prim;
+ struct gsm_pcu_if_start_meas_req *start_meas_req;
+ struct msgb *msg;
+
+ msg = pcu_msgb_alloc(PCU_IF_MSG_START_MEAS_REQ, bts->nr);
+ if (!msg)
+ return -ENOMEM;
+
+ pcu_prim = (struct gsm_pcu_if *) msg->data;
+ start_meas_req = &pcu_prim->u.start_meas_req;
+ start_meas_req->meas_id = meas_id;
+
+ LOGP(DPCU, LOGL_INFO, "[BTS->PCU] Sent STAT MEASurement REQuest: 0x%02x\n", start_meas_req->meas_id);
+
+ return pcu_sock_send(&bts_gsmnet, msg);
+}
+
+int pcu_tx_mm_stop_meas(struct gsm_bts *bts, uint8_t meas_id)
+{
+ struct gsm_pcu_if *pcu_prim;
+ struct gsm_pcu_if_start_meas_req *stop_meas_req;
+ struct msgb *msg;
+
+ msg = pcu_msgb_alloc(PCU_IF_MSG_STOP_MEAS_REQ, bts->nr);
+ if (!msg)
+ return -ENOMEM;
+
+ pcu_prim = (struct gsm_pcu_if *) msg->data;
+ stop_meas_req = &pcu_prim->u.start_meas_req;
+ stop_meas_req->meas_id = meas_id;
+
+ LOGP(DPCU, LOGL_INFO, "[BTS->PCU] Sent STOP MEASurement REQuest: 0x%02x\n", stop_meas_req->meas_id);
+
+ return pcu_sock_send(&bts_gsmnet, msg);
+}
+
+int pcu_tx_mm_meas_res_req(struct gsm_bts *bts, uint8_t meas_id)
+{
+ struct gsm_pcu_if *pcu_prim;
+ struct gsm_pcu_if_meas_req *meas_req;
+ struct msgb *msg;
+
+ msg = pcu_msgb_alloc(PCU_IF_MSG_MEAS_RES_REQ, bts->nr);
+ if (!msg)
+ return -ENOMEM;
+
+ pcu_prim = (struct gsm_pcu_if *) msg->data;
+ meas_req = &pcu_prim->u.meas_req;
+ meas_req->meas_id = meas_id;
+
+ LOGP(DPCU, LOGL_INFO, "[BTS->PCU ]Sent MEASurement RESult REQuest: 0x%02x\n", meas_req->meas_id);
+
+ return pcu_sock_send(&bts_gsmnet, msg);
+}
+
+
static int pcu_rx_data_req(struct gsm_bts *bts, uint8_t msg_type,
struct gsm_pcu_if_data *data_req)
{
@@ -573,6 +631,55 @@
return rc;
}
+static int pcu_rx_mm_start_meas_ack_nack(struct gsm_bts *bts, struct gsm_pcu_if_start_meas_req *start_meas, uint8_t nack_cause)
+{
+ int rc;
+ rc = oml_tx_mm_start_meas_ack_nack(&bts->gprs.cell.mo, start_meas->meas_id, nack_cause);
+ if (rc < 0 )
+ return rc;
+
+ return 0;
+}
+
+static int pcu_rx_mm_stop_meas_ack_nack(struct gsm_bts *bts, struct gsm_pcu_if_start_meas_req *stop_meas, uint8_t nack_cause)
+{
+ int rc;
+
+ rc = oml_tx_mm_stop_meas_ack_nack(&bts->gprs.cell.mo, stop_meas->meas_id, nack_cause);
+ if (rc < 0 )
+ return rc;
+
+ return 0;
+}
+
+static int pcu_rx_mm_meas_res_req_nack(struct gsm_bts *bts, struct gsm_pcu_if_meas_resp *meas_resp, uint8_t nack_cause)
+{
+ int rc;
+
+ rc = oml_tx_mm_meas_res_req_nack(&bts->gprs.cell.mo, meas_resp->meas_id, nack_cause);
+ if (rc < 0 )
+ return rc;
+
+ return 0;
+}
+
+static int pcu_rx_mm_meas_res_resp(struct gsm_bts *bts, struct gsm_pcu_if_meas_resp *meas_resp)
+{
+ struct gsm_pcu_if_meas_resp res_resp;
+ int rc;
+
+ res_resp.meas_id = meas_resp->meas_id;
+ res_resp.len = meas_resp->len;
+ memcpy(res_resp.data, meas_resp->data, meas_resp->len);
+
+ rc = oml_tx_mm_meas_res_resp(&bts->gprs.cell.mo, res_resp);
+ if (rc < 0 )
+ return rc;
+
+ return 0;
+}
+
+
static int pcu_rx(struct gsm_network *net, uint8_t msg_type,
struct gsm_pcu_if *pcu_prim)
{
@@ -595,6 +702,24 @@
case PCU_IF_MSG_FAILURE_EVT_IND:
rc = pcu_rx_failure_event_rep(bts, &pcu_prim->u.failure_evt_ind);
break;
+ case PCU_IF_MSG_START_MEAS_ACK:
+ rc = pcu_rx_mm_start_meas_ack_nack(bts, &pcu_prim->u.start_meas_req, 0);
+ break;
+ case PCU_IF_MSG_START_MEAS_NACK:
+ rc = pcu_rx_mm_start_meas_ack_nack(bts, &pcu_prim->u.start_meas_req, pcu_prim->u.start_meas_req.nack_cause);
+ break;
+ case PCU_IF_MSG_MEAS_RES_NACK:
+ rc = pcu_rx_mm_meas_res_req_nack(bts, &pcu_prim->u.meas_resp, pcu_prim->u.meas_resp.nack_cause);
+ break;
+ case PCU_IF_MSG_MEAS_RES_RESP:
+ rc = pcu_rx_mm_meas_res_resp(bts, &pcu_prim->u.meas_resp);
+ break;
+ case PCU_IF_MSG_STOP_MEAS_ACK:
+ rc = pcu_rx_mm_stop_meas_ack_nack(bts, &pcu_prim->u.stop_meas_req, 0);
+ break;
+ case PCU_IF_MSG_STOP_MEAS_NACK:
+ rc = pcu_rx_mm_stop_meas_ack_nack(bts, &pcu_prim->u.stop_meas_req, pcu_prim->u.stop_meas_req.nack_cause);
+ break;
default:
snprintf(log_msg, 100, "Received unknown PCU msg type %d\n", msg_type);
LOGP(DPCU, LOGL_ERROR,"%s", log_msg);
--
To view, visit https://gerrit.osmocom.org/260
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newpatchset
Gerrit-Change-Id: Ic930baa69fc09ad5059627ed3d85cce5474085b0
Gerrit-PatchSet: 2
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Owner: Minh-Quang Nguyen <minh-quang.nguyen at nutaq.com>
Gerrit-Reviewer: Harald Welte <laforge at gnumonks.org>
Gerrit-Reviewer: Jenkins Builder