-pnackage control\r
+package control\r
\r
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/ric-app/rc/protocol/grpc/ricmsgcommrpc/rc"\r
"log"\r
"os"\r
"strconv"\r
"sync"\r
"time"\r
+ //"encoding/hex"\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
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
\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
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
\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
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
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
}\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
\r
lNrOrEUtraCellType := aRicHoControlMsg.RicControlGrpcReqPtr.RICControlMessageData.RICControlCellTypeVal\r
lTargetCellVal := aRicHoControlMsg.RicControlGrpcReqPtr.RICControlMessageData.TargetCellID\r
+ //lTargetCellValBuf, _:= hex.DecodeString(lTargetCellVal)\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
- lRicControlMessageEncoded, err := e2sm.SetRicControlMessage(lRicControlMessage, lTargetPrimaryCell, lTargetCell, lNrCGIOrECGI, int64(lNrOrEUtraCellType), lTargetCellValBuf)\r
+\r
+ var lRicControlMessage []byte = make([]byte, 1024)\r
+ lRicControlMessageEncoded, err := e2sm.SetRicControlMessage(lRicControlMessage, lTargetPrimaryCell, lTargetCell, lNrCGIOrECGI, int64(lNrOrEUtraCellType), ueId_data.pLMNIdentitybuf, 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
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