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