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