X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=control%2FrcE2SmRc.go;h=f72707c77d747e0fb3d21d2507065d07e1e9b63a;hb=a442087473b475dea8e473efb7ed1f87b3f56b50;hp=ea1492df7403b36bccd8555097bd656a6b271ad6;hpb=727cefb2889f78571bfc655359e03bf20227381c;p=ric-app%2Frc.git diff --git a/control/rcE2SmRc.go b/control/rcE2SmRc.go index ea1492d..f72707c 100644 --- a/control/rcE2SmRc.go +++ b/control/rcE2SmRc.go @@ -1,22 +1,3 @@ -/* -================================================================================== - 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 /* @@ -30,17 +11,67 @@ import ( "errors" "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" "unsafe" + _ "log" + _"encoding/binary" + "encoding/hex" + "strings" + "strconv" ) type E2sm struct { } -func (c *E2sm) SetRicControlHeader(buffer []byte, ueIDbuf []byte, ricControlStyleType int64, ricControlActionID int64) (newBuffer []byte, err error) { +func (c *E2sm) SetRicControlHeader(buffer []byte, ueIdData *UEid, ricControlStyleType int64, ricControlActionID int64) (newBuffer []byte, err error) { + + xapp.Logger.Info("SetRicControlHeader Enter \n") cptr := unsafe.Pointer(&buffer[0]) - cptr_ueIDbuf := unsafe.Pointer(&ueIDbuf[0]) - size := C.e2sm_encode_ric_control_header(cptr, C.size_t(len(buffer)), cptr_ueIDbuf, C.size_t(len(ueIDbuf)), - C.long(ricControlStyleType), C.long(ricControlActionID)) + //cptr_ueIDbuf := unsafe.Pointer(&ueIDbuf[0]) + + lplmnIdBuf := strings.Join(strings.Fields(ueIdData.pLMNIdentitybuf), "") + lIntvar, _ := strconv.Atoi(lplmnIdBuf) + xapp.Logger.Info("lIntvar = %d\n", lIntvar) + + lIntegerByte := ConverIntegerToByte(lIntvar) + //ml.MavLog(ml.INFO, lTransId, " lIntegerByte = %v\n", lIntegerByte) + xapp.Logger.Info(" lIntegerByte = %v\n", lIntegerByte) + lOutByte := get_bytepack_plmnId(lIntegerByte) + xapp.Logger.Info("lOutByte Len:%d\n", len(lOutByte)) + xapp.Logger.Info("lOutByte = %02X\n", lOutByte) + cptrRanParameterValue := unsafe.Pointer(&lOutByte[0]) + + pLMNIdentity := C.CString(ueIdData.pLMNIdentitybuf) + defer C.free(unsafe.Pointer(pLMNIdentity)) + pLMNIdentity_size := C.size_t(len(ueIdData.pLMNIdentitybuf)) + aMFRegionID := C.CString(ueIdData.aMFRegionIDbuf) + defer C.free(unsafe.Pointer(aMFRegionID)) + aMFSetID := C.CString(ueIdData.aMFSetIDbuf) + defer C.free(unsafe.Pointer(aMFSetID)) + aMFPointer := C.CString(ueIdData.aMFPointerbuf) + defer C.free(unsafe.Pointer(aMFPointer)) + + uEID_C := C.struct_uEID{ + amf_UE_NGAP_Id: C.long(ueIdData.amf_UE_NGAP_Id), + pLMNIdentity : pLMNIdentity, + pLMNIdentity_size : pLMNIdentity_size, + aMFRegionID : aMFRegionID, + aMFRegionID_size : 1, //AMFRegionID ::= BIT STRING (SIZE(8)) + aMFSetID : aMFSetID, + aMFSetID_size: 2, //BIT STRING (SIZE(10)) + aMFPointer : aMFPointer, + aMFPointer_size : 1, //BIT STRING (SIZE(6)) + } + + xapp.Logger.Debug("uEID_C amf_UE_NGAP_Id = %l",uEID_C.amf_UE_NGAP_Id) + xapp.Logger.Debug("uEID_C pLMNIdentity = %s",uEID_C.pLMNIdentity) + xapp.Logger.Debug("uEID_C aMFRegionID %s = ",uEID_C.aMFRegionID) + xapp.Logger.Debug("uEID_C aMFSetID %s = ",uEID_C.aMFSetID) + xapp.Logger.Debug("uEID_C aMFPointer %s = ",uEID_C.aMFPointer) + + size := C.e2sm_encode_ric_control_header(cptr, C.size_t(len(buffer)),&uEID_C ,(*C.long)(&ueIdData.F1AP_id[0]),C.size_t(len(ueIdData.F1AP_id)),(*C.long)(&ueIdData.E1AP_id[0]),C.size_t(len(ueIdData.E1AP_id)),(C.long)(ricControlStyleType), (C.long)(ricControlActionID), cptrRanParameterValue,C.size_t(len(lOutByte))) + + //size := C.e2sm_encode_ric_control_header(cptr, C.size_t(len(buffer)),&uEID_C ,(*C.long)(&ueIdData.F1AP_id[0]),(*C.long)(&ueIdData.E1AP_id[0]),(C.long)(ricControlStyleType), (C.long)(ricControlActionID)) + if size < 0 { return make([]byte, 0), errors.New("e2sm wrapper is unable to set EventTriggerDefinition due to wrong or invalid input") } @@ -50,11 +81,27 @@ func (c *E2sm) SetRicControlHeader(buffer []byte, ueIDbuf []byte, ricControlStyl } func (c *E2sm) SetRicControlMessage(buffer []byte, targetPrimaryCell int64, targetCell int64, nrCGIOrECGI int64, nrOrEUtraCell int64, ranParameterValue []byte) (newBuffer []byte, err error) { + + xapp.Logger.Info("SetRicControlMessagei Enter ") + cptr := unsafe.Pointer(&buffer[0]) cptrRanParameterValue := unsafe.Pointer(&ranParameterValue[0]) + /* + lIntvar, _ := strconv.Atoi(string(ranParameterValue)) + xapp.Logger.Info("lIntvar %d\n", lIntvar) + lIntegerByte := ConverIntegerToByte(lIntvar) + xapp.Logger.Info("lIntegerByte %v\n", lIntegerByte) + lOutByte := get_bytepack_plmnId(lIntegerByte) + xapp.Logger.Info("lOutByte Len:%d\n", len(lOutByte)) + xapp.Logger.Info("lOutByte %02X\n", lOutByte) + cptrRanParameterValue := unsafe.Pointer(&lOutByte[0]) + xapp.Logger.Info("cptrRanParameterValue = %v\n ", cptrRanParameterValue) + */ + size := C.e2sm_encode_ric_control_message(cptr, C.size_t(len(buffer)), C.long(targetPrimaryCell), C.long(targetCell), C.long(nrOrEUtraCell), C.long(nrCGIOrECGI), cptrRanParameterValue, C.size_t(len(ranParameterValue))) + if size < 0 { return make([]byte, 0), errors.New("e2sm wrapper is unable to set RicControlMessage due to wrong or invalid input") } @@ -62,3 +109,82 @@ func (c *E2sm) SetRicControlMessage(buffer []byte, targetPrimaryCell int64, targ xapp.Logger.Info("E2sm SetRicControlMessage is success") return } + +func (c *E2sm) GetControlOutcome(buffer []byte) (controlOutcome *ControlOutcomeMsg, err error) { + cptr := unsafe.Pointer(&buffer[0]) + controlOutcome = &ControlOutcomeMsg{} + //lTransId := gTransIdDefVal + //ml.MavLog(ml.INFO, lTransId, "Decode Control Outcome: ") + xapp.Logger.Info("Decode Control Outcome: ") + decodedMsg := C.e2sm_decode_ric_call_process_outcome(cptr, C.size_t(len(buffer))) + defer C.e2sm_free_ric_call_process_outcome(decodedMsg) + if decodedMsg == nil { + return controlOutcome, errors.New("e2sm wrapper is unable to get ControlOutcome due to wrong or invalid input") + } + //ml.MavLog(ml.INFO, lTransId, "Decoded Control Outcome: ") + controlOutcome.ControlOutcomeType = int32(decodedMsg.ric_controlOutcome_formats.present) + if controlOutcome.ControlOutcomeType == 1 { + controlOutcome := &ControlOutcomeFormat1{} + controlOutcomeFormat1_C := *(**C.E2SM_RC_ControlOutcome_Format1_t)(unsafe.Pointer(&decodedMsg.ric_controlOutcome_formats.choice[0])) + controlOutcome.ControlOutcomeFormat1ItemCount = int(controlOutcomeFormat1_C.ranP_List.list.count) + controlOutcome.ControlOutcomeFormat1Item = make([]ControlOutcomeFormat1ItemType, controlOutcome.ControlOutcomeFormat1ItemCount +1) + //ml.MavLog(ml.INFO, lTransId, "RIC Control Outcome Format1 Item Count = %d ", controlOutcome.ControlOutcomeFormat1ItemCount) + for i := 0; i < controlOutcome.ControlOutcomeFormat1ItemCount; i++ { + ControlOutcomeFormat1Item := &controlOutcome.ControlOutcomeFormat1Item[i] + var sizeof_E2SM_RC_ControlOutcome_Format1_Item_t *C.E2SM_RC_ControlOutcome_Format1_Item_t + ControlOutcomeFormat1Item_C := *(*(**C.E2SM_RC_ControlOutcome_Format1_Item_t)(unsafe.Pointer(uintptr(unsafe.Pointer(controlOutcomeFormat1_C.ranP_List.list.array)) + (uintptr)(i)*unsafe.Sizeof(sizeof_E2SM_RC_ControlOutcome_Format1_Item_t)))) + ControlOutcomeFormat1Item.RanParameterID = int64(ControlOutcomeFormat1Item_C.ranParameter_ID) + ControlOutcomeFormat1Item.RANParameterValueType = int(ControlOutcomeFormat1Item_C.ranParameter_value.present) + ranParameterValue_C := (C.RANParameter_Value_t)(ControlOutcomeFormat1Item_C.ranParameter_value) + if ControlOutcomeFormat1Item.RANParameterValueType == 5 { + //ml.MavLog(ml.INFO, lTransId, "RANParameterValueType is RANParameter_Value_PR_valueOctS") + ranParameterValue := &OctetString{} + ranParameter_C := (*C.OCTET_STRING_t)(unsafe.Pointer(&ranParameterValue_C.choice[0])) + ranParameterValue.Size = int(ranParameter_C.size) + ranParameterValue.Buf = C.GoBytes(unsafe.Pointer(ranParameter_C.buf), C.int(ranParameter_C.size)) + ControlOutcomeFormat1Item.RANParameterValue = ranParameterValue + //ml.MavLog(ml.INFO, lTransId, "RANParameterValue = ", ControlOutcomeFormat1Item.RANParameterValue) + } + } + } else { + return controlOutcome, errors.New("Unknown RIC Control Outcome type") + } + return controlOutcome , err +} + +func (c *E2sm) get_plmn_from_mcc_mnc(plmnIdBuf []byte)(bytePackedPlmnId []uint8) { + //lTransId := gTransIdDefVal + hexResp, _ := hex.DecodeString(string(plmnIdBuf)) + //ml.MavLog(ml.INFO, lTransId, "get_plmn_from_mcc_mnc plmnIdBuf and hexResp = ", plmnIdBuf,hexResp) + var mcc []uint8 = make([]uint8, 3) + var mnc []uint8 = make([]uint8, 3) + + mcc[0] = hexResp[0] >> 4 + mcc[1] = hexResp[0] & 0xf + mcc[2] = hexResp[1] >> 4 + mnc[0] = hexResp[1] & 0xf + mnc[1] = hexResp[2] >> 4 + mnc[2] = hexResp[2] & 0xf + + var tmpPlmnId []uint8 = make([]uint8, 6) + tmpPlmnId[0] = mcc[0] + tmpPlmnId[1] = mcc[1] + tmpPlmnId[2] = mcc[2] + if len(mcc) == 2 { + tmpPlmnId[3] = 0x0f + tmpPlmnId[4] = mnc[0] + tmpPlmnId[5] = mnc[1] + } else { + tmpPlmnId[3] = mnc[0] + tmpPlmnId[4] = mnc[1] + tmpPlmnId[5] = mnc[2] + } + //ml.MavLog(ml.INFO, lTransId, "\n tmpPlmnId " , tmpPlmnId) + bytePackedPlmnId = make([]uint8,3) + bytePackedPlmnId[0] = ((tmpPlmnId[1] & 0x0F) << 4) | (tmpPlmnId[0] & 0x0F) + bytePackedPlmnId[1] = ((tmpPlmnId[3] & 0x0F) << 4) | (tmpPlmnId[2] & 0x0F) + bytePackedPlmnId[2] = ((tmpPlmnId[5] & 0x0F) << 4) | (tmpPlmnId[4] & 0x0F) + //ml.MavLog(ml.INFO, lTransId, "\n bytePackedPlmnId " , bytePackedPlmnId) + return +} +