2 ==================================================================================
3 Copyright (c) 2019 AT&T Intellectual Property.
4 Copyright (c) 2019 Nokia
6 Licensed under the Apache License, Version 2.0 (the "License");
7 you may not use this file except in compliance with the License.
8 You may obtain a copy of the License at
10 http://www.apache.org/licenses/LICENSE-2.0
12 Unless required by applicable law or agreed to in writing, software
13 distributed under the License is distributed on an "AS IS" BASIS,
14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 See the License for the specific language governing permissions and
16 limitations under the License.
17 ==================================================================================
24 rtmgrclient "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/rtmgr_client"
25 rtmgrhandle "gerrit.o-ran-sc.org/r/ric-plt/submgr/pkg/rtmgr_client/handle"
26 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
27 httptransport "github.com/go-openapi/runtime/client"
28 "github.com/go-openapi/strfmt"
29 "github.com/spf13/viper"
35 var subReqTime time.Duration = 5 * time.Second
36 var subDelReqTime time.Duration = 5 * time.Second
37 var maxSubReqTryCount uint64 = 2 // Initial try + retry
38 var maxSubDelReqTryCount uint64 = 2 // Initial try + retry
43 rtmgrClient *RtmgrClient
46 rmrSendMutex sync.Mutex
66 xapp.Logger.Info("SUBMGR")
68 viper.SetEnvPrefix("submgr")
69 viper.AllowEmptyEnv(true)
70 seedSN = uint16(viper.GetInt("seed_sn"))
72 rand.Seed(time.Now().UnixNano())
73 seedSN = uint16(rand.Intn(65535))
78 xapp.Logger.Info("SUBMGR: Initial Sequence Number: %v", seedSN)
81 func NewControl() *Control {
83 registry := new(Registry)
84 registry.Initialize(seedSN)
86 tracker := new(Tracker)
89 timerMap := new(TimerMap)
92 transport := httptransport.New(viper.GetString("rtmgr.HostAddr")+":"+viper.GetString("rtmgr.port"), viper.GetString("rtmgr.baseUrl"), []string{"http"})
93 client := rtmgrclient.New(transport, strfmt.Default)
94 handle := rtmgrhandle.NewProvideXappSubscriptionHandleParamsWithTimeout(10 * time.Second)
95 deleteHandle := rtmgrhandle.NewDeleteXappSubscriptionHandleParamsWithTimeout(10 * time.Second)
96 rtmgrClient := RtmgrClient{client, handle, deleteHandle}
98 rtmgrClientPtr := &rtmgrClient
100 //TODO: to make this better. Now it is just a hack.
101 registry.rtmgrClient = rtmgrClientPtr
103 return &Control{e2ap: new(E2ap),
105 rtmgrClient: rtmgrClientPtr,
112 func (c *Control) Run() {
116 func (c *Control) rmrSend(params *xapp.RMRParams) (err error) {
119 for ; i <= 10 && status == false; i++ {
120 c.rmrSendMutex.Lock()
121 status = xapp.Rmr.Send(params, false)
122 c.rmrSendMutex.Unlock()
124 xapp.Logger.Info("rmr.Send() failed. Retry count %v, Mtype: %v, SubId: %v, Xid %s", i, params.Mtype, params.SubId, params.Xid)
125 time.Sleep(500 * time.Millisecond)
129 err = errors.New("rmr.Send() failed")
130 xapp.Rmr.Free(params.Mbuf)
135 func (c *Control) rmrReplyToSender(params *xapp.RMRParams) (err error) {
140 func (c *Control) Consume(msg *xapp.RMRParams) (err error) {
143 case xapp.RICMessageTypes["RIC_SUB_REQ"]:
144 go c.handleSubscriptionRequest(msg)
145 case xapp.RICMessageTypes["RIC_SUB_RESP"]:
146 go c.handleSubscriptionResponse(msg)
147 case xapp.RICMessageTypes["RIC_SUB_FAILURE"]:
148 go c.handleSubscriptionFailure(msg)
149 case xapp.RICMessageTypes["RIC_SUB_DEL_REQ"]:
150 go c.handleSubscriptionDeleteRequest(msg)
151 case xapp.RICMessageTypes["RIC_SUB_DEL_RESP"]:
152 go c.handleSubscriptionDeleteResponse(msg)
153 case xapp.RICMessageTypes["RIC_SUB_DEL_FAILURE"]:
154 go c.handleSubscriptionDeleteFailure(msg)
156 xapp.Logger.Info("Unknown Message Type '%d', discarding", msg.Mtype)
161 func (c *Control) handleSubscriptionRequest(params *xapp.RMRParams) {
162 xapp.Logger.Info("SubReq received from Src: %s, Mtype: %v, SubId: %v, Xid: %s, Meid: %v", params.Src, params.Mtype, params.SubId, params.Xid, params.Meid)
163 xapp.Rmr.Free(params.Mbuf)
166 srcAddr, srcPort, err := c.rtmgrClient.SplitSource(params.Src)
168 xapp.Logger.Error("SubReq: Failed to update routing-manager. Dropping this msg. Err: %s, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
172 subs, err := c.registry.ReserveSubscription(RmrEndpoint{*srcAddr, *srcPort}, params.Meid)
174 xapp.Logger.Error("SubReq: %s, Dropping this msg.", err.Error())
178 params.SubId = int(subs.Seq)
179 err = c.e2ap.SetSubscriptionRequestSequenceNumber(params.Payload, subs.Seq)
181 xapp.Logger.Error("SubReq: Unable to get Sequence Number from Payload. Dropping this msg. Err: %v, SubId: %v, Xid: %s, Payload %X", err, params.SubId, params.Xid, params.Payload)
182 c.registry.DelSubscription(subs.Seq)
186 // Create transatcion record for every subscription request
187 var forwardRespToXapp bool = true
188 var responseReceived bool = false
189 _, err = c.tracker.TrackTransaction(subs, RmrEndpoint{*srcAddr, *srcPort}, params, responseReceived, forwardRespToXapp)
191 xapp.Logger.Error("SubReq: %s, Dropping this msg.", err.Error())
192 c.registry.DelSubscription(subs.Seq)
196 // Setting new subscription ID in the RMR header
197 xapp.Logger.Info("SubReq: Forwarding SubReq to E2T: Mtype: %v, SubId: %v, Xid %s, Meid %v", params.Mtype, params.SubId, params.Xid, params.Meid)
198 err = c.rmrSend(params)
200 xapp.Logger.Error("SubReq: Failed to send request to E2T %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
202 c.timerMap.StartTimer("RIC_SUB_REQ", int(subs.Seq), subReqTime, FirstTry, c.handleSubscriptionRequestTimer)
203 xapp.Logger.Debug("SubReq: Debugging transaction table = %v", c.tracker.transactionXappTable)
207 func (c *Control) handleSubscriptionResponse(params *xapp.RMRParams) {
208 xapp.Logger.Info("SubResp received from Src: %s, Mtype: %v, SubId: %v, Meid: %v", params.Src, params.Mtype, params.SubId, params.Meid)
209 xapp.Rmr.Free(params.Mbuf)
212 payloadSeqNum, err := c.e2ap.GetSubscriptionResponseSequenceNumber(params.Payload)
214 xapp.Logger.Error("SubResp: Unable to get Sequence Number from Payload. Dropping this msg. Err: %v, SubId: %v, Xid: %s, Payload %X", err, params.SubId, params.Xid, params.Payload)
217 xapp.Logger.Info("SubResp: Received payloadSeqNum: %v", payloadSeqNum)
219 subs := c.registry.GetSubscription(payloadSeqNum)
221 xapp.Logger.Error("SubResp: Unknown payloadSeqNum. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)
225 transaction := subs.GetTransaction()
227 c.timerMap.StopTimer("RIC_SUB_REQ", int(payloadSeqNum))
229 responseReceived := transaction.CheckResponseReceived()
230 if responseReceived == true {
231 // Subscription timer already received
234 xapp.Logger.Info("SubResp: SubId: %v, from address: %s.", payloadSeqNum, transaction.RmrEndpoint)
237 transaction.Release()
239 params.SubId = int(payloadSeqNum)
240 params.Xid = transaction.OrigParams.Xid
242 xapp.Logger.Info("SubResp: Forwarding Subscription Response to xApp Mtype: %v, SubId: %v, Meid: %v", params.Mtype, params.SubId, params.Meid)
243 err = c.rmrReplyToSender(params)
245 xapp.Logger.Error("SubResp: Failed to send response to xApp. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
248 xapp.Logger.Info("SubResp: SubId: %v, from address: %s. Deleting transaction record", payloadSeqNum, transaction.RmrEndpoint)
252 func (c *Control) handleSubscriptionFailure(params *xapp.RMRParams) {
253 xapp.Logger.Info("SubFail received from Src: %s, Mtype: %v, SubId: %v, Meid: %v", params.Src, params.Mtype, params.SubId, params.Meid)
254 xapp.Rmr.Free(params.Mbuf)
257 payloadSeqNum, err := c.e2ap.GetSubscriptionFailureSequenceNumber(params.Payload)
259 xapp.Logger.Error("SubFail: Unable to get Sequence Number from Payload. Dropping this msg. Err: %v, SubId: %v, Xid: %s, Payload %X", err, params.SubId, params.Xid, params.Payload)
262 xapp.Logger.Info("SubFail: Received payloadSeqNum: %v", payloadSeqNum)
264 subs := c.registry.GetSubscription(payloadSeqNum)
266 xapp.Logger.Error("SubFail: Unknown payloadSeqNum. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)
270 transaction := subs.GetTransaction()
271 if transaction == nil {
272 xapp.Logger.Error("SubFail: Unknown transaction. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)
276 c.timerMap.StopTimer("RIC_SUB_REQ", int(payloadSeqNum))
278 responseReceived := transaction.CheckResponseReceived()
280 xapp.Logger.Info("SubFail: Dropping this msg. Err: %v SubId: %v", err, payloadSeqNum)
284 if responseReceived == true {
285 // Subscription timer already received
288 xapp.Logger.Info("SubFail: SubId: %v, from address: %s. Forwarding response to xApp", payloadSeqNum, transaction.RmrEndpoint)
290 time.Sleep(3 * time.Second)
292 xapp.Logger.Info("SubFail: Deleting transaction record. SubId: %v, Xid: %s", params.SubId, params.Xid)
293 transaction.Release()
294 if !c.registry.DelSubscription(payloadSeqNum) {
295 xapp.Logger.Error("SubFail: Failed to release sequency number. SubId: %v, Xid: %s", params.SubId, params.Xid)
300 func (c *Control) handleSubscriptionRequestTimer(strId string, nbrId int, tryCount uint64) {
301 subId := uint16(nbrId)
302 xapp.Logger.Info("handleSubTimer: SubReq timer expired. subId: %v, tryCount: %v", subId, tryCount)
304 subs := c.registry.GetSubscription(subId)
306 xapp.Logger.Error("SubFail: Unknown payloadSeqNum. Dropping this msg. SubId: %v", subId)
310 transaction := subs.GetTransaction()
311 if transaction == nil {
312 xapp.Logger.Error("SubFail: Unknown transaction. Dropping this msg. SubId: %v", subId)
316 responseReceived := transaction.CheckResponseReceived()
318 if responseReceived == true {
319 // Subscription Response or Failure already received
323 if tryCount < maxSubReqTryCount {
324 xapp.Logger.Info("handleSubTimer: Resending SubReq to E2T: Mtype: %v, SubId: %v, Xid %s, Meid %v", transaction.OrigParams.Mtype, transaction.OrigParams.SubId, transaction.OrigParams.Xid, transaction.OrigParams.Meid)
326 transaction.RetryTransaction()
328 err := c.rmrSend(transaction.OrigParams)
330 xapp.Logger.Error("handleSubTimer: Failed to send request to E2T %v, SubId: %v, Xid: %s", err, transaction.OrigParams.SubId, transaction.OrigParams.Xid)
334 c.timerMap.StartTimer("RIC_SUB_REQ", int(subId), subReqTime, tryCount, c.handleSubscriptionRequestTimer)
338 var subDelReqPayload []byte
339 subDelReqPayload, err := c.e2ap.PackSubscriptionDeleteRequest(transaction.OrigParams.Payload, subId)
341 xapp.Logger.Error("handleSubTimer: Packing SubDelReq failed. Err: %v", err)
345 // Cancel failed subscription
346 var params xapp.RMRParams
347 params.Mtype = 12020 // RIC SUBSCRIPTION DELETE
348 params.SubId = int(subId)
349 params.Xid = transaction.OrigParams.Xid
350 params.Meid = transaction.OrigParams.Meid
351 params.Src = transaction.OrigParams.Src
352 params.PayloadLen = len(subDelReqPayload)
353 params.Payload = subDelReqPayload
356 // Delete CREATE transaction
357 transaction.Release()
359 // Create DELETE transaction
360 _, err = c.trackDeleteTransaction(subs, ¶ms, subId, false)
362 xapp.Logger.Error("handleSubTimer: %s, Dropping this msg.", err.Error())
366 xapp.Logger.Info("handleSubTimer: Sending SubDelReq to E2T: Mtype: %v, SubId: %v, Meid: %v", params.Mtype, params.SubId, params.Meid)
369 xapp.Logger.Error("handleSubTimer: Failed to send request to E2T %v. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
371 c.timerMap.StartTimer("RIC_SUB_DEL_REQ", int(subId), subDelReqTime, FirstTry, c.handleSubscriptionDeleteRequestTimer)
375 func (act Action) String() string {
376 actions := [...]string{
383 if act < CREATE || act > DELETE {
389 func (act Action) valid() bool {
391 case CREATE, MERGE, DELETE:
398 func (c *Control) handleSubscriptionDeleteRequest(params *xapp.RMRParams) {
399 xapp.Logger.Info("SubDelReq received from Src: %s, Mtype: %v, SubId: %v, Xid: %s, Meid: %v", params.Src, params.Mtype, params.SubId, params.Xid, params.Meid)
400 xapp.Rmr.Free(params.Mbuf)
403 payloadSeqNum, err := c.e2ap.GetSubscriptionDeleteRequestSequenceNumber(params.Payload)
405 xapp.Logger.Error("SubDelReq: Unable to get Sequence Number from Payload. Dropping this msg. Err: %v, SubId: %v, Xid: %s, Payload %X", err, params.SubId, params.Xid, params.Payload)
408 xapp.Logger.Info("SubDelReq: Received payloadSeqNum: %v", payloadSeqNum)
410 subs := c.registry.GetSubscription(payloadSeqNum)
412 var forwardRespToXapp bool = true
413 _, err = c.trackDeleteTransaction(subs, params, payloadSeqNum, forwardRespToXapp)
415 xapp.Logger.Error("SubDelReq: %s, Dropping this msg.", err.Error())
420 xapp.Logger.Error("SubDelReq: Not valid sequence number. Dropping this msg. SubId: %v, Xid: %s", params.SubId, params.Xid)
424 xapp.Logger.Info("SubDelReq: Forwarding Request to E2T. Mtype: %v, SubId: %v, Xid: %s, Meid: %v", params.Mtype, params.SubId, params.Xid, params.Meid)
427 xapp.Logger.Error("SubDelReq: Failed to send request to E2T. Err %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
429 c.timerMap.StartTimer("RIC_SUB_DEL_REQ", int(payloadSeqNum), subDelReqTime, FirstTry, c.handleSubscriptionDeleteRequestTimer)
433 func (c *Control) trackDeleteTransaction(subs *Subscription, params *xapp.RMRParams, payloadSeqNum uint16, forwardRespToXapp bool) (transaction *Transaction, err error) {
434 srcAddr, srcPort, err := c.rtmgrClient.SplitSource(params.Src)
436 xapp.Logger.Error("Failed to split source address. Err: %s, SubId: %v, Xid: %s", err, payloadSeqNum, params.Xid)
438 var respReceived bool = false
439 transaction, err = c.tracker.TrackTransaction(subs, RmrEndpoint{*srcAddr, *srcPort}, params, respReceived, forwardRespToXapp)
443 func (c *Control) handleSubscriptionDeleteResponse(params *xapp.RMRParams) (err error) {
444 xapp.Logger.Info("SubDelResp received from Src: %s, Mtype: %v, SubId: %v, Meid: %v", params.Src, params.Mtype, params.SubId, params.Meid)
445 xapp.Rmr.Free(params.Mbuf)
448 payloadSeqNum, err := c.e2ap.GetSubscriptionDeleteResponseSequenceNumber(params.Payload)
450 xapp.Logger.Error("SubDelResp: Unable to get Sequence Number from Payload. Dropping this msg. Err: %v, SubId: %v, Xid: %s, Payload %X", err, params.SubId, params.Xid, params.Payload)
453 xapp.Logger.Info("SubDelResp: Received payloadSeqNum: %v", payloadSeqNum)
455 subs := c.registry.GetSubscription(payloadSeqNum)
457 xapp.Logger.Error("SubDelResp: Unknown payloadSeqNum. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)
461 transaction := subs.GetTransaction()
462 if transaction == nil {
463 xapp.Logger.Error("SubDelResp: Unknown transaction. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)
467 c.timerMap.StopTimer("RIC_SUB_DEL_REQ", int(payloadSeqNum))
469 responseReceived := transaction.CheckResponseReceived()
470 if responseReceived == true {
471 // Subscription Delete timer already received
475 transaction.Release()
477 xapp.Logger.Info("SubDelResp: SubId: %v, from address: %s. Forwarding response to xApp", payloadSeqNum, transaction.RmrEndpoint)
478 if transaction.ForwardRespToXapp == true {
479 params.SubId = int(payloadSeqNum)
480 params.Xid = transaction.OrigParams.Xid
481 xapp.Logger.Info("Forwarding SubDelResp to xApp: Mtype: %v, SubId: %v, Xid: %v, Meid: %v", params.Mtype, params.SubId, params.Xid, params.Meid)
482 err = c.rmrReplyToSender(params)
484 xapp.Logger.Error("SubDelResp: Failed to send response to xApp. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
487 time.Sleep(3 * time.Second)
490 xapp.Logger.Info("SubDelResp: Deleting transaction record. SubId: %v, Xid: %s", params.SubId, params.Xid)
491 if !c.registry.DelSubscription(payloadSeqNum) {
492 xapp.Logger.Error("SubDelResp: Failed to release sequency number. SubId: %v, Xid: %s", params.SubId, params.Xid)
498 func (c *Control) handleSubscriptionDeleteFailure(params *xapp.RMRParams) {
499 xapp.Logger.Info("SubDelFail received from Src: %s, Mtype: %v, SubId: %v, Meid: %v", params.Src, params.Mtype, params.SubId, params.Meid)
500 xapp.Rmr.Free(params.Mbuf)
503 payloadSeqNum, err := c.e2ap.GetSubscriptionDeleteFailureSequenceNumber(params.Payload)
505 xapp.Logger.Error("SubDelFail: Unable to get Sequence Number from Payload. Dropping this msg. Err: %v, SubId: %v, Xid: %s, Payload %X", err, params.SubId, params.Xid, params.Payload)
508 xapp.Logger.Info("SubDelFail: Received payloadSeqNum: %v", payloadSeqNum)
510 subs := c.registry.GetSubscription(payloadSeqNum)
512 xapp.Logger.Error("SubDelFail: Unknown payloadSeqNum. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)
516 transaction := subs.GetTransaction()
517 if transaction == nil {
518 xapp.Logger.Error("SubDelFail: Unknown transaction. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)
522 c.timerMap.StopTimer("RIC_SUB_DEL_REQ", int(payloadSeqNum))
524 responseReceived := transaction.CheckResponseReceived()
525 if responseReceived == true {
526 // Subscription Delete timer already received
529 xapp.Logger.Info("SubDelFail: SubId: %v, from address: %s. Forwarding response to xApp", payloadSeqNum, transaction.RmrEndpoint)
531 if transaction.ForwardRespToXapp == true {
532 var subDelRespPayload []byte
533 subDelRespPayload, err = c.e2ap.PackSubscriptionDeleteResponse(transaction.OrigParams.Payload, payloadSeqNum)
535 xapp.Logger.Error("SubDelFail:Packing SubDelResp failed. Err: %v", err)
539 params.Mtype = 12021 // RIC SUBSCRIPTION DELETE RESPONSE
540 params.SubId = int(payloadSeqNum)
541 params.Xid = transaction.OrigParams.Xid
542 params.Meid = transaction.OrigParams.Meid
543 params.Src = transaction.OrigParams.Src
544 params.PayloadLen = len(subDelRespPayload)
545 params.Payload = subDelRespPayload
547 xapp.Logger.Info("SubDelFail: Forwarding SubDelFail to xApp: Mtype: %v, SubId: %v, Xid: %v, Meid: %v", params.Mtype, params.SubId, params.Xid, params.Meid)
548 err = c.rmrReplyToSender(params)
550 xapp.Logger.Error("SubDelFail: Failed to send SubDelFail to xApp. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
553 time.Sleep(3 * time.Second)
556 xapp.Logger.Info("SubDelFail: Deleting transaction record. SubId: %v, Xid: %s", params.SubId, params.Xid)
557 transaction.Release()
558 if !c.registry.DelSubscription(payloadSeqNum) {
559 xapp.Logger.Error("SubDelFail: Failed to release sequency number. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
565 func (c *Control) handleSubscriptionDeleteRequestTimer(strId string, nbrId int, tryCount uint64) {
566 subId := uint16(nbrId)
567 xapp.Logger.Info("handleSubDelTimer: SubDelReq timer expired. subId: %v, tryCount: %v", subId, tryCount)
569 subs := c.registry.GetSubscription(subId)
571 xapp.Logger.Error("handleSubDelTimer: Unknown payloadSeqNum. Dropping this msg. SubId: %v", subId)
575 transaction := subs.GetTransaction()
576 if transaction == nil {
577 xapp.Logger.Error("handleSubDelTimer: Unknown transaction. Dropping this msg. SubId: %v", subId)
581 responseReceived := transaction.CheckResponseReceived()
582 if responseReceived == true {
583 // Subscription Delete Response or Failure already received
587 if tryCount < maxSubDelReqTryCount {
588 xapp.Logger.Info("handleSubDelTimer: Resending SubDelReq to E2T: Mtype: %v, SubId: %v, Xid %s, Meid %v", transaction.OrigParams.Mtype, transaction.OrigParams.SubId, transaction.OrigParams.Xid, transaction.OrigParams.Meid)
589 // Set possible to handle new response for the subId
591 transaction.RetryTransaction()
593 err := c.rmrSend(transaction.OrigParams)
595 xapp.Logger.Error("handleSubDelTimer: Failed to send request to E2T %v, SubId: %v, Xid: %s", err, transaction.OrigParams.SubId, transaction.OrigParams.Xid)
599 c.timerMap.StartTimer("RIC_SUB_DEL_REQ", int(subId), subReqTime, tryCount, c.handleSubscriptionDeleteRequestTimer)
603 var params xapp.RMRParams
604 if transaction.ForwardRespToXapp == true {
605 var subDelRespPayload []byte
606 subDelRespPayload, err := c.e2ap.PackSubscriptionDeleteResponse(transaction.OrigParams.Payload, subId)
608 xapp.Logger.Error("handleSubDelTimer: Unable to pack payload. Dropping this timer action. Err: %v, SubId: %v, Xid: %s, Payload %x", err, subId, transaction.OrigParams.Xid, transaction.OrigParams.Payload)
612 params.Mtype = 12021 // RIC SUBSCRIPTION DELETE RESPONSE
613 params.SubId = int(subId)
614 params.Meid = transaction.OrigParams.Meid
615 params.Xid = transaction.OrigParams.Xid
616 params.Src = transaction.OrigParams.Src
617 params.PayloadLen = len(subDelRespPayload)
618 params.Payload = subDelRespPayload
621 xapp.Logger.Info("handleSubDelTimer: Sending SubDelResp to xApp: Mtype: %v, SubId: %v, Xid: %s, Meid: %v", params.Mtype, params.SubId, params.Xid, params.Meid)
622 err = c.rmrReplyToSender(¶ms)
624 xapp.Logger.Error("handleSubDelTimer: Failed to send response to xApp: Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
627 time.Sleep(3 * time.Second)
630 xapp.Logger.Info("handleSubDelTimer: Deleting transaction record. SubId: %v, Xid: %s", subId, params.Xid)
631 transaction.Release()
632 if !c.registry.DelSubscription(subId) {
633 xapp.Logger.Error("handleSubDelTimer: Failed to release sequency number. SubId: %v, Xid: %s", subId, params.Xid)