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 {
82 registry := new(Registry)
83 registry.Initialize(seedSN)
85 tracker := new(Tracker)
88 timerMap := new(TimerMap)
91 transport := httptransport.New(viper.GetString("rtmgr.HostAddr")+":"+viper.GetString("rtmgr.port"), viper.GetString("rtmgr.baseUrl"), []string{"http"})
92 client := rtmgrclient.New(transport, strfmt.Default)
93 handle := rtmgrhandle.NewProvideXappSubscriptionHandleParamsWithTimeout(10 * time.Second)
94 deleteHandle := rtmgrhandle.NewDeleteXappSubscriptionHandleParamsWithTimeout(10 * time.Second)
95 rtmgrClient := RtmgrClient{client, handle, deleteHandle}
97 return &Control{e2ap: new(E2ap),
99 rtmgrClient: &rtmgrClient,
106 func (c *Control) Run() {
110 func (c *Control) rmrSend(params *xapp.RMRParams) (err error) {
113 for ; i <= 10 && status == false; i++ {
114 c.rmrSendMutex.Lock()
115 status = xapp.Rmr.Send(params, false)
116 c.rmrSendMutex.Unlock()
118 xapp.Logger.Info("rmr.Send() failed. Retry count %v, Mtype: %v, SubId: %v, Xid %s", i, params.Mtype, params.SubId, params.Xid)
119 time.Sleep(500 * time.Millisecond)
123 err = errors.New("rmr.Send() failed")
124 xapp.Rmr.Free(params.Mbuf)
129 func (c *Control) rmrReplyToSender(params *xapp.RMRParams) (err error) {
134 func (c *Control) Consume(msg *xapp.RMRParams) (err error) {
137 case xapp.RICMessageTypes["RIC_SUB_REQ"]:
138 go c.handleSubscriptionRequest(msg)
139 case xapp.RICMessageTypes["RIC_SUB_RESP"]:
140 go c.handleSubscriptionResponse(msg)
141 case xapp.RICMessageTypes["RIC_SUB_FAILURE"]:
142 go c.handleSubscriptionFailure(msg)
143 case xapp.RICMessageTypes["RIC_SUB_DEL_REQ"]:
144 go c.handleSubscriptionDeleteRequest(msg)
145 case xapp.RICMessageTypes["RIC_SUB_DEL_RESP"]:
146 go c.handleSubscriptionDeleteResponse(msg)
147 case xapp.RICMessageTypes["RIC_SUB_DEL_FAILURE"]:
148 go c.handleSubscriptionDeleteFailure(msg)
150 xapp.Logger.Info("Unknown Message Type '%d', discarding", msg.Mtype)
155 func (c *Control) handleSubscriptionRequest(params *xapp.RMRParams) {
156 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)
157 xapp.Rmr.Free(params.Mbuf)
160 srcAddr, srcPort, err := c.rtmgrClient.SplitSource(params.Src)
162 xapp.Logger.Error("SubReq: Failed to update routing-manager. Dropping this msg. Err: %s, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
166 /* Reserve a sequence number and set it in the payload */
167 subs := c.registry.ReserveSubscription(RmrEndpoint{*srcAddr, *srcPort}, params.Meid)
169 xapp.Logger.Error("SubReq: Failed to reserve sequence number. Dropping this msg. SubId: %v, Xid: %s", params.SubId, params.Xid)
173 params.SubId = int(subs.Seq)
174 err = c.e2ap.SetSubscriptionRequestSequenceNumber(params.Payload, subs.Seq)
176 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)
177 c.registry.releaseSequenceNumber(subs.Seq)
181 // Create transatcion record for every subscription request
182 var forwardRespToXapp bool = true
183 var responseReceived bool = false
184 _, err = c.tracker.TrackTransaction(subs, RmrEndpoint{*srcAddr, *srcPort}, params, responseReceived, forwardRespToXapp)
186 xapp.Logger.Error("SubReq: %s, Dropping this msg.", err.Error())
187 c.registry.releaseSequenceNumber(subs.Seq)
191 // Update routing manager about the new subscription
192 subRouteAction := subs.SubRouteInfo(CREATE)
193 xapp.Logger.Info("SubReq: Starting routing manager update. SubId: %v, Xid: %s", params.SubId, params.Xid)
195 err = c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
197 xapp.Logger.Error("SubReq: Failed to update routing manager. Dropping this msg. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
198 c.registry.releaseSequenceNumber(subs.Seq)
202 // Setting new subscription ID in the RMR header
203 xapp.Logger.Info("SubReq: Forwarding SubReq to E2T: Mtype: %v, SubId: %v, Xid %s, Meid %v", params.Mtype, params.SubId, params.Xid, params.Meid)
204 err = c.rmrSend(params)
206 xapp.Logger.Error("SubReq: Failed to send request to E2T %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
208 c.timerMap.StartTimer("RIC_SUB_REQ", int(subs.Seq), subReqTime, FirstTry, c.handleSubscriptionRequestTimer)
209 xapp.Logger.Debug("SubReq: Debugging transaction table = %v", c.tracker.transactionXappTable)
213 func (c *Control) handleSubscriptionResponse(params *xapp.RMRParams) {
214 xapp.Logger.Info("SubResp received from Src: %s, Mtype: %v, SubId: %v, Meid: %v", params.Src, params.Mtype, params.SubId, params.Meid)
215 xapp.Rmr.Free(params.Mbuf)
218 payloadSeqNum, err := c.e2ap.GetSubscriptionResponseSequenceNumber(params.Payload)
220 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)
223 xapp.Logger.Info("SubResp: Received payloadSeqNum: %v", payloadSeqNum)
225 subs := c.registry.GetSubscription(payloadSeqNum)
227 xapp.Logger.Error("SubResp: Unknown payloadSeqNum. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)
231 transaction := subs.GetTransaction()
233 c.timerMap.StopTimer("RIC_SUB_REQ", int(payloadSeqNum))
235 responseReceived := transaction.CheckResponseReceived()
236 if responseReceived == true {
237 // Subscription timer already received
240 xapp.Logger.Info("SubResp: SubId: %v, from address: %s.", payloadSeqNum, transaction.RmrEndpoint)
243 transaction.Release()
245 params.SubId = int(payloadSeqNum)
246 params.Xid = transaction.OrigParams.Xid
248 xapp.Logger.Info("SubResp: Forwarding Subscription Response to xApp Mtype: %v, SubId: %v, Meid: %v", params.Mtype, params.SubId, params.Meid)
249 err = c.rmrReplyToSender(params)
251 xapp.Logger.Error("SubResp: Failed to send response to xApp. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
254 xapp.Logger.Info("SubResp: SubId: %v, from address: %s. Deleting transaction record", payloadSeqNum, transaction.RmrEndpoint)
258 func (c *Control) handleSubscriptionFailure(params *xapp.RMRParams) {
259 xapp.Logger.Info("SubFail received from Src: %s, Mtype: %v, SubId: %v, Meid: %v", params.Src, params.Mtype, params.SubId, params.Meid)
260 xapp.Rmr.Free(params.Mbuf)
263 payloadSeqNum, err := c.e2ap.GetSubscriptionFailureSequenceNumber(params.Payload)
265 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)
268 xapp.Logger.Info("SubFail: Received payloadSeqNum: %v", payloadSeqNum)
270 subs := c.registry.GetSubscription(payloadSeqNum)
272 xapp.Logger.Error("SubFail: Unknown payloadSeqNum. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)
276 transaction := subs.GetTransaction()
277 if transaction == nil {
278 xapp.Logger.Error("SubFail: Unknown transaction. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)
282 c.timerMap.StopTimer("RIC_SUB_REQ", int(payloadSeqNum))
284 responseReceived := transaction.CheckResponseReceived()
286 xapp.Logger.Info("SubFail: Dropping this msg. Err: %v SubId: %v", err, payloadSeqNum)
290 if responseReceived == true {
291 // Subscription timer already received
294 xapp.Logger.Info("SubFail: SubId: %v, from address: %s. Forwarding response to xApp", payloadSeqNum, transaction.RmrEndpoint)
296 time.Sleep(3 * time.Second)
298 xapp.Logger.Info("SubFail: Starting routing manager update. SubId: %v, Xid: %s", params.SubId, params.Xid)
299 subRouteAction := subs.SubRouteInfo(DELETE)
300 err = c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
302 xapp.Logger.Error("SubFail: Failed to update routing manager. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
305 xapp.Logger.Info("SubFail: Deleting transaction record. SubId: %v, Xid: %s", params.SubId, params.Xid)
306 transaction.Release()
307 if !c.registry.releaseSequenceNumber(payloadSeqNum) {
308 xapp.Logger.Error("SubFail: Failed to release sequency number. SubId: %v, Xid: %s", params.SubId, params.Xid)
313 func (c *Control) handleSubscriptionRequestTimer(strId string, nbrId int, tryCount uint64) {
314 subId := uint16(nbrId)
315 xapp.Logger.Info("handleSubTimer: SubReq timer expired. subId: %v, tryCount: %v", subId, tryCount)
317 subs := c.registry.GetSubscription(subId)
319 xapp.Logger.Error("SubFail: Unknown payloadSeqNum. Dropping this msg. SubId: %v", subId)
323 transaction := subs.GetTransaction()
324 if transaction == nil {
325 xapp.Logger.Error("SubFail: Unknown transaction. Dropping this msg. SubId: %v", subId)
329 responseReceived := transaction.CheckResponseReceived()
331 if responseReceived == true {
332 // Subscription Response or Failure already received
336 if tryCount < maxSubReqTryCount {
337 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)
339 transaction.RetryTransaction()
341 err := c.rmrSend(transaction.OrigParams)
343 xapp.Logger.Error("handleSubTimer: Failed to send request to E2T %v, SubId: %v, Xid: %s", err, transaction.OrigParams.SubId, transaction.OrigParams.Xid)
347 c.timerMap.StartTimer("RIC_SUB_REQ", int(subId), subReqTime, tryCount, c.handleSubscriptionRequestTimer)
351 var subDelReqPayload []byte
352 subDelReqPayload, err := c.e2ap.PackSubscriptionDeleteRequest(transaction.OrigParams.Payload, subId)
354 xapp.Logger.Error("handleSubTimer: Packing SubDelReq failed. Err: %v", err)
358 // Cancel failed subscription
359 var params xapp.RMRParams
360 params.Mtype = 12020 // RIC SUBSCRIPTION DELETE
361 params.SubId = int(subId)
362 params.Xid = transaction.OrigParams.Xid
363 params.Meid = transaction.OrigParams.Meid
364 params.Src = transaction.OrigParams.Src
365 params.PayloadLen = len(subDelReqPayload)
366 params.Payload = subDelReqPayload
369 // Delete CREATE transaction
370 transaction.Release()
372 // Create DELETE transaction
373 _, err = c.trackDeleteTransaction(subs, ¶ms, subId, false)
375 xapp.Logger.Error("handleSubTimer: %s, Dropping this msg.", err.Error())
379 xapp.Logger.Info("handleSubTimer: Sending SubDelReq to E2T: Mtype: %v, SubId: %v, Meid: %v", params.Mtype, params.SubId, params.Meid)
382 xapp.Logger.Error("handleSubTimer: Failed to send request to E2T %v. SubId: %v, Xid: %s", err, params.SubId, params.Xid)
384 c.timerMap.StartTimer("RIC_SUB_DEL_REQ", int(subId), subDelReqTime, FirstTry, c.handleSubscriptionDeleteRequestTimer)
388 func (act Action) String() string {
389 actions := [...]string{
396 if act < CREATE || act > DELETE {
402 func (act Action) valid() bool {
404 case CREATE, MERGE, DELETE:
411 func (c *Control) handleSubscriptionDeleteRequest(params *xapp.RMRParams) {
412 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)
413 xapp.Rmr.Free(params.Mbuf)
416 payloadSeqNum, err := c.e2ap.GetSubscriptionDeleteRequestSequenceNumber(params.Payload)
418 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)
421 xapp.Logger.Info("SubDelReq: Received payloadSeqNum: %v", payloadSeqNum)
423 subs := c.registry.GetSubscription(payloadSeqNum)
425 var forwardRespToXapp bool = true
426 _, err = c.trackDeleteTransaction(subs, params, payloadSeqNum, forwardRespToXapp)
428 xapp.Logger.Error("SubDelReq: %s, Dropping this msg.", err.Error())
433 xapp.Logger.Error("SubDelReq: Not valid sequence number. Dropping this msg. SubId: %v, Xid: %s", params.SubId, params.Xid)
437 xapp.Logger.Info("SubDelReq: Forwarding Request to E2T. Mtype: %v, SubId: %v, Xid: %s, Meid: %v", params.Mtype, params.SubId, params.Xid, params.Meid)
440 xapp.Logger.Error("SubDelReq: Failed to send request to E2T. Err %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
442 c.timerMap.StartTimer("RIC_SUB_DEL_REQ", int(payloadSeqNum), subDelReqTime, FirstTry, c.handleSubscriptionDeleteRequestTimer)
446 func (c *Control) trackDeleteTransaction(subs *Subscription, params *xapp.RMRParams, payloadSeqNum uint16, forwardRespToXapp bool) (transaction *Transaction, err error) {
447 srcAddr, srcPort, err := c.rtmgrClient.SplitSource(params.Src)
449 xapp.Logger.Error("Failed to split source address. Err: %s, SubId: %v, Xid: %s", err, payloadSeqNum, params.Xid)
451 var respReceived bool = false
452 transaction, err = c.tracker.TrackTransaction(subs, RmrEndpoint{*srcAddr, *srcPort}, params, respReceived, forwardRespToXapp)
456 func (c *Control) handleSubscriptionDeleteResponse(params *xapp.RMRParams) (err error) {
457 xapp.Logger.Info("SubDelResp received from Src: %s, Mtype: %v, SubId: %v, Meid: %v", params.Src, params.Mtype, params.SubId, params.Meid)
458 xapp.Rmr.Free(params.Mbuf)
461 payloadSeqNum, err := c.e2ap.GetSubscriptionDeleteResponseSequenceNumber(params.Payload)
463 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)
466 xapp.Logger.Info("SubDelResp: Received payloadSeqNum: %v", payloadSeqNum)
468 subs := c.registry.GetSubscription(payloadSeqNum)
470 xapp.Logger.Error("SubDelResp: Unknown payloadSeqNum. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)
474 transaction := subs.GetTransaction()
475 if transaction == nil {
476 xapp.Logger.Error("SubDelResp: Unknown transaction. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)
480 c.timerMap.StopTimer("RIC_SUB_DEL_REQ", int(payloadSeqNum))
482 responseReceived := transaction.CheckResponseReceived()
483 if responseReceived == true {
484 // Subscription Delete timer already received
488 transaction.Release()
490 xapp.Logger.Info("SubDelResp: SubId: %v, from address: %s. Forwarding response to xApp", payloadSeqNum, transaction.RmrEndpoint)
491 if transaction.ForwardRespToXapp == true {
492 params.SubId = int(payloadSeqNum)
493 params.Xid = transaction.OrigParams.Xid
494 xapp.Logger.Info("Forwarding SubDelResp to xApp: Mtype: %v, SubId: %v, Xid: %v, Meid: %v", params.Mtype, params.SubId, params.Xid, params.Meid)
495 err = c.rmrReplyToSender(params)
497 xapp.Logger.Error("SubDelResp: Failed to send response to xApp. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
500 time.Sleep(3 * time.Second)
503 xapp.Logger.Info("SubDelResp: Starting routing manager update. SubId: %v, Xid: %s", params.SubId, params.Xid)
504 subRouteAction := subs.SubRouteInfo(DELETE)
505 err = c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
507 xapp.Logger.Error("SubDelResp: Failed to update routing manager. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
511 xapp.Logger.Info("SubDelResp: Deleting transaction record. SubId: %v, Xid: %s", params.SubId, params.Xid)
512 if !c.registry.releaseSequenceNumber(payloadSeqNum) {
513 xapp.Logger.Error("SubDelResp: Failed to release sequency number. SubId: %v, Xid: %s", params.SubId, params.Xid)
519 func (c *Control) handleSubscriptionDeleteFailure(params *xapp.RMRParams) {
520 xapp.Logger.Info("SubDelFail received from Src: %s, Mtype: %v, SubId: %v, Meid: %v", params.Src, params.Mtype, params.SubId, params.Meid)
521 xapp.Rmr.Free(params.Mbuf)
524 payloadSeqNum, err := c.e2ap.GetSubscriptionDeleteFailureSequenceNumber(params.Payload)
526 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)
529 xapp.Logger.Info("SubDelFail: Received payloadSeqNum: %v", payloadSeqNum)
531 subs := c.registry.GetSubscription(payloadSeqNum)
533 xapp.Logger.Error("SubDelFail: Unknown payloadSeqNum. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)
537 transaction := subs.GetTransaction()
538 if transaction == nil {
539 xapp.Logger.Error("SubDelFail: Unknown transaction. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId)
543 c.timerMap.StopTimer("RIC_SUB_DEL_REQ", int(payloadSeqNum))
545 responseReceived := transaction.CheckResponseReceived()
546 if responseReceived == true {
547 // Subscription Delete timer already received
550 xapp.Logger.Info("SubDelFail: SubId: %v, from address: %s. Forwarding response to xApp", payloadSeqNum, transaction.RmrEndpoint)
552 if transaction.ForwardRespToXapp == true {
553 var subDelRespPayload []byte
554 subDelRespPayload, err = c.e2ap.PackSubscriptionDeleteResponse(transaction.OrigParams.Payload, payloadSeqNum)
556 xapp.Logger.Error("SubDelFail:Packing SubDelResp failed. Err: %v", err)
560 params.Mtype = 12021 // RIC SUBSCRIPTION DELETE RESPONSE
561 params.SubId = int(payloadSeqNum)
562 params.Xid = transaction.OrigParams.Xid
563 params.Meid = transaction.OrigParams.Meid
564 params.Src = transaction.OrigParams.Src
565 params.PayloadLen = len(subDelRespPayload)
566 params.Payload = subDelRespPayload
568 xapp.Logger.Info("SubDelFail: Forwarding SubDelFail to xApp: Mtype: %v, SubId: %v, Xid: %v, Meid: %v", params.Mtype, params.SubId, params.Xid, params.Meid)
569 err = c.rmrReplyToSender(params)
571 xapp.Logger.Error("SubDelFail: Failed to send SubDelFail to xApp. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
574 time.Sleep(3 * time.Second)
577 xapp.Logger.Info("SubDelFail: Starting routing manager update. SubId: %v, Xid: %s", params.SubId, params.Xid)
578 subRouteAction := subs.SubRouteInfo(DELETE)
579 err = c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
581 xapp.Logger.Error("SubDelFail: Failed to update routing manager. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
585 xapp.Logger.Info("SubDelFail: Deleting transaction record. SubId: %v, Xid: %s", params.SubId, params.Xid)
586 transaction.Release()
587 if !c.registry.releaseSequenceNumber(payloadSeqNum) {
588 xapp.Logger.Error("SubDelFail: Failed to release sequency number. Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
594 func (c *Control) handleSubscriptionDeleteRequestTimer(strId string, nbrId int, tryCount uint64) {
595 subId := uint16(nbrId)
596 xapp.Logger.Info("handleSubDelTimer: SubDelReq timer expired. subId: %v, tryCount: %v", subId, tryCount)
598 subs := c.registry.GetSubscription(subId)
600 xapp.Logger.Error("handleSubDelTimer: Unknown payloadSeqNum. Dropping this msg. SubId: %v", subId)
604 transaction := subs.GetTransaction()
605 if transaction == nil {
606 xapp.Logger.Error("handleSubDelTimer: Unknown transaction. Dropping this msg. SubId: %v", subId)
610 responseReceived := transaction.CheckResponseReceived()
611 if responseReceived == true {
612 // Subscription Delete Response or Failure already received
616 if tryCount < maxSubDelReqTryCount {
617 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)
618 // Set possible to handle new response for the subId
620 transaction.RetryTransaction()
622 err := c.rmrSend(transaction.OrigParams)
624 xapp.Logger.Error("handleSubDelTimer: Failed to send request to E2T %v, SubId: %v, Xid: %s", err, transaction.OrigParams.SubId, transaction.OrigParams.Xid)
628 c.timerMap.StartTimer("RIC_SUB_DEL_REQ", int(subId), subReqTime, tryCount, c.handleSubscriptionDeleteRequestTimer)
632 var params xapp.RMRParams
633 if transaction.ForwardRespToXapp == true {
634 var subDelRespPayload []byte
635 subDelRespPayload, err := c.e2ap.PackSubscriptionDeleteResponse(transaction.OrigParams.Payload, subId)
637 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)
641 params.Mtype = 12021 // RIC SUBSCRIPTION DELETE RESPONSE
642 params.SubId = int(subId)
643 params.Meid = transaction.OrigParams.Meid
644 params.Xid = transaction.OrigParams.Xid
645 params.Src = transaction.OrigParams.Src
646 params.PayloadLen = len(subDelRespPayload)
647 params.Payload = subDelRespPayload
650 xapp.Logger.Info("handleSubDelTimer: Sending SubDelResp to xApp: Mtype: %v, SubId: %v, Xid: %s, Meid: %v", params.Mtype, params.SubId, params.Xid, params.Meid)
651 err = c.rmrReplyToSender(¶ms)
653 xapp.Logger.Error("handleSubDelTimer: Failed to send response to xApp: Err: %v, SubId: %v, Xid: %s", err, params.SubId, params.Xid)
656 time.Sleep(3 * time.Second)
659 xapp.Logger.Info("handleSubDelTimer: Starting routing manager update. SubId: %v, Xid: %s", subId, params.Xid)
660 subRouteAction := subs.SubRouteInfo(DELETE)
661 err := c.rtmgrClient.SubscriptionRequestUpdate(subRouteAction)
663 xapp.Logger.Error("handleSubDelTimer: Failed to update routing manager. Err: %v, SubId: %v, Xid: %s", err, subId, params.Xid)
667 xapp.Logger.Info("handleSubDelTimer: Deleting transaction record. SubId: %v, Xid: %s", subId, params.Xid)
668 transaction.Release()
669 if !c.registry.releaseSequenceNumber(subId) {
670 xapp.Logger.Error("handleSubDelTimer: Failed to release sequency number. SubId: %v, Xid: %s", subId, params.Xid)