+//-------------------------------------------------------------------
+// SUBS DELETE Handling
+//-------------------------------------------------------------------
+
+func (c *Control) handleSubscriptionDelete(subs *Subscription, parentTrans *TransactionXapp) {
+
+ trans := c.tracker.NewSubsTransaction(subs)
+ subs.WaitTransactionTurn(trans)
+ defer subs.ReleaseTransactionTurn(trans)
+ defer trans.Release()
+
+ xapp.Logger.Debug("SUBS-SubDelReq: Handling %s", idstring(nil, trans, subs, parentTrans))
+
+ subs.mutex.Lock()
+
+ if subs.valid && subs.EpList.HasEndpoint(parentTrans.GetEndpoint()) && subs.EpList.Size() == 1 {
+ subs.valid = false
+ subs.mutex.Unlock()
+ c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans)
+ } else {
+ subs.mutex.Unlock()
+ }
+ //Now RemoveFromSubscription in here to avoid race conditions (mostly concerns delete)
+ // If parallel deletes ongoing both might pass earlier sendE2TSubscriptionDeleteRequest(...) if
+ // RemoveFromSubscription locates in caller side (now in handleXAPPSubscriptionDeleteRequest(...))
+ c.registry.RemoveFromSubscription(subs, parentTrans, 5*time.Second, c)
+ c.registry.UpdateSubscriptionToDb(subs, c)
+ parentTrans.SendEvent(nil, 0)
+}
+
+//-------------------------------------------------------------------
+// send to E2T Subscription Request
+//-------------------------------------------------------------------
+func (c *Control) sendE2TSubscriptionRequest(subs *Subscription, trans *TransactionSubs, parentTrans *TransactionXapp) interface{} {
+ var err error
+ var event interface{} = nil
+ var timedOut bool = false
+
+ subReqMsg := subs.SubReqMsg
+ subReqMsg.RequestId = subs.GetReqId().RequestId
+ trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionRequest(subReqMsg)
+ if err != nil {
+ xapp.Logger.Error("SUBS-SubReq: %s", idstring(err, trans, subs, parentTrans))
+ return event
+ }
+
+ // Write uncompleted subscrition in db. If no response for subscrition it need to be re-processed (deleted) after restart
+ c.WriteSubscriptionToDb(subs)
+ for retries := uint64(0); retries < e2tMaxSubReqTryCount; retries++ {
+ desc := fmt.Sprintf("(retry %d)", retries)
+ if retries == 0 {
+ c.UpdateCounter(cSubReqToE2)
+ } else {
+ c.UpdateCounter(cSubReReqToE2)
+ }
+ c.rmrSendToE2T(desc, subs, trans)
+ if subs.DoNotWaitSubResp == false {
+ event, timedOut = trans.WaitEvent(e2tSubReqTimeout)
+ if timedOut {
+ c.UpdateCounter(cSubReqTimerExpiry)
+ continue
+ }
+ } else {
+ // Simulating case where subscrition request has been sent but response has not been received before restart
+ event = &SubmgrRestartTestEvent{}
+ }
+ break
+ }
+ xapp.Logger.Debug("SUBS-SubReq: Response handling event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans))
+ return event
+}
+
+//-------------------------------------------------------------------
+// send to E2T Subscription Delete Request
+//-------------------------------------------------------------------
+
+func (c *Control) sendE2TSubscriptionDeleteRequest(subs *Subscription, trans *TransactionSubs, parentTrans *TransactionXapp) interface{} {
+ var err error
+ var event interface{}
+ var timedOut bool
+
+ subDelReqMsg := &e2ap.E2APSubscriptionDeleteRequest{}
+ subDelReqMsg.RequestId = subs.GetReqId().RequestId
+ subDelReqMsg.FunctionId = subs.SubReqMsg.FunctionId
+ trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionDeleteRequest(subDelReqMsg)
+ if err != nil {
+ xapp.Logger.Error("SUBS-SubDelReq: %s", idstring(err, trans, subs, parentTrans))
+ return event
+ }
+
+ for retries := uint64(0); retries < e2tMaxSubDelReqTryCount; retries++ {
+ desc := fmt.Sprintf("(retry %d)", retries)
+ if retries == 0 {
+ c.UpdateCounter(cSubDelReqToE2)
+ } else {
+ c.UpdateCounter(cSubDelReReqToE2)
+ }
+ c.rmrSendToE2T(desc, subs, trans)
+ event, timedOut = trans.WaitEvent(e2tSubDelReqTime)
+ if timedOut {
+ c.UpdateCounter(cSubDelReqTimerExpiry)
+ continue
+ }
+ break
+ }
+ xapp.Logger.Debug("SUBS-SubDelReq: Response handling event(%s) %s", typeofSubsMessage(event), idstring(nil, trans, subs, parentTrans))
+ return event
+}
+
+//-------------------------------------------------------------------
+// handle from E2T Subscription Response
+//-------------------------------------------------------------------
+func (c *Control) handleE2TSubscriptionResponse(params *xapp.RMRParams) {
+ xapp.Logger.Info("MSG from E2T: %s", params.String())
+ c.UpdateCounter(cSubRespFromE2)
+ subRespMsg, err := c.e2ap.UnpackSubscriptionResponse(params.Payload)
+ if err != nil {
+ xapp.Logger.Error("MSG-SubResp %s", idstring(err, params))
+ return
+ }
+ subs, err := c.registry.GetSubscriptionFirstMatch([]uint32{subRespMsg.RequestId.InstanceId})