/* ================================================================================== Copyright (c) 2019 AT&T Intellectual Property. Copyright (c) 2019 Nokia Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ================================================================================== */ package control /* #include #cgo LDFLAGS: -le2smwrapper #cgo CFLAGS: -I/usr/local/include/e2sm */ import "C" import ( "bytes" "encoding/binary" "errors" "strconv" "unsafe" ) type E2sm struct { } func (c *E2sm) SetEventTriggerDefinition(buffer []byte, eventTriggerCount int, RTPeriods []int64) (newBuffer []byte, err error) { cptr := unsafe.Pointer(&buffer[0]) periods := unsafe.Pointer(&RTPeriods[0]) size := C.e2sm_encode_ric_event_trigger_definition(cptr, C.size_t(len(buffer)), C.size_t(eventTriggerCount), (*C.long)(periods)) if size < 0 { return make([]byte, 0), errors.New("e2sm wrapper is unable to set EventTriggerDefinition due to wrong or invalid input") } newBuffer = C.GoBytes(cptr, (C.int(size)+7)/8) return } func (c *E2sm) SetActionDefinition(buffer []byte, ricStyleType int64) (newBuffer []byte, err error) { cptr := unsafe.Pointer(&buffer[0]) size := C.e2sm_encode_ric_action_definition(cptr, C.size_t(len(buffer)), C.long(ricStyleType)) if size < 0 { return make([]byte, 0), errors.New("e2sm wrapper is unable to set ActionDefinition due to wrong or invalid input") } newBuffer = C.GoBytes(cptr, (C.int(size)+7)/8) return } func (c *E2sm) GetIndicationHeader(buffer []byte) (indHdr *IndicationHeader, err error) { cptr := unsafe.Pointer(&buffer[0]) indHdr = &IndicationHeader{} decodedHdr := C.e2sm_decode_ric_indication_header(cptr, C.size_t(len(buffer))) if decodedHdr == nil { return indHdr, errors.New("e2sm wrapper is unable to get IndicationHeader due to wrong or invalid input") } defer C.e2sm_free_ric_indication_header(decodedHdr) indHdr.IndHdrType = int32(decodedHdr.present) if indHdr.IndHdrType == 1 { indHdrFormat1 := &IndicationHeaderFormat1{} indHdrFormat1_C := *(**C.E2SM_KPM_IndicationHeader_Format1_t)(unsafe.Pointer(&decodedHdr.choice[0])) if indHdrFormat1_C.id_GlobalKPMnode_ID != nil { globalKPMnodeID_C := (*C.GlobalKPMnode_ID_t)(indHdrFormat1_C.id_GlobalKPMnode_ID) indHdrFormat1.GlobalKPMnodeIDType = int32(globalKPMnodeID_C.present) if indHdrFormat1.GlobalKPMnodeIDType == 1 { globalgNBID := &GlobalKPMnodegNBIDType{} globalgNBID_C := *(**C.GlobalKPMnode_gNB_ID_t)(unsafe.Pointer(&globalKPMnodeID_C.choice[0])) plmnID_C := globalgNBID_C.global_gNB_ID.plmn_id globalgNBID.GlobalgNBID.PlmnID.Buf = C.GoBytes(unsafe.Pointer(plmnID_C.buf), C.int(plmnID_C.size)) globalgNBID.GlobalgNBID.PlmnID.Size = int(plmnID_C.size) globalgNBID_gNBID_C := globalgNBID_C.global_gNB_ID.gnb_id globalgNBID.GlobalgNBID.GnbIDType = int(globalgNBID_gNBID_C.present) if globalgNBID.GlobalgNBID.GnbIDType == 1 { gNBID := &GNBID{} gNBID_C := (*C.BIT_STRING_t)(unsafe.Pointer(&globalgNBID_gNBID_C.choice[0])) gNBID.Buf = C.GoBytes(unsafe.Pointer(gNBID_C.buf), C.int(gNBID_C.size)) gNBID.Size = int(gNBID_C.size) gNBID.BitsUnused = int(gNBID_C.bits_unused) globalgNBID.GlobalgNBID.GnbID = gNBID } if globalgNBID_C.gNB_CU_UP_ID != nil { globalgNBID.GnbCUUPID = &Integer{} globalgNBID.GnbCUUPID.Buf = C.GoBytes(unsafe.Pointer(globalgNBID_C.gNB_CU_UP_ID.buf), C.int(globalgNBID_C.gNB_CU_UP_ID.size)) globalgNBID.GnbCUUPID.Size = int(globalgNBID_C.gNB_CU_UP_ID.size) } if globalgNBID_C.gNB_DU_ID != nil { globalgNBID.GnbDUID = &Integer{} globalgNBID.GnbDUID.Buf = C.GoBytes(unsafe.Pointer(globalgNBID_C.gNB_DU_ID.buf), C.int(globalgNBID_C.gNB_DU_ID.size)) globalgNBID.GnbDUID.Size = int(globalgNBID_C.gNB_DU_ID.size) } indHdrFormat1.GlobalKPMnodeID = globalgNBID } else if indHdrFormat1.GlobalKPMnodeIDType == 2 { globalengNBID := &GlobalKPMnodeengNBIDType{} globalengNBID_C := *(**C.GlobalKPMnode_en_gNB_ID_t)(unsafe.Pointer(&globalKPMnodeID_C.choice[0])) plmnID_C := globalengNBID_C.global_gNB_ID.pLMN_Identity globalengNBID.PlmnID.Buf = C.GoBytes(unsafe.Pointer(plmnID_C.buf), C.int(plmnID_C.size)) globalengNBID.PlmnID.Size = int(plmnID_C.size) globalengNBID_gNBID_C := globalengNBID_C.global_gNB_ID.gNB_ID globalengNBID.GnbIDType = int(globalengNBID_gNBID_C.present) if globalengNBID.GnbIDType == 1 { engNBID := &ENGNBID{} engNBID_C := (*C.BIT_STRING_t)(unsafe.Pointer(&globalengNBID_gNBID_C.choice[0])) engNBID.Buf = C.GoBytes(unsafe.Pointer(engNBID_C.buf), C.int(engNBID_C.size)) engNBID.Size = int(engNBID_C.size) engNBID.BitsUnused = int(engNBID_C.bits_unused) globalengNBID.GnbID = engNBID } indHdrFormat1.GlobalKPMnodeID = globalengNBID } else if indHdrFormat1.GlobalKPMnodeIDType == 3 { globalngeNBID := &GlobalKPMnodengeNBIDType{} globalngeNBID_C := *(**C.GlobalKPMnode_ng_eNB_ID_t)(unsafe.Pointer(&globalKPMnodeID_C.choice[0])) plmnID_C := globalngeNBID_C.global_ng_eNB_ID.plmn_id globalngeNBID.PlmnID.Buf = C.GoBytes(unsafe.Pointer(plmnID_C.buf), C.int(plmnID_C.size)) globalngeNBID.PlmnID.Size = int(plmnID_C.size) globalngeNBID_eNBID_C := globalngeNBID_C.global_ng_eNB_ID.enb_id globalngeNBID.EnbIDType = int(globalngeNBID_eNBID_C.present) if globalngeNBID.EnbIDType == 1 { ngeNBID := &NGENBID_Macro{} ngeNBID_C := (*C.BIT_STRING_t)(unsafe.Pointer(&globalngeNBID_eNBID_C.choice[0])) ngeNBID.Buf = C.GoBytes(unsafe.Pointer(ngeNBID_C.buf), C.int(ngeNBID_C.size)) ngeNBID.Size = int(ngeNBID_C.size) ngeNBID.BitsUnused = int(ngeNBID_C.bits_unused) globalngeNBID.EnbID = ngeNBID } else if globalngeNBID.EnbIDType == 2 { ngeNBID := &NGENBID_ShortMacro{} ngeNBID_C := (*C.BIT_STRING_t)(unsafe.Pointer(&globalngeNBID_eNBID_C.choice[0])) ngeNBID.Buf = C.GoBytes(unsafe.Pointer(ngeNBID_C.buf), C.int(ngeNBID_C.size)) ngeNBID.Size = int(ngeNBID_C.size) ngeNBID.BitsUnused = int(ngeNBID_C.bits_unused) globalngeNBID.EnbID = ngeNBID } else if globalngeNBID.EnbIDType == 3 { ngeNBID := &NGENBID_LongMacro{} ngeNBID_C := (*C.BIT_STRING_t)(unsafe.Pointer(&globalngeNBID_eNBID_C.choice[0])) ngeNBID.Buf = C.GoBytes(unsafe.Pointer(ngeNBID_C.buf), C.int(ngeNBID_C.size)) ngeNBID.Size = int(ngeNBID_C.size) ngeNBID.BitsUnused = int(ngeNBID_C.bits_unused) globalngeNBID.EnbID = ngeNBID } indHdrFormat1.GlobalKPMnodeID = globalngeNBID } else if indHdrFormat1.GlobalKPMnodeIDType == 4 { globaleNBID := &GlobalKPMnodeeNBIDType{} globaleNBID_C := *(**C.GlobalKPMnode_eNB_ID_t)(unsafe.Pointer(&globalKPMnodeID_C.choice[0])) plmnID_C := globaleNBID_C.global_eNB_ID.pLMN_Identity globaleNBID.PlmnID.Buf = C.GoBytes(unsafe.Pointer(plmnID_C.buf), C.int(plmnID_C.size)) globaleNBID.PlmnID.Size = int(plmnID_C.size) globaleNBID_eNBID_C := globaleNBID_C.global_eNB_ID.eNB_ID globaleNBID.EnbIDType = int(globaleNBID_eNBID_C.present) if globaleNBID.EnbIDType == 1 { eNBID := &ENBID_Macro{} eNBID_C := (*C.BIT_STRING_t)(unsafe.Pointer(&globaleNBID_eNBID_C.choice[0])) eNBID.Buf = C.GoBytes(unsafe.Pointer(eNBID_C.buf), C.int(eNBID_C.size)) eNBID.Size = int(eNBID_C.size) eNBID.BitsUnused = int(eNBID_C.bits_unused) globaleNBID.EnbID = eNBID } else if globaleNBID.EnbIDType == 2 { eNBID := &ENBID_Home{} eNBID_C := (*C.BIT_STRING_t)(unsafe.Pointer(&globaleNBID_eNBID_C.choice[0])) eNBID.Buf = C.GoBytes(unsafe.Pointer(eNBID_C.buf), C.int(eNBID_C.size)) eNBID.Size = int(eNBID_C.size) eNBID.BitsUnused = int(eNBID_C.bits_unused) globaleNBID.EnbID = eNBID } else if globaleNBID.EnbIDType == 3 { eNBID := &ENBID_ShortMacro{} eNBID_C := (*C.BIT_STRING_t)(unsafe.Pointer(&globaleNBID_eNBID_C.choice[0])) eNBID.Buf = C.GoBytes(unsafe.Pointer(eNBID_C.buf), C.int(eNBID_C.size)) eNBID.Size = int(eNBID_C.size) eNBID.BitsUnused = int(eNBID_C.bits_unused) globaleNBID.EnbID = eNBID } else if globaleNBID.EnbIDType == 4 { eNBID := &ENBID_LongMacro{} eNBID_C := (*C.BIT_STRING_t)(unsafe.Pointer(&globaleNBID_eNBID_C.choice[0])) eNBID.Buf = C.GoBytes(unsafe.Pointer(eNBID_C.buf), C.int(eNBID_C.size)) eNBID.Size = int(eNBID_C.size) eNBID.BitsUnused = int(eNBID_C.bits_unused) globaleNBID.EnbID = eNBID } indHdrFormat1.GlobalKPMnodeID = globaleNBID } } else { indHdrFormat1.GlobalKPMnodeIDType = 0 } if indHdrFormat1_C.nRCGI != nil { indHdrFormat1.NRCGI = &NRCGIType{} plmnID := indHdrFormat1_C.nRCGI.pLMN_Identity indHdrFormat1.NRCGI.PlmnID.Buf = C.GoBytes(unsafe.Pointer(plmnID.buf), C.int(plmnID.size)) indHdrFormat1.NRCGI.PlmnID.Size = int(plmnID.size) nRCellID := indHdrFormat1_C.nRCGI.nRCellIdentity indHdrFormat1.NRCGI.NRCellID.Buf = C.GoBytes(unsafe.Pointer(nRCellID.buf), C.int(nRCellID.size)) indHdrFormat1.NRCGI.NRCellID.Size = int(nRCellID.size) indHdrFormat1.NRCGI.NRCellID.BitsUnused = int(nRCellID.bits_unused) } if indHdrFormat1_C.pLMN_Identity != nil { indHdrFormat1.PlmnID = &OctetString{} indHdrFormat1.PlmnID.Buf = C.GoBytes(unsafe.Pointer(indHdrFormat1_C.pLMN_Identity.buf), C.int(indHdrFormat1_C.pLMN_Identity.size)) indHdrFormat1.PlmnID.Size = int(indHdrFormat1_C.pLMN_Identity.size) } if indHdrFormat1_C.sliceID != nil { indHdrFormat1.SliceID = &SliceIDType{} sST := indHdrFormat1_C.sliceID.sST indHdrFormat1.SliceID.SST.Buf = C.GoBytes(unsafe.Pointer(sST.buf), C.int(sST.size)) indHdrFormat1.SliceID.SST.Size = int(sST.size) if indHdrFormat1_C.sliceID.sD != nil { indHdrFormat1.SliceID.SD = &OctetString{} sD := indHdrFormat1_C.sliceID.sD indHdrFormat1.SliceID.SD.Buf = C.GoBytes(unsafe.Pointer(sD.buf), C.int(sD.size)) indHdrFormat1.SliceID.SD.Size = int(sD.size) } } if indHdrFormat1_C.fiveQI != nil { indHdrFormat1.FiveQI = int64(*indHdrFormat1_C.fiveQI) } else { indHdrFormat1.FiveQI = -1 } if indHdrFormat1_C.qci != nil { indHdrFormat1.Qci = int64(*indHdrFormat1_C.qci) } else { indHdrFormat1.Qci = -1 } if indHdrFormat1_C.message_Type != nil { indHdrFormat1.UeMessageType = int32(*indHdrFormat1_C.message_Type) } else { indHdrFormat1.UeMessageType = -1 } if indHdrFormat1_C.gNB_DU_ID != nil { indHdrFormat1.GnbDUID = &Integer{} indHdrFormat1.GnbDUID.Buf = C.GoBytes(unsafe.Pointer(indHdrFormat1_C.gNB_DU_ID.buf), C.int(indHdrFormat1_C.gNB_DU_ID.size)) indHdrFormat1.GnbDUID.Size = int(indHdrFormat1_C.gNB_DU_ID.size) } if indHdrFormat1_C.gNB_Name != nil { indHdrFormat1.GnbNameType = int32(indHdrFormat1_C.gNB_Name.present) if indHdrFormat1.GnbNameType == 1 { gNBName := &GNB_DU_Name{} gNBName_C := (*C.GNB_DU_Name_t)(unsafe.Pointer(&indHdrFormat1_C.gNB_Name.choice[0])) gNBName.Buf = C.GoBytes(unsafe.Pointer(gNBName_C.buf), C.int(gNBName_C.size)) gNBName.Size = int(gNBName_C.size) indHdrFormat1.GnbName = gNBName } else if indHdrFormat1.GnbNameType == 2 { gNBName := &GNB_CU_CP_Name{} gNBName_C := (*C.GNB_CU_CP_Name_t)(unsafe.Pointer(&indHdrFormat1_C.gNB_Name.choice[0])) gNBName.Buf = C.GoBytes(unsafe.Pointer(gNBName_C.buf), C.int(gNBName_C.size)) gNBName.Size = int(gNBName_C.size) indHdrFormat1.GnbName = gNBName } else if indHdrFormat1.GnbNameType == 3 { gNBName := &GNB_CU_UP_Name{} gNBName_C := (*C.GNB_CU_UP_Name_t)(unsafe.Pointer(&indHdrFormat1_C.gNB_Name.choice[0])) gNBName.Buf = C.GoBytes(unsafe.Pointer(gNBName_C.buf), C.int(gNBName_C.size)) gNBName.Size = int(gNBName_C.size) indHdrFormat1.GnbName = gNBName } } else { indHdrFormat1.GnbNameType = -1 } if indHdrFormat1_C.global_GNB_ID != nil { indHdrFormat1.GlobalgNBID = &GlobalgNBIDType{} plmnID_C := indHdrFormat1_C.global_GNB_ID.plmn_id indHdrFormat1.GlobalgNBID.PlmnID.Buf = C.GoBytes(unsafe.Pointer(plmnID_C.buf), C.int(plmnID_C.size)) indHdrFormat1.GlobalgNBID.PlmnID.Size = int(plmnID_C.size) globalgNBID_gNBID_C := indHdrFormat1_C.global_GNB_ID.gnb_id indHdrFormat1.GlobalgNBID.GnbIDType = int(globalgNBID_gNBID_C.present) if indHdrFormat1.GlobalgNBID.GnbIDType == 1 { gNBID := &GNBID{} gNBID_C := (*C.BIT_STRING_t)(unsafe.Pointer(&globalgNBID_gNBID_C.choice[0])) gNBID.Buf = C.GoBytes(unsafe.Pointer(gNBID_C.buf), C.int(gNBID_C.size)) gNBID.Size = int(gNBID_C.size) gNBID.BitsUnused = int(gNBID_C.bits_unused) indHdrFormat1.GlobalgNBID.GnbID = gNBID } } indHdr.IndHdr = indHdrFormat1 } else { return indHdr, errors.New("Unknown RIC Indication Header type") } return } func (c *E2sm) GetIndicationMessage(buffer []byte) (indMsg *IndicationMessage, err error) { cptr := unsafe.Pointer(&buffer[0]) indMsg = &IndicationMessage{} decodedMsg := C.e2sm_decode_ric_indication_message(cptr, C.size_t(len(buffer))) if decodedMsg == nil { return indMsg, errors.New("e2sm wrapper is unable to get IndicationMessage due to wrong or invalid input") } defer C.e2sm_free_ric_indication_message(decodedMsg) indMsg.StyleType = int64(decodedMsg.ric_Style_Type) indMsg.IndMsgType = int32(decodedMsg.indicationMessage.present) if indMsg.IndMsgType == 1 { indMsgFormat1 := &IndicationMessageFormat1{} indMsgFormat1_C := *(**C.E2SM_KPM_IndicationMessage_Format1_t)(unsafe.Pointer(&decodedMsg.indicationMessage.choice[0])) indMsgFormat1.PMContainerCount = int(indMsgFormat1_C.pm_Containers.list.count) for i := 0; i < indMsgFormat1.PMContainerCount; i++ { pmContainer := &indMsgFormat1.PMContainers[i] var sizeof_PM_Containers_List_t *C.PM_Containers_List_t pmContainer_C := *(**C.PM_Containers_List_t)(unsafe.Pointer(uintptr(unsafe.Pointer(indMsgFormat1_C.pm_Containers.list.array)) + (uintptr)(i)*unsafe.Sizeof(sizeof_PM_Containers_List_t))) if pmContainer_C.performanceContainer != nil { pfContainer := &PFContainerType{} pfContainer.ContainerType = int32(pmContainer_C.performanceContainer.present) if pfContainer.ContainerType == 1 { oDU_PF := &ODUPFContainerType{} oDU_PF_C := *(**C.ODU_PF_Container_t)(unsafe.Pointer(&pmContainer_C.performanceContainer.choice[0])) oDU_PF.CellResourceReportCount = int(oDU_PF_C.cellResourceReportList.list.count) for j := 0; j < oDU_PF.CellResourceReportCount; j++ { cellResourceReport := &oDU_PF.CellResourceReports[j] var sizeof_CellResourceReportListItem_t *C.CellResourceReportListItem_t cellResourceReport_C := *(**C.CellResourceReportListItem_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(oDU_PF_C.cellResourceReportList.list.array)) + (uintptr)(j)*unsafe.Sizeof(sizeof_CellResourceReportListItem_t))) cellResourceReport.NRCGI.PlmnID.Buf = C.GoBytes(unsafe.Pointer(cellResourceReport_C.nRCGI.pLMN_Identity.buf), C.int(cellResourceReport_C.nRCGI.pLMN_Identity.size)) cellResourceReport.NRCGI.PlmnID.Size = int(cellResourceReport_C.nRCGI.pLMN_Identity.size) cellResourceReport.NRCGI.NRCellID.Buf = C.GoBytes(unsafe.Pointer(cellResourceReport_C.nRCGI.nRCellIdentity.buf), C.int(cellResourceReport_C.nRCGI.nRCellIdentity.size)) cellResourceReport.NRCGI.NRCellID.Size = int(cellResourceReport_C.nRCGI.nRCellIdentity.size) cellResourceReport.NRCGI.NRCellID.BitsUnused = int(cellResourceReport_C.nRCGI.nRCellIdentity.bits_unused) if cellResourceReport_C.dl_TotalofAvailablePRBs != nil { cellResourceReport.TotalofAvailablePRBs.DL = int64(*cellResourceReport_C.dl_TotalofAvailablePRBs) } else { cellResourceReport.TotalofAvailablePRBs.DL = -1 } if cellResourceReport_C.ul_TotalofAvailablePRBs != nil { cellResourceReport.TotalofAvailablePRBs.UL = int64(*cellResourceReport_C.ul_TotalofAvailablePRBs) } else { cellResourceReport.TotalofAvailablePRBs.UL = -1 } cellResourceReport.ServedPlmnPerCellCount = int(cellResourceReport_C.servedPlmnPerCellList.list.count) for k := 0; k < cellResourceReport.ServedPlmnPerCellCount; k++ { servedPlmnPerCell := cellResourceReport.ServedPlmnPerCells[k] var sizeof_ServedPlmnPerCellListItem_t *C.ServedPlmnPerCellListItem_t servedPlmnPerCell_C := *(**C.ServedPlmnPerCellListItem_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(cellResourceReport_C.servedPlmnPerCellList.list.array)) + (uintptr)(k)*unsafe.Sizeof(sizeof_ServedPlmnPerCellListItem_t))) servedPlmnPerCell.PlmnID.Buf = C.GoBytes(unsafe.Pointer(servedPlmnPerCell_C.pLMN_Identity.buf), C.int(servedPlmnPerCell_C.pLMN_Identity.size)) servedPlmnPerCell.PlmnID.Size = int(servedPlmnPerCell_C.pLMN_Identity.size) if servedPlmnPerCell_C.du_PM_5GC != nil { duPM5GC := &DUPM5GCContainerType{} duPM5GC_C := (*C.FGC_DU_PM_Container_t)(servedPlmnPerCell_C.du_PM_5GC) duPM5GC.SlicePerPlmnPerCellCount = int(duPM5GC_C.slicePerPlmnPerCellList.list.count) for l := 0; l < duPM5GC.SlicePerPlmnPerCellCount; l++ { slicePerPlmnPerCell := &duPM5GC.SlicePerPlmnPerCells[l] var sizeof_SlicePerPlmnPerCellListItem_t *C.SlicePerPlmnPerCellListItem_t slicePerPlmnPerCell_C := *(**C.SlicePerPlmnPerCellListItem_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(duPM5GC_C.slicePerPlmnPerCellList.list.array)) + (uintptr)(l)*unsafe.Sizeof(sizeof_SlicePerPlmnPerCellListItem_t))) slicePerPlmnPerCell.SliceID.SST.Buf = C.GoBytes(unsafe.Pointer(slicePerPlmnPerCell_C.sliceID.sST.buf), C.int(slicePerPlmnPerCell_C.sliceID.sST.size)) slicePerPlmnPerCell.SliceID.SST.Size = int(slicePerPlmnPerCell_C.sliceID.sST.size) if slicePerPlmnPerCell_C.sliceID.sD != nil { slicePerPlmnPerCell.SliceID.SD = &OctetString{} slicePerPlmnPerCell.SliceID.SD.Buf = C.GoBytes(unsafe.Pointer(slicePerPlmnPerCell_C.sliceID.sD.buf), C.int(slicePerPlmnPerCell_C.sliceID.sD.size)) slicePerPlmnPerCell.SliceID.SD.Size = int(slicePerPlmnPerCell_C.sliceID.sD.size) } slicePerPlmnPerCell.FQIPERSlicesPerPlmnPerCellCount = int(slicePerPlmnPerCell_C.fQIPERSlicesPerPlmnPerCellList.list.count) for m := 0; m < slicePerPlmnPerCell.FQIPERSlicesPerPlmnPerCellCount; m++ { fQIPerSlicesPerPlmnPerCell := &slicePerPlmnPerCell.FQIPERSlicesPerPlmnPerCells[m] var sizeof_FQIPERSlicesPerPlmnPerCellListItem_t *C.FQIPERSlicesPerPlmnPerCellListItem_t fQIPerSlicesPerPlmnPerCell_C := *(**C.FQIPERSlicesPerPlmnPerCellListItem_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(slicePerPlmnPerCell_C.fQIPERSlicesPerPlmnPerCellList.list.array)) + (uintptr)(m)*unsafe.Sizeof(sizeof_FQIPERSlicesPerPlmnPerCellListItem_t))) fQIPerSlicesPerPlmnPerCell.FiveQI = int64(fQIPerSlicesPerPlmnPerCell_C.fiveQI) if fQIPerSlicesPerPlmnPerCell_C.dl_PRBUsage != nil { fQIPerSlicesPerPlmnPerCell.PrbUsage.DL = int64(*fQIPerSlicesPerPlmnPerCell_C.dl_PRBUsage) } else { fQIPerSlicesPerPlmnPerCell.PrbUsage.DL = -1 } if fQIPerSlicesPerPlmnPerCell_C.ul_PRBUsage != nil { fQIPerSlicesPerPlmnPerCell.PrbUsage.UL = int64(*fQIPerSlicesPerPlmnPerCell_C.ul_PRBUsage) } else { fQIPerSlicesPerPlmnPerCell.PrbUsage.UL = -1 } } } servedPlmnPerCell.DUPM5GC = duPM5GC } if servedPlmnPerCell_C.du_PM_EPC != nil { duPMEPC := &DUPMEPCContainerType{} duPMEPC_C := (*C.EPC_DU_PM_Container_t)(servedPlmnPerCell_C.du_PM_EPC) duPMEPC.PerQCIReportCount = int(duPMEPC_C.perQCIReportList.list.count) for l := 0; l < duPMEPC.PerQCIReportCount; l++ { perQCIReport := &duPMEPC.PerQCIReports[l] var sizeof_PerQCIReportListItem_t *C.PerQCIReportListItem_t perQCIReport_C := *(**C.PerQCIReportListItem_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(duPMEPC_C.perQCIReportList.list.array)) + (uintptr)(l)*unsafe.Sizeof(sizeof_PerQCIReportListItem_t))) perQCIReport.QCI = int64(perQCIReport_C.qci) if perQCIReport_C.dl_PRBUsage != nil { perQCIReport.PrbUsage.DL = int64(*perQCIReport_C.dl_PRBUsage) } else { perQCIReport.PrbUsage.DL = -1 } if perQCIReport_C.ul_PRBUsage != nil { perQCIReport.PrbUsage.UL = int64(*perQCIReport_C.ul_PRBUsage) } else { perQCIReport.PrbUsage.UL = -1 } } servedPlmnPerCell.DUPMEPC = duPMEPC } } } pfContainer.Container = oDU_PF } else if pfContainer.ContainerType == 2 { oCU_CP_PF := &OCUCPPFContainerType{} oCU_CP_PF_C := *(**C.OCUCP_PF_Container_t)(unsafe.Pointer(&pmContainer_C.performanceContainer.choice[0])) if oCU_CP_PF_C.gNB_CU_CP_Name != nil { oCU_CP_PF.GNBCUCPName = &PrintableString{} oCU_CP_PF.GNBCUCPName.Buf = C.GoBytes(unsafe.Pointer(oCU_CP_PF_C.gNB_CU_CP_Name.buf), C.int(oCU_CP_PF_C.gNB_CU_CP_Name.size)) oCU_CP_PF.GNBCUCPName.Size = int(oCU_CP_PF_C.gNB_CU_CP_Name.size) } if oCU_CP_PF_C.cu_CP_Resource_Status.numberOfActive_UEs != nil { oCU_CP_PF.CUCPResourceStatus.NumberOfActiveUEs = int64(*oCU_CP_PF_C.cu_CP_Resource_Status.numberOfActive_UEs) } pfContainer.Container = oCU_CP_PF } else if pfContainer.ContainerType == 3 { oCU_UP_PF := &OCUUPPFContainerType{} oCU_UP_PF_C := *(**C.OCUUP_PF_Container_t)(unsafe.Pointer(&pmContainer_C.performanceContainer.choice[0])) if oCU_UP_PF_C.gNB_CU_UP_Name != nil { oCU_UP_PF.GNBCUUPName = &PrintableString{} oCU_UP_PF.GNBCUUPName.Buf = C.GoBytes(unsafe.Pointer(oCU_UP_PF_C.gNB_CU_UP_Name.buf), C.int(oCU_UP_PF_C.gNB_CU_UP_Name.size)) oCU_UP_PF.GNBCUUPName.Size = int(oCU_UP_PF_C.gNB_CU_UP_Name.size) } oCU_UP_PF.CUUPPFContainerItemCount = int(oCU_UP_PF_C.pf_ContainerList.list.count) for j := 0; j < oCU_UP_PF.CUUPPFContainerItemCount; j++ { cuUPPFContainer := &oCU_UP_PF.CUUPPFContainerItems[j] var sizeof_PF_ContainerListItem_t *C.PF_ContainerListItem_t cuUPPFContainer_C := *(**C.PF_ContainerListItem_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(oCU_UP_PF_C.pf_ContainerList.list.array)) + (uintptr)(j)*unsafe.Sizeof(sizeof_PF_ContainerListItem_t))) cuUPPFContainer.InterfaceType = int64(cuUPPFContainer_C.interface_type) cuUPPFContainer.OCUUPPMContainer.CUUPPlmnCount = int(cuUPPFContainer_C.o_CU_UP_PM_Container.plmnList.list.count) for k := 0; k < cuUPPFContainer.OCUUPPMContainer.CUUPPlmnCount; k++ { cuUPPlmn := &cuUPPFContainer.OCUUPPMContainer.CUUPPlmns[k] var sizeof_PlmnID_List_t *C.PlmnID_List_t cuUPPlmn_C := *(**C.PlmnID_List_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(cuUPPFContainer_C.o_CU_UP_PM_Container.plmnList.list.array)) + (uintptr)(k)*unsafe.Sizeof(sizeof_PlmnID_List_t))) cuUPPlmn.PlmnID.Buf = C.GoBytes(unsafe.Pointer(cuUPPlmn_C.pLMN_Identity.buf), C.int(cuUPPlmn_C.pLMN_Identity.size)) cuUPPlmn.PlmnID.Size = int(cuUPPlmn_C.pLMN_Identity.size) if cuUPPlmn_C.cu_UP_PM_5GC != nil { cuUPPM5GC := &CUUPPM5GCType{} cuUPPM5GC_C := (*C.FGC_CUUP_PM_Format_t)(cuUPPlmn_C.cu_UP_PM_5GC) cuUPPM5GC.SliceToReportCount = int(cuUPPM5GC_C.sliceToReportList.list.count) for l := 0; l < cuUPPM5GC.SliceToReportCount; l++ { sliceToReport := &cuUPPM5GC.SliceToReports[l] var sizeof_SliceToReportListItem_t *C.SliceToReportListItem_t sliceToReport_C := *(**C.SliceToReportListItem_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(cuUPPM5GC_C.sliceToReportList.list.array)) + (uintptr)(l)*unsafe.Sizeof(sizeof_SliceToReportListItem_t))) sliceToReport.SliceID.SST.Buf = C.GoBytes(unsafe.Pointer(sliceToReport_C.sliceID.sST.buf), C.int(sliceToReport_C.sliceID.sST.size)) sliceToReport.SliceID.SST.Size = int(sliceToReport_C.sliceID.sST.size) if sliceToReport_C.sliceID.sD != nil { sliceToReport.SliceID.SD = &OctetString{} sliceToReport.SliceID.SD.Buf = C.GoBytes(unsafe.Pointer(sliceToReport_C.sliceID.sD.buf), C.int(sliceToReport_C.sliceID.sD.size)) sliceToReport.SliceID.SD.Size = int(sliceToReport_C.sliceID.sD.size) } sliceToReport.FQIPERSlicesPerPlmnCount = int(sliceToReport_C.fQIPERSlicesPerPlmnList.list.count) for m := 0; m < sliceToReport.FQIPERSlicesPerPlmnCount; m++ { fQIPerSlicesPerPlmn := &sliceToReport.FQIPERSlicesPerPlmns[m] var sizeof_FQIPERSlicesPerPlmnListItem_t *C.FQIPERSlicesPerPlmnListItem_t fQIPerSlicesPerPlmn_C := *(**C.FQIPERSlicesPerPlmnListItem_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(sliceToReport_C.fQIPERSlicesPerPlmnList.list.array)) + (uintptr)(m)*unsafe.Sizeof(sizeof_FQIPERSlicesPerPlmnListItem_t))) fQIPerSlicesPerPlmn.FiveQI = int64(fQIPerSlicesPerPlmn_C.fiveQI) if fQIPerSlicesPerPlmn_C.pDCPBytesDL != nil { fQIPerSlicesPerPlmn.PDCPBytesDL = &Integer{} fQIPerSlicesPerPlmn.PDCPBytesDL.Buf = C.GoBytes(unsafe.Pointer(fQIPerSlicesPerPlmn_C.pDCPBytesDL.buf), C.int(fQIPerSlicesPerPlmn_C.pDCPBytesDL.size)) fQIPerSlicesPerPlmn.PDCPBytesDL.Size = int(fQIPerSlicesPerPlmn_C.pDCPBytesDL.size) } if fQIPerSlicesPerPlmn_C.pDCPBytesUL != nil { fQIPerSlicesPerPlmn.PDCPBytesUL = &Integer{} fQIPerSlicesPerPlmn.PDCPBytesUL.Buf = C.GoBytes(unsafe.Pointer(fQIPerSlicesPerPlmn_C.pDCPBytesUL.buf), C.int(fQIPerSlicesPerPlmn_C.pDCPBytesUL.size)) fQIPerSlicesPerPlmn.PDCPBytesUL.Size = int(fQIPerSlicesPerPlmn_C.pDCPBytesUL.size) } } } cuUPPlmn.CUUPPM5GC = cuUPPM5GC } if cuUPPlmn_C.cu_UP_PM_EPC != nil { cuUPPMEPC := &CUUPPMEPCType{} cuUPPMEPC_C := (*C.EPC_CUUP_PM_Format_t)(cuUPPlmn_C.cu_UP_PM_EPC) cuUPPMEPC.CUUPPMEPCPerQCIReportCount = int(cuUPPMEPC_C.perQCIReportList.list.count) for l := 0; l < cuUPPMEPC.CUUPPMEPCPerQCIReportCount; l++ { perQCIReport := &cuUPPMEPC.CUUPPMEPCPerQCIReports[l] var sizeof_PerQCIReportListItemFormat_t *C.PerQCIReportListItemFormat_t perQCIReport_C := *(**C.PerQCIReportListItemFormat_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(cuUPPMEPC_C.perQCIReportList.list.array)) + (uintptr)(l)*unsafe.Sizeof(sizeof_PerQCIReportListItemFormat_t))) perQCIReport.QCI = int64(perQCIReport_C.qci) if perQCIReport_C.pDCPBytesDL != nil { perQCIReport.PDCPBytesDL = &Integer{} perQCIReport.PDCPBytesDL.Buf = C.GoBytes(unsafe.Pointer(perQCIReport_C.pDCPBytesDL.buf), C.int(perQCIReport_C.pDCPBytesDL.size)) perQCIReport.PDCPBytesDL.Size = int(perQCIReport_C.pDCPBytesDL.size) } if perQCIReport_C.pDCPBytesUL != nil { perQCIReport.PDCPBytesUL = &Integer{} perQCIReport.PDCPBytesUL.Buf = C.GoBytes(unsafe.Pointer(perQCIReport_C.pDCPBytesUL.buf), C.int(perQCIReport_C.pDCPBytesUL.size)) perQCIReport.PDCPBytesUL.Size = int(perQCIReport_C.pDCPBytesUL.size) } } cuUPPlmn.CUUPPMEPC = cuUPPMEPC } } } pfContainer.Container = oCU_UP_PF } else { return indMsg, errors.New("Unknown PF Container type") } pmContainer.PFContainer = pfContainer } if pmContainer_C.theRANContainer != nil { ranContainer := &RANContainerType{} ranContainer.Timestamp.Buf = C.GoBytes(unsafe.Pointer(pmContainer_C.theRANContainer.timestamp.buf), C.int(pmContainer_C.theRANContainer.timestamp.size)) ranContainer.Timestamp.Size = int(pmContainer_C.theRANContainer.timestamp.size) ranContainer.ContainerType = int32(pmContainer_C.theRANContainer.reportContainer.present) if ranContainer.ContainerType == 1 { oDU_UE := &DUUsageReportType{} oDU_UE_C := *(**C.DU_Usage_Report_Per_UE_t)(unsafe.Pointer(&pmContainer_C.theRANContainer.reportContainer.choice[0])) oDU_UE.CellResourceReportItemCount = int(oDU_UE_C.cellResourceReportList.list.count) for j := 0; j < oDU_UE.CellResourceReportItemCount; j++ { cellResourceReport := &oDU_UE.CellResourceReportItems[j] var sizeof_DU_Usage_Report_CellResourceReportItem_t *C.DU_Usage_Report_CellResourceReportItem_t cellResourceReport_C := *(**C.DU_Usage_Report_CellResourceReportItem_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(oDU_UE_C.cellResourceReportList.list.array)) + (uintptr)(j)*unsafe.Sizeof(sizeof_DU_Usage_Report_CellResourceReportItem_t))) cellResourceReport.NRCGI.PlmnID.Buf = C.GoBytes(unsafe.Pointer(cellResourceReport_C.nRCGI.pLMN_Identity.buf), C.int(cellResourceReport_C.nRCGI.pLMN_Identity.size)) cellResourceReport.NRCGI.PlmnID.Size = int(cellResourceReport_C.nRCGI.pLMN_Identity.size) cellResourceReport.NRCGI.NRCellID.Buf = C.GoBytes(unsafe.Pointer(cellResourceReport_C.nRCGI.nRCellIdentity.buf), C.int(cellResourceReport_C.nRCGI.nRCellIdentity.size)) cellResourceReport.NRCGI.NRCellID.Size = int(cellResourceReport_C.nRCGI.nRCellIdentity.size) cellResourceReport.NRCGI.NRCellID.BitsUnused = int(cellResourceReport_C.nRCGI.nRCellIdentity.bits_unused) cellResourceReport.UeResourceReportItemCount = int(cellResourceReport_C.ueResourceReportList.list.count) for k := 0; k < cellResourceReport.UeResourceReportItemCount; k++ { ueResourceReport := &cellResourceReport.UeResourceReportItems[k] var sizeof_DU_Usage_Report_UeResourceReportItem_t *C.DU_Usage_Report_UeResourceReportItem_t ueResourceReport_C := *(**C.DU_Usage_Report_UeResourceReportItem_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(cellResourceReport_C.ueResourceReportList.list.array)) + (uintptr)(k)*unsafe.Sizeof(sizeof_DU_Usage_Report_UeResourceReportItem_t))) ueResourceReport.CRNTI.Buf = C.GoBytes(unsafe.Pointer(ueResourceReport_C.c_RNTI.buf), C.int(ueResourceReport_C.c_RNTI.size)) ueResourceReport.CRNTI.Size = int(ueResourceReport_C.c_RNTI.size) if ueResourceReport_C.dl_PRBUsage != nil { ueResourceReport.PRBUsageDL = int64(*ueResourceReport_C.dl_PRBUsage) } else { ueResourceReport.PRBUsageDL = -1 } if ueResourceReport_C.ul_PRBUsage != nil { ueResourceReport.PRBUsageUL = int64(*ueResourceReport_C.ul_PRBUsage) } else { ueResourceReport.PRBUsageUL = -1 } } } ranContainer.Container = oDU_UE } else if ranContainer.ContainerType == 2 { oCU_CP_UE := &CUCPUsageReportType{} oCU_CP_UE_C := *(**C.CU_CP_Usage_Report_Per_UE_t)(unsafe.Pointer(&pmContainer_C.theRANContainer.reportContainer.choice[0])) oCU_CP_UE.CellResourceReportItemCount = int(oCU_CP_UE_C.cellResourceReportList.list.count) for j := 0; j < oCU_CP_UE.CellResourceReportItemCount; j++ { cellResourceReport := &oCU_CP_UE.CellResourceReportItems[j] var sizeof_CU_CP_Usage_Report_CellResourceReportItem_t *C.CU_CP_Usage_Report_CellResourceReportItem_t cellResourceReport_C := *(**C.CU_CP_Usage_Report_CellResourceReportItem_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(oCU_CP_UE_C.cellResourceReportList.list.array)) + (uintptr)(j)*unsafe.Sizeof(sizeof_CU_CP_Usage_Report_CellResourceReportItem_t))) cellResourceReport.NRCGI.PlmnID.Buf = C.GoBytes(unsafe.Pointer(cellResourceReport_C.nRCGI.pLMN_Identity.buf), C.int(cellResourceReport_C.nRCGI.pLMN_Identity.size)) cellResourceReport.NRCGI.PlmnID.Size = int(cellResourceReport_C.nRCGI.pLMN_Identity.size) cellResourceReport.NRCGI.NRCellID.Buf = C.GoBytes(unsafe.Pointer(cellResourceReport_C.nRCGI.nRCellIdentity.buf), C.int(cellResourceReport_C.nRCGI.nRCellIdentity.size)) cellResourceReport.NRCGI.NRCellID.Size = int(cellResourceReport_C.nRCGI.nRCellIdentity.size) cellResourceReport.NRCGI.NRCellID.BitsUnused = int(cellResourceReport_C.nRCGI.nRCellIdentity.bits_unused) cellResourceReport.UeResourceReportItemCount = int(cellResourceReport_C.ueResourceReportList.list.count) for k := 0; k < cellResourceReport.UeResourceReportItemCount; k++ { ueResourceReport := &cellResourceReport.UeResourceReportItems[k] var sizeof_CU_CP_Usage_Report_UeResourceReportItem_t *C.CU_CP_Usage_Report_UeResourceReportItem_t ueResourceReport_C := *(**C.CU_CP_Usage_Report_UeResourceReportItem_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(cellResourceReport_C.ueResourceReportList.list.array)) + (uintptr)(k)*unsafe.Sizeof(sizeof_CU_CP_Usage_Report_UeResourceReportItem_t))) ueResourceReport.CRNTI.Buf = C.GoBytes(unsafe.Pointer(ueResourceReport_C.c_RNTI.buf), C.int(ueResourceReport_C.c_RNTI.size)) ueResourceReport.CRNTI.Size = int(ueResourceReport_C.c_RNTI.size) if ueResourceReport_C.serving_Cell_RF_Type != nil { ueResourceReport.ServingCellRF = &OctetString{} ueResourceReport.ServingCellRF.Buf = C.GoBytes(unsafe.Pointer(ueResourceReport_C.serving_Cell_RF_Type.buf), C.int(ueResourceReport_C.serving_Cell_RF_Type.size)) ueResourceReport.ServingCellRF.Size = int(ueResourceReport_C.serving_Cell_RF_Type.size) } if ueResourceReport_C.neighbor_Cell_RF != nil { ueResourceReport.NeighborCellRF = &OctetString{} ueResourceReport.NeighborCellRF.Buf = C.GoBytes(unsafe.Pointer(ueResourceReport_C.neighbor_Cell_RF.buf), C.int(ueResourceReport_C.neighbor_Cell_RF.size)) ueResourceReport.NeighborCellRF.Size = int(ueResourceReport_C.neighbor_Cell_RF.size) } } } ranContainer.Container = oCU_CP_UE } else if ranContainer.ContainerType == 3 { oCU_UP_UE := &CUUPUsageReportType{} oCU_UP_UE_C := *(**C.CU_UP_Usage_Report_Per_UE_t)(unsafe.Pointer(&pmContainer_C.theRANContainer.reportContainer.choice[0])) oCU_UP_UE.CellResourceReportItemCount = int(oCU_UP_UE_C.cellResourceReportList.list.count) for j := 0; j < oCU_UP_UE.CellResourceReportItemCount; j++ { cellResourceReport := &oCU_UP_UE.CellResourceReportItems[j] var sizeof_CU_UP_Usage_Report_CellResourceReportItem_t *C.CU_UP_Usage_Report_CellResourceReportItem_t cellResourceReport_C := *(**C.CU_UP_Usage_Report_CellResourceReportItem_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(oCU_UP_UE_C.cellResourceReportList.list.array)) + (uintptr)(j)*unsafe.Sizeof(sizeof_CU_UP_Usage_Report_CellResourceReportItem_t))) cellResourceReport.NRCGI.PlmnID.Buf = C.GoBytes(unsafe.Pointer(cellResourceReport_C.nRCGI.pLMN_Identity.buf), C.int(cellResourceReport_C.nRCGI.pLMN_Identity.size)) cellResourceReport.NRCGI.PlmnID.Size = int(cellResourceReport_C.nRCGI.pLMN_Identity.size) cellResourceReport.NRCGI.NRCellID.Buf = C.GoBytes(unsafe.Pointer(cellResourceReport_C.nRCGI.nRCellIdentity.buf), C.int(cellResourceReport_C.nRCGI.nRCellIdentity.size)) cellResourceReport.NRCGI.NRCellID.Size = int(cellResourceReport_C.nRCGI.nRCellIdentity.size) cellResourceReport.NRCGI.NRCellID.BitsUnused = int(cellResourceReport_C.nRCGI.nRCellIdentity.bits_unused) cellResourceReport.UeResourceReportItemCount = int(cellResourceReport_C.ueResourceReportList.list.count) for k := 0; k < cellResourceReport.UeResourceReportItemCount; k++ { ueResourceReport := &cellResourceReport.UeResourceReportItems[k] var sizeof_CU_UP_Usage_Report_UeResourceReportItem_t *C.CU_UP_Usage_Report_UeResourceReportItem_t ueResourceReport_C := *(**C.CU_UP_Usage_Report_UeResourceReportItem_t)(unsafe.Pointer((uintptr)(unsafe.Pointer(cellResourceReport_C.ueResourceReportList.list.array)) + (uintptr)(k)*unsafe.Sizeof(sizeof_CU_UP_Usage_Report_UeResourceReportItem_t))) ueResourceReport.CRNTI.Buf = C.GoBytes(unsafe.Pointer(ueResourceReport_C.c_RNTI.buf), C.int(ueResourceReport_C.c_RNTI.size)) ueResourceReport.CRNTI.Size = int(ueResourceReport_C.c_RNTI.size) if ueResourceReport_C.pDCPBytesDL != nil { ueResourceReport.PDCPBytesDL = &Integer{} ueResourceReport.PDCPBytesDL.Buf = C.GoBytes(unsafe.Pointer(ueResourceReport_C.pDCPBytesDL.buf), C.int(ueResourceReport_C.pDCPBytesDL.size)) ueResourceReport.PDCPBytesDL.Size = int(ueResourceReport_C.pDCPBytesDL.size) } if ueResourceReport_C.pDCPBytesUL != nil { ueResourceReport.PDCPBytesUL = &Integer{} ueResourceReport.PDCPBytesUL.Buf = C.GoBytes(unsafe.Pointer(ueResourceReport_C.pDCPBytesUL.buf), C.int(ueResourceReport_C.pDCPBytesUL.size)) ueResourceReport.PDCPBytesUL.Size = int(ueResourceReport_C.pDCPBytesUL.size) } } } ranContainer.Container = oCU_UP_UE } else { return indMsg, errors.New("Unknown RAN Container type") } pmContainer.RANContainer = ranContainer } } indMsg.IndMsg = indMsgFormat1 } else { return indMsg, errors.New("Unknown RIC Indication Message Format") } return } func (c *E2sm) ParseNRCGI(nRCGI NRCGIType) (CellID string, err error) { var plmnID OctetString var nrCellID BitString plmnID = nRCGI.PlmnID CellID, _ = c.ParsePLMNIdentity(plmnID.Buf, plmnID.Size) nrCellID = nRCGI.NRCellID if plmnID.Size != 3 || nrCellID.Size != 5 { return "", errors.New("Invalid input: illegal length of NRCGI") } var former []uint8 = make([]uint8, 3) var latter []uint8 = make([]uint8, 6) former[0] = nrCellID.Buf[0] >> 4 former[1] = nrCellID.Buf[0] & 0xf former[2] = nrCellID.Buf[1] >> 4 latter[0] = nrCellID.Buf[1] & 0xf latter[1] = nrCellID.Buf[2] >> 4 latter[2] = nrCellID.Buf[2] & 0xf latter[3] = nrCellID.Buf[3] >> 4 latter[4] = nrCellID.Buf[3] & 0xf latter[5] = nrCellID.Buf[4] >> uint(nrCellID.BitsUnused) CellID = CellID + strconv.Itoa(int(former[0])) + strconv.Itoa(int(former[1])) + strconv.Itoa(int(former[2])) + strconv.Itoa(int(latter[0])) + strconv.Itoa(int(latter[1])) + strconv.Itoa(int(latter[2])) + strconv.Itoa(int(latter[3])) + strconv.Itoa(int(latter[4])) + strconv.Itoa(int(latter[5])) return } func (c *E2sm) ParsePLMNIdentity(buffer []byte, size int) (PlmnID string, err error) { if size != 3 { return "", errors.New("Invalid input: illegal length of PlmnID") } var mcc []uint8 = make([]uint8, 3) var mnc []uint8 = make([]uint8, 3) mcc[0] = buffer[0] >> 4 mcc[1] = buffer[0] & 0xf mcc[2] = buffer[1] >> 4 mnc[0] = buffer[1] & 0xf mnc[1] = buffer[2] >> 4 mnc[2] = buffer[2] & 0xf if mnc[0] == 0xf { PlmnID = strconv.Itoa(int(mcc[0])) + strconv.Itoa(int(mcc[1])) + strconv.Itoa(int(mcc[2])) + strconv.Itoa(int(mnc[1])) + strconv.Itoa(int(mnc[2])) } else { PlmnID = strconv.Itoa(int(mcc[0])) + strconv.Itoa(int(mcc[1])) + strconv.Itoa(int(mcc[2])) + strconv.Itoa(int(mnc[0])) + strconv.Itoa(int(mnc[1])) + strconv.Itoa(int(mnc[2])) } return } func (c *E2sm) ParseSliceID(sliceID SliceIDType) (combined int32, err error) { if sliceID.SST.Size != 1 || (sliceID.SD != nil && sliceID.SD.Size != 3) { return 0, errors.New("Invalid input: illegal length of sliceID") } var temp uint8 var sst int32 var sd int32 byteBuffer := bytes.NewBuffer(sliceID.SST.Buf) binary.Read(byteBuffer, binary.BigEndian, &temp) sst = int32(temp) if sliceID.SD == nil { combined = sst << 24 } else { for i := 0; i < sliceID.SD.Size; i++ { byteBuffer = bytes.NewBuffer(sliceID.SD.Buf[i : i+1]) binary.Read(byteBuffer, binary.BigEndian, &temp) sd = sd*256 + int32(temp) } combined = sst<<24 + sd } return } func (c *E2sm) ParseInteger(buffer []byte, size int) (value int64, err error) { var temp uint8 var byteBuffer *bytes.Buffer for i := 0; i < size; i++ { byteBuffer = bytes.NewBuffer(buffer[i : i+1]) binary.Read(byteBuffer, binary.BigEndian, &temp) value = value*256 + int64(temp) } return } func (c *E2sm) ParseTimestamp(buffer []byte, size int) (timestamp *Timestamp, err error) { var temp uint8 var byteBuffer *bytes.Buffer var index int var sec int64 var nsec int64 for index := 0; index < size-8; index++ { byteBuffer = bytes.NewBuffer(buffer[index : index+1]) binary.Read(byteBuffer, binary.BigEndian, &temp) sec = sec*256 + int64(temp) } for index = size - 8; index < size; index++ { byteBuffer = bytes.NewBuffer(buffer[index : index+1]) binary.Read(byteBuffer, binary.BigEndian, &temp) nsec = nsec*256 + int64(temp) } timestamp = &Timestamp{TVsec: sec, TVnsec: nsec} return }