+//-------------------------------------------------------------------
+// SUBS CREATE Handling
+//-------------------------------------------------------------------
+func (c *Control) handleSubscriptionCreate(subs *Subscription, parentTrans *Transaction) {
+
+ trans := c.tracker.NewTransaction(subs.GetMeid())
+ subs.WaitTransactionTurn(trans)
+ defer subs.ReleaseTransactionTurn(trans)
+ defer trans.Release()
+
+ xapp.Logger.Debug("SUBS-SubReq: Handling %s parent %s", idstring(trans, subs, nil), parentTrans.String())
+
+ if subs.SubRespMsg != nil {
+ xapp.Logger.Debug("SUBS-SubReq: Handling (immediate response) %s parent %s", idstring(nil, subs, nil), parentTrans.String())
+ parentTrans.SendEvent(subs.SubRespMsg, 0)
+ return
+ }
+
+ event := c.sendE2TSubscriptionRequest(subs, trans, parentTrans)
+ switch themsg := event.(type) {
+ case *e2ap.E2APSubscriptionResponse:
+ subs.SubRespMsg = themsg
+ parentTrans.SendEvent(event, 0)
+ return
+ case *e2ap.E2APSubscriptionFailure:
+ //TODO: Possible delete and one retry for subs req
+ parentTrans.SendEvent(event, 0)
+ default:
+ xapp.Logger.Info("SUBS-SubReq: internal delete due event(%s) %s", typeofSubsMessage(event), idstring(trans, subs, nil))
+ c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans)
+ parentTrans.SendEvent(nil, 0)
+ }
+
+ go c.registry.RemoveFromSubscription(subs, parentTrans, 5*time.Second)
+}
+
+//-------------------------------------------------------------------
+// SUBS DELETE Handling
+//-------------------------------------------------------------------
+func (c *Control) handleSubscriptionDelete(subs *Subscription, parentTrans *Transaction) {
+
+ trans := c.tracker.NewTransaction(subs.GetMeid())
+ subs.WaitTransactionTurn(trans)
+ defer subs.ReleaseTransactionTurn(trans)
+ defer trans.Release()
+
+ xapp.Logger.Debug("SUBS-SubDelReq: Handling %s parent %s", idstring(trans, subs, nil), parentTrans.String())
+
+ event := c.sendE2TSubscriptionDeleteRequest(subs, trans, parentTrans)
+
+ parentTrans.SendEvent(event, 0)
+ go c.registry.RemoveFromSubscription(subs, parentTrans, 5*time.Second)
+}
+
+//-------------------------------------------------------------------
+// send to E2T Subscription Request
+//-------------------------------------------------------------------
+func (c *Control) sendE2TSubscriptionRequest(subs *Subscription, trans *Transaction, parentTrans *Transaction) interface{} {
+ var err error
+ var event interface{} = nil
+ var timedOut bool = false
+
+ subReqMsg := subs.SubReqMsg
+ subReqMsg.RequestId.Id = 123
+ subReqMsg.RequestId.Seq = uint32(subs.GetSubId())
+ trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionRequest(subReqMsg)
+ if err != nil {
+ xapp.Logger.Error("SUBS-SubReq: %s parent %s", idstring(trans, subs, err), parentTrans.String())
+ return event
+ }
+
+ for retries := uint64(0); retries < e2tMaxSubReqTryCount; retries++ {
+ desc := fmt.Sprintf("SUBS-SubReq: SubReq to E2T (retry %d)", retries)
+ c.rmrSend(desc, subs, trans)
+ event, timedOut = trans.WaitEvent(e2tSubReqTimeout)
+ if timedOut {
+ continue
+ }
+ break
+ }
+ xapp.Logger.Debug("SUBS-SubReq: Response handling event(%s) %s parent %s", typeofSubsMessage(event), idstring(trans, subs, nil), parentTrans.String())
+ return event
+}
+
+//-------------------------------------------------------------------
+// send to E2T Subscription Delete Request
+//-------------------------------------------------------------------
+
+func (c *Control) sendE2TSubscriptionDeleteRequest(subs *Subscription, trans *Transaction, parentTrans *Transaction) interface{} {
+ var err error
+ var event interface{}
+ var timedOut bool
+
+ subDelReqMsg := &e2ap.E2APSubscriptionDeleteRequest{}
+ subDelReqMsg.RequestId.Id = 123
+ subDelReqMsg.RequestId.Seq = uint32(subs.GetSubId())
+ subDelReqMsg.FunctionId = subs.SubReqMsg.FunctionId
+ trans.Mtype, trans.Payload, err = c.e2ap.PackSubscriptionDeleteRequest(subDelReqMsg)