+ return nil
+}
+
+func (h E2SetupRequestNotificationHandler) handleExistingRan(ranName string, nodebInfo *entities.NodebInfo, setupRequest *models.E2SetupRequestMessage) error {
+ if nodebInfo.GetConnectionStatus() == entities.ConnectionStatus_SHUTTING_DOWN {
+ h.logger.Errorf("#E2SetupRequestNotificationHandler.Handle - RAN name: %s, connection status: %s - nodeB entity in incorrect state", ranName, nodebInfo.ConnectionStatus)
+ return errors.New("nodeB entity in incorrect state")
+ }
+
+ err := h.setGnbFunctions(nodebInfo, setupRequest)
+ return err
+}
+
+func (h E2SetupRequestNotificationHandler) handleUnsuccessfulResponse(nodebInfo *entities.NodebInfo, req *models.NotificationRequest) {
+ failureResponse := models.NewE2SetupFailureResponseMessage(models.TimeToWaitEnum.V60s)
+ h.logger.Debugf("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - E2_SETUP_RESPONSE has been built successfully %+v", failureResponse)
+
+ responsePayload, err := xml.Marshal(&failureResponse.E2APPDU)
+ if err != nil {
+ h.logger.Warnf("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - RAN name: %s - Error marshalling RIC_E2_SETUP_RESP. Payload: %s", nodebInfo.RanName, responsePayload)
+ }
+
+ responsePayload = replaceEmptyTagsWithSelfClosing(responsePayload)
+
+ h.logger.Infof("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - payload: %s", responsePayload)
+
+ msg := models.NewRmrMessage(rmrCgo.RIC_E2_SETUP_FAILURE, nodebInfo.RanName, responsePayload, req.TransactionId, req.GetMsgSrc())
+ h.logger.Infof("#E2SetupRequestNotificationHandler.handleUnsuccessfulResponse - RAN name: %s - RIC_E2_SETUP_RESP message has been built successfully. Message: %x", nodebInfo.RanName, msg)
+ _ = h.rmrSender.WhSend(msg)
+
+}
+
+func (h E2SetupRequestNotificationHandler) handleSuccessfulResponse(ranName string, req *models.NotificationRequest, setupRequest *models.E2SetupRequestMessage) {
+
+ plmnId := buildPlmnId(h.config.GlobalRicId.Mcc, h.config.GlobalRicId.Mnc)
+
+ ricNearRtId, err := convertTo20BitString(h.config.GlobalRicId.RicId)
+ if err != nil {
+ return
+ }
+ successResponse := models.NewE2SetupSuccessResponseMessage(plmnId, ricNearRtId, setupRequest)
+ h.logger.Debugf("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - E2_SETUP_RESPONSE has been built successfully %+v", successResponse)
+
+ responsePayload, err := xml.Marshal(&successResponse.E2APPDU)
+ if err != nil {
+ h.logger.Warnf("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - Error marshalling RIC_E2_SETUP_RESP. Payload: %s", ranName, responsePayload)
+ }
+
+ responsePayload = replaceEmptyTagsWithSelfClosing(responsePayload)
+
+ h.logger.Infof("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - payload: %s", responsePayload)
+
+ msg := models.NewRmrMessage(rmrCgo.RIC_E2_SETUP_RESP, ranName, responsePayload, req.TransactionId, req.GetMsgSrc())
+ h.logger.Infof("#E2SetupRequestNotificationHandler.handleSuccessfulResponse - RAN name: %s - RIC_E2_SETUP_RESP message has been built successfully. Message: %x", ranName, msg)
+ _ = h.rmrSender.Send(msg)
+}
+
+func buildPlmnId(mmc string, mnc string) string{
+ var b strings.Builder
+
+ b.WriteByte(mmc[1])
+ b.WriteByte(mmc[0])
+ if len(mnc) == 2 {
+ b.WriteString("F")
+ } else {
+ b.WriteByte(mnc[2])
+ }
+ b.WriteByte(mmc[2])
+ b.WriteByte(mnc[1])
+ b.WriteByte(mnc[0])
+
+ return b.String()
+}
+
+func replaceEmptyTagsWithSelfClosing(responsePayload []byte) []byte {
+ responseString := strings.NewReplacer(
+ "<reject></reject>", "<reject/>",
+ "<ignore></ignore>", "<ignore/>",
+ "<transport-resource-unavailable></transport-resource-unavailable>", "<transport-resource-unavailable/>",
+ "<v60s></v60s>", "<v60s/>",
+ "<v20s></v20s>", "<v20s/>",
+ "<v10s></v10s>", "<v10s/>",
+ "<v5s></v5s>", "<v5s/>",
+ "<v2s></v2s>", "<v2s/>",
+ "<v1s></v1s>", "<v1s/>",
+ ).Replace(string(responsePayload))
+ return []byte(responseString)
+}
+
+func convertTo20BitString(ricNearRtId string) (string, error) {
+ r, err := strconv.ParseUint(ricNearRtId, 16, 32)
+ if err != nil {
+ return "", err