X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=control%2FrcControl.go;h=32209db2c9f292fd1f1b9b2ac060c0127d28171f;hb=90fe232d4ef733461b703bfaf5f8b56319f83339;hp=41cfc92e20fb867d5aae3b308312bd65efa5d663;hpb=b8bc34df1dbadac0fee12b3fd69a75729d467c27;p=ric-app%2Frc.git diff --git a/control/rcControl.go b/control/rcControl.go index 41cfc92..32209db 100644 --- a/control/rcControl.go +++ b/control/rcControl.go @@ -3,13 +3,14 @@ package control import ( "errors" "fmt" - "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" - "gerrit.o-ran-sc.org/r/ric-app/rc/protocol/grpc/ricmsgcommrpc/rc" "log" "os" "strconv" "sync" "time" + + "gerrit.o-ran-sc.org/r/ric-app/rc/protocol/grpc/ricmsgcommrpc/rc" + "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp" ) var ( @@ -33,6 +34,12 @@ func NewControl() Control { xapp.Logger.Debug("GRPC Server Port = %v ", xapp.Config.GetString("controls.ricHOControlgRpcServerPort")) xapp.Logger.Debug("Log Level = %d ", xapp.Config.GetInt("controls.logLevel")) + go StartgRPCRCControlCommServerRoutine() + xapp.Logger.Debug("StartgRPCRCControlCommServerRoutine done") + + //To Handle RIC Control Message + go StartHandleControlReqRoutine() + return Control{5, make(chan *xapp.RMRParams, 1000), //Make it configurable make(map[int]bool), @@ -42,17 +49,7 @@ func NewControl() Control { func ReadyCB(i interface{}) { gControlData = i.(*Control) - go controlLoop() - - //Start gRPC Server for Receiving messages - - go StartgRPCRCControlCommServerRoutine() - xapp.Logger.Info("StartgRPCRCControlCommServerRoutine done") - - //To Handle RIC Control Message - go StartHandleControlReqRoutine() - } func (aControlData *Control) Run() { @@ -68,7 +65,7 @@ func (aControlData *Control) Consume(rp *xapp.RMRParams) (err error) { func (aControlData *Control) rmrSend(params *xapp.RMRParams) (err error) { if !xapp.Rmr.Send(params, false) { err = errors.New("rmr.Send() failed") - xapp.Logger.Error("Failed to rmrSend to %v", err) + xapp.Logger.Info("Failed to rmrSend to %v", err) log.Printf("Failed to rmrSend to %v", err) } return @@ -113,21 +110,28 @@ func StartHandleControlReqRoutine() { func HandlegRPCRICControlMsgReq(aPtrRicControlGrpcReq *rc.RicControlGrpcReq) { + xapp.Logger.Debug("HandlegRPCRICControlMsgReq :%v", *aPtrRicControlGrpcReq) lRicHoControlMsg := RicHoControlMsg{} lRicHoControlMsg.RicControlGrpcReqPtr = aPtrRicControlGrpcReq lUEID := lRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID - xapp.Logger.Debug("HandlegRPCRICControlMsgReq UEID = %s ", lUEID) - //Mandatory parameters validation - if lRicHoControlMsg.RicControlGrpcReqPtr.E2NodeID == "" || - lRicHoControlMsg.RicControlGrpcReqPtr.RICControlMessageData.TargetCellID == "" || - lRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID == "" || - lRicHoControlMsg.RicControlGrpcReqPtr.PlmnID == "" || - lRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.ControlActionId < 0 || - lRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.ControlStyle < 0 || - lRicHoControlMsg.RicControlGrpcReqPtr.RICControlMessageData.RICControlCellTypeVal < 0 || - lRicHoControlMsg.RicControlGrpcReqPtr.RICE2APHeaderData.RICRequestorID < 0 || - lRicHoControlMsg.RicControlGrpcReqPtr.RICE2APHeaderData.RanFuncId < 0 { + xapp.Logger.Debug("HandlegRPCRICControlMsgReq UEID = %v ", lUEID) + //Mandatory parameters validation + if lRicHoControlMsg.RicControlGrpcReqPtr.E2NodeID == "" || + lRicHoControlMsg.RicControlGrpcReqPtr.RICControlMessageData.TargetCellID == "" || + lRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID.GnbUEID.AmfUENGAPID < 0 || + lRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID.GnbUEID.Guami.PLMNIdentity == "" || + lRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID.GnbUEID.Guami.AMFRegionID == "" || + lRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID.GnbUEID.Guami.AMFSetID == "" || + lRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID.GnbUEID.Guami.AMFPointer == "" || + len(lRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID.GnbUEID.GNBCUUEF1APID) == 0 || + len(lRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID.GnbUEID.GNBCUCPUEE1APID) == 0 || + lRicHoControlMsg.RicControlGrpcReqPtr.PlmnID == "" || + lRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.ControlActionId < 0 || + lRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.ControlStyle < 0 || + lRicHoControlMsg.RicControlGrpcReqPtr.RICControlMessageData.RICControlCellTypeVal < 0 || + lRicHoControlMsg.RicControlGrpcReqPtr.RICE2APHeaderData.RICRequestorID < 0 || + lRicHoControlMsg.RicControlGrpcReqPtr.RICE2APHeaderData.RanFuncId < 0 { xapp.Logger.Error("Mandaroty parameters missing, dont send control request ") return } @@ -154,8 +158,10 @@ func (aRicHoControlMsg *RicHoControlMsg) setEventRicControlCreateExpiredTimer(aS gControlData.eventRicControlReqExpiredMu.Lock() gControlData.eventRicControlReqExpiredMap[aSeqNum] = false gControlData.eventRicControlReqExpiredMu.Unlock() + controlAckTimer := xapp.Config.GetInt("controls.controlAckTimer") + xapp.Logger.Debug("configured controlAckTimer = %d and controlAckTimer = %d ", xapp.Config.GetInt("controls.controlAckTimer"),controlAckTimer) - timer := time.NewTimer(time.Duration(gControlData.eventRicControlReqTimePeriod) * time.Second) + timer := time.NewTimer(time.Duration(controlAckTimer) * time.Second) go func(t *time.Timer) { defer t.Stop() xapp.Logger.Debug("RIC_CONTROL_REQ[%s]: Waiting for RIC_CONTROL_RESP...", aSeqNum) @@ -204,15 +210,23 @@ func (aRicHoControlMsg *RicHoControlMsg) SendRicControlRequest(aRequestSN int) ( var lRicControlActionID int64 = aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.ControlActionId lUEID := aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID - lUeIdBuf := []byte(aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID) + var ueId_data UEid - xapp.Logger.Debug("UEID:%s, lUeIdBuf: %v", aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID, lUeIdBuf) + xapp.Logger.Debug("UEID:%v, ueId_data strct :%v", aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID, + ueId_data) + ueId_data.amf_UE_NGAP_Id = lUEID.GnbUEID.AmfUENGAPID + ueId_data.pLMNIdentitybuf = lUEID.GnbUEID.Guami.PLMNIdentity + ueId_data.aMFRegionIDbuf = lUEID.GnbUEID.Guami.AMFRegionID + ueId_data.aMFSetIDbuf = lUEID.GnbUEID.Guami.AMFSetID + ueId_data.aMFPointerbuf = lUEID.GnbUEID.Guami.AMFPointer + ueId_data.F1AP_id = lUEID.GnbUEID.GNBCUUEF1APID + ueId_data.E1AP_id = lUEID.GnbUEID.GNBCUCPUEE1APID - var lRicControlHeader []byte = make([]byte, 256) //Check the Size - lRicControlHeaderEncoded, err := e2sm.SetRicControlHeader(lRicControlHeader, lUeIdBuf, lRicControlStyleType, lRicControlActionID) + var lRicControlHeader []byte = make([]byte, 1024) //Check the Size + lRicControlHeaderEncoded, err := e2sm.SetRicControlHeader(lRicControlHeader, &ueId_data, lRicControlStyleType, lRicControlActionID) if err != nil { - xapp.Logger.Error("SetRicControlHeader Failed: %v, UEID:%s", err, aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID) - log.Printf("SetRicControlHeader Failed: %v, UEID:%s", err, aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID) + xapp.Logger.Error("SetRicControlHeader Failed: %v, UEID:%v", err, aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID) + log.Printf("SetRicControlHeader Failed: %v, UEID:%v", err, aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID) return err } else { xapp.Logger.Info("SetRicControlHeader is success: %x", lRicControlHeaderEncoded) @@ -222,7 +236,6 @@ func (aRicHoControlMsg *RicHoControlMsg) SendRicControlRequest(aRequestSN int) ( } fmt.Fprintf(os.Stderr, "\n") } - var lTargetPrimaryCell int64 = RIC_CONTROL_TARGET_PRIMARY_CELL var lTargetCell int64 = RIC_CONTROL_TARGET_CELL var lNrCGIOrECGI int64 = RIC_CONTROL_CGI_TYPE @@ -230,12 +243,15 @@ func (aRicHoControlMsg *RicHoControlMsg) SendRicControlRequest(aRequestSN int) ( lNrOrEUtraCellType := aRicHoControlMsg.RicControlGrpcReqPtr.RICControlMessageData.RICControlCellTypeVal lTargetCellVal := aRicHoControlMsg.RicControlGrpcReqPtr.RICControlMessageData.TargetCellID lTargetCellValBuf := []byte(lTargetCellVal) + //lNRPlmnId := []byte(aRicHoControlMsg.RicControlGrpcReqPtr.RICControlMessageData.TargetCellID.PlmnID) + //lNRCellId := aRicHoControlMsg.RicControlGrpcReqPtr.RICControlMessageData.TargetCellID.NRCellID - var lRicControlMessage []byte = make([]byte, 1024) + + var lRicControlMessage []byte = make([]byte, 1024) lRicControlMessageEncoded, err := e2sm.SetRicControlMessage(lRicControlMessage, lTargetPrimaryCell, lTargetCell, lNrCGIOrECGI, int64(lNrOrEUtraCellType), lTargetCellValBuf) if err != nil { - xapp.Logger.Error("SetRicControlMessage Failed: %v, UEID:%s", err, aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID) - log.Printf("SetRicControlMessage Failed: %v, UEID:%s", err, aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID) + xapp.Logger.Error("SetRicControlMessage Failed: %v, UEID:%v", err, aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID) + log.Printf("SetRicControlMessage Failed: %v, UEID:%v", err, aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID) return err } else { xapp.Logger.Debug("SetRicControlMessage is success: %x", lRicControlMessageEncoded) @@ -257,52 +273,114 @@ func (aRicHoControlMsg *RicHoControlMsg) SendRicControlRequest(aRequestSN int) ( lParams.Payload, err = e2ap.SetRicControlRequestPayload(lParams.Payload, lRequestorId, uint16(aRequestSN), lFuncId, lRicControlHeaderEncoded, lRicControlMessageEncoded) if err != nil { - xapp.Logger.Error("SetRicControlRequestPayload Failed: %v, UEID:%s", err, aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID) - log.Printf("SetRicControlRequestPayload Failed: %v, UEID:%s", err, aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID) + xapp.Logger.Error("SetRicControlRequestPayload Failed: %v, UEID:%v", err, aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID) + log.Printf("SetRicControlRequestPayload Failed: %v, UEID:%v", err, aRicHoControlMsg.RicControlGrpcReqPtr.RICControlHeaderData.UEID) return err } else { - xapp.Logger.Debug("Encoding RicControlRequestPayload is success. UEID: %s, Payload: %x", lUEID, lParams.Payload) + + xapp.Logger.Debug("Encoding RicControlRequestPayload is success. UEID: %v, Payload: %x", lUEID, lParams.Payload) fmt.Fprintf(os.Stderr, "Encoded RIC Control Req PDU:\n") for i := 0; i < len(lParams.Payload); i++ { fmt.Fprintf(os.Stderr, " %02x", lParams.Payload[i]) } fmt.Fprintf(os.Stderr, "\n") } - + lParams.PayloadLen = len(lParams.Payload) valEnbId := aRicHoControlMsg.RicControlGrpcReqPtr.E2NodeID valRanName := aRicHoControlMsg.RicControlGrpcReqPtr.RanName valPlmnId := aRicHoControlMsg.RicControlGrpcReqPtr.PlmnID lParams.Meid = &xapp.RMRMeid{PlmnID: valPlmnId, EnbID: valEnbId, RanName: valRanName} - xapp.Logger.Debug("The RIC Control RMR message to be sent is with MsgType:%d SubId=%d, lParams.Meid: %v, UEID: %s", lParams.Mtype, lParams.SubId, lParams.Meid, lUEID) - - xapp.Logger.Debug("Sending RIC Control message to RanName: %s, UEID: %s ", aRicHoControlMsg.RicControlGrpcReqPtr.RanName, lUEID) + xapp.Logger.Debug("The RIC Control RMR message to be sent is with MsgType:%d SubId=%d, lParams.Meid: %v, UEID: %v", lParams.Mtype, lParams.SubId, lParams.Meid, lUEID) + xapp.Logger.Debug("Sending RIC Control message to RanName: %s, UEID: %v ", aRicHoControlMsg.RicControlGrpcReqPtr.RanName, lUEID) + + xapp.Logger.Info("lParams %v ",lParams) err = gControlData.rmrSend(lParams) if err != nil { xapp.Logger.Error("Failed to send RIC_CONTROL_REQ: %v", err) log.Printf("Failed to send RIC_CONTROL_REQ: %v", err) + xapp.Logger.Info("Failed to send RIC_CONTROL_REQ: %v", err) return err } - xapp.Logger.Info("Sending RIC Control message to RanName: %s, UEID: %s Success", aRicHoControlMsg.RicControlGrpcReqPtr.RanName, lUEID) - + xapp.Logger.Info("Sending RIC Control message to RanName: %s, UEID: %v Success", aRicHoControlMsg.RicControlGrpcReqPtr.RanName, lUEID) + //Start Timer Operation. aRicHoControlMsg.setEventRicControlCreateExpiredTimer(aRequestSN) //TODO check if this is required as we are not expecting Control ACK return nil } func HandleControlResponse(params *xapp.RMRParams) (err error) { + + var e2ap *E2ap + var e2sm *E2sm xapp.Logger.Debug("The SubId in RIC_CONTROL_RESP is %d", params.SubId) log.Printf("The SubId in RIC_CONTROL_RESP is %d", params.SubId) + + + //Decode the RIC Control Ack message + controlAck, err := e2ap.GetControlAckMsg(params.Payload) + if err != nil { + xapp.Logger.Error("Failed to decode RIC Control Ack: %v", err) + log.Println("Failed to decode RIC Control Ack: %v", err) + return + } + log.Println("E2ap RIC RIC Control Ack message decoded \n") + xapp.Logger.Info("E2ap RIC RIC Control Ack message decoded \n") + gControlData.eventRicControlReqExpiredMu.Lock() + _,ok := gControlData.eventRicControlReqExpiredMap[int(controlAck.InstanceId)] + if !ok { + gControlData.eventRicControlReqExpiredMu.Unlock() + xapp.Logger.Debug("RIC_CONTROL_REQ has been deleted!") + log.Printf("RIC_CONTROL_REQ has been deleted!") + return nil + } else { + gControlData.eventRicControlReqExpiredMap[int(controlAck.InstanceId)] = true + gControlData.eventRicControlReqExpiredMu.Unlock() + } + + controlOutcome, err := e2sm.GetControlOutcome(controlAck.ControlOutcome) + if err != nil { + xapp.Logger.Error("Failed to decode RIC Control Outcome: %v", err) + log.Println("Failed to decode RIC Control Outcome: %v", err) + return + } + log.Println("E2SM-RC RIC Control Outcome decoded \n",controlOutcome) + xapp.Logger.Info("E2SM-RC RIC Control Outcome decoded \n",controlOutcome) + + + return nil } func HandleControlFailure(params *xapp.RMRParams) (err error) { + var e2ap *E2ap + xapp.Logger.Debug("The SubId in RIC_CONTROL_FAILURE is %d", params.SubId) log.Printf("The SubId in RIC_CONTROL_FAILURE is %d", params.SubId) + controlAck, err := e2ap.GetControlFailureMsg(params.Payload) + if err != nil { + xapp.Logger.Debug("Failed to decode RIC Control message: %v", err) + log.Println("Failed to decode RIC Control Ack: %v", err) + return + } + log.Println("E2ap RIC Control Ack message decoded \n") + xapp.Logger.Debug("E2ap RIC Control Ack message decoded \n") + + gControlData.eventRicControlReqExpiredMu.Lock() + _, ok := gControlData.eventRicControlReqExpiredMap[int(controlAck.InstanceId)] + if !ok { + gControlData.eventRicControlReqExpiredMu.Unlock() + xapp.Logger.Debug("RIC_CONTROL_REQ has been deleted!") + log.Printf("RIC_CONTROL_REQ has been deleted!") + return nil + } else { + gControlData.eventRicControlReqExpiredMap[int(controlAck.InstanceId)] = true + gControlData.eventRicControlReqExpiredMu.Unlock() + } return nil }