From 375c141ce21767f7bda94ec435fdf833b41fbbd2 Mon Sep 17 00:00:00 2001 From: Juha Hyttinen Date: Tue, 14 Jan 2020 20:17:50 +0200 Subject: [PATCH] RICPLT-2984 SubDelFail go asn into use Change-Id: I5f04323373cbc2c7008c230ea4ee1ac67edd1b57 Signed-off-by: Juha Hyttinen --- pkg/control/control.go | 121 ++++++++++++++++++++++----------------------- pkg/control/e2ap.go | 76 ++++++++++++---------------- pkg/control/transaction.go | 1 + 3 files changed, 91 insertions(+), 107 deletions(-) diff --git a/pkg/control/control.go b/pkg/control/control.go index 55f05e7..614ac9b 100755 --- a/pkg/control/control.go +++ b/pkg/control/control.go @@ -255,7 +255,7 @@ func (c *Control) handleSubscriptionRequest(params *RMRParams) { trans.Payload = packedData.Buf trans.PayloadLen = len(packedData.Buf) - c.rmrSend("SubReq to E2T", subs, trans, packedData.Buf, len(packedData.Buf)) + c.rmrSend("SubReq: SubReq to E2T", subs, trans, trans.Payload, trans.PayloadLen) c.timerMap.StartTimer("RIC_SUB_REQ", int(subs.GetSubId()), subReqTime, FirstTry, c.handleSubscriptionRequestTimer) xapp.Logger.Debug("SubReq: Debugging trans table = %v", c.tracker.transactionXappTable) @@ -323,7 +323,7 @@ func (c *Control) handleSubscriptionResponse(params *RMRParams) { subs.Confirmed() trans.Release() - c.rmrReplyToSender("SubResp to xapp", subs, trans, 12011, trans.Payload, trans.PayloadLen) + c.rmrReplyToSender("SubResp: SubResp to xapp", subs, trans, 12011, trans.Payload, trans.PayloadLen) return } @@ -379,15 +379,15 @@ func (c *Control) handleSubscriptionFailure(params *RMRParams) { } packedData, err := c.e2ap.PackSubscriptionFailure(trans.SubFailMsg) - if err != nil { - //TODO error handling improvement - xapp.Logger.Error("SubFail: %s for trans %s (continuing cleaning)", err.Error(), trans) - } else { + if err == nil { //Optimize and store packed message to be sent. trans.Payload = packedData.Buf trans.PayloadLen = len(packedData.Buf) - c.rmrReplyToSender("SubFail to xapp", subs, trans, 12012, trans.Payload, trans.PayloadLen) + c.rmrReplyToSender("SubFail: SubFail to xapp", subs, trans, 12012, trans.Payload, trans.PayloadLen) time.Sleep(3 * time.Second) + } else { + //TODO error handling improvement + xapp.Logger.Error("SubFail: %s for trans %s (continuing cleaning)", err.Error(), trans) } trans.Release() @@ -422,14 +422,14 @@ func (c *Control) handleSubscriptionRequestTimer(strId string, nbrId int, tryCou trans.RetryTransaction() - c.rmrSend("SubReq(SubReq timer retransmit) to E2T", subs, trans, trans.Payload, trans.PayloadLen) + c.rmrSend("SubReq timeout: SubReq to E2T", subs, trans, trans.Payload, trans.PayloadLen) tryCount++ c.timerMap.StartTimer("RIC_SUB_REQ", int(subs.GetSubId()), subReqTime, tryCount, c.handleSubscriptionRequestTimer) return } - // Delete CREATE transaction + // Release CREATE transaction trans.Release() // Create DELETE transaction (internal and no messages toward xapp) @@ -470,8 +470,7 @@ func (c *Control) handleSubscriptionRequestTimer(strId string, nbrId int, tryCou return } - c.rmrSend("SubDelReq(SubReq timer) to E2T", subs, deltrans, deltrans.Payload, deltrans.PayloadLen) - + c.rmrSend("SubReq timer: SubDelReq to E2T", subs, deltrans, deltrans.Payload, deltrans.PayloadLen) c.timerMap.StartTimer("RIC_SUB_DEL_REQ", int(subs.GetSubId()), subDelReqTime, FirstTry, c.handleSubscriptionDeleteRequestTimer) return } @@ -547,7 +546,7 @@ func (c *Control) handleSubscriptionDeleteRequest(params *RMRParams) { subs.UnConfirmed() - c.rmrSend("SubDelReq to E2T", subs, trans, trans.Payload, trans.PayloadLen) + c.rmrSend("SubDelReq: SubDelReq to E2T", subs, trans, trans.Payload, trans.PayloadLen) c.timerMap.StartTimer("RIC_SUB_DEL_REQ", int(subs.GetSubId()), subDelReqTime, FirstTry, c.handleSubscriptionDeleteRequestTimer) return @@ -601,48 +600,49 @@ func (c *Control) handleSubscriptionDeleteResponse(params *RMRParams) (err error return } - packedData, err := c.e2ap.PackSubscriptionDeleteResponse(trans.SubDelRespMsg) - if err != nil { - xapp.Logger.Error("SubDelResp: %s for trans %s (continuing cleaning)", err.Error(), trans) - } else { - //Optimize and store packed message to be sent. - trans.Payload = packedData.Buf - trans.PayloadLen = len(packedData.Buf) - - if trans.ForwardRespToXapp == true { - c.rmrReplyToSender("SubDelResp to xapp", subs, trans, 12021, trans.Payload, trans.PayloadLen) - time.Sleep(3 * time.Second) - } - - } - - trans.Release() - subs.Release() + c.sendSubscriptionDeleteResponse("SubDelResp", trans, subs) return } func (c *Control) handleSubscriptionDeleteFailure(params *RMRParams) { xapp.Logger.Info("SubDelFail from E2T:%s", params.String()) - payloadSeqNum, err := c.e2ap.GetSubscriptionDeleteFailureSequenceNumber(params.Payload) + // + // + // + SubDelFailMsg, err := c.e2ap.UnpackSubscriptionDeleteFailure(params.Payload) if err != nil { - xapp.Logger.Error("SubDelFail: Unable to get Sequence Number from Payload. Dropping this msg. Err: %v, %s", err, params.String()) + xapp.Logger.Error("SubDelFail: %s Dropping this msg. %s", err.Error(), params.String()) return } - xapp.Logger.Info("SubDelFail: Received payloadSeqNum: %v", payloadSeqNum) - subs := c.registry.GetSubscription(payloadSeqNum) + // + // + // + subs := c.registry.GetSubscription(uint16(SubDelFailMsg.RequestId.Seq)) + if subs == nil && params.SubId > 0 { + subs = c.registry.GetSubscription(uint16(params.SubId)) + } + if subs == nil { - xapp.Logger.Error("SubDelFail: Unknown payloadSeqNum. Dropping this msg. PayloadSeqNum: %v, SubId: %v", payloadSeqNum, params.SubId) + xapp.Logger.Error("SubDelFail: Not valid subscription found payloadSeqNum: %d, SubId: %d. Dropping this msg. %s", SubDelFailMsg.RequestId.Seq, params.SubId, params.String()) return } + xapp.Logger.Info("SubDelFail: subscription found payloadSeqNum: %d, SubId: %d", SubDelFailMsg.RequestId.Seq, subs.GetSubId()) + // + // + // trans := subs.GetTransaction() if trans == nil { - xapp.Logger.Error("SubDelFail: Unknown trans. Dropping this msg. PayloadSeqNum: %v, SubId: %v", subs.GetSubId(), params.SubId) + xapp.Logger.Error("SubDelFail: Unknown trans. Dropping this msg. SubId: %d", subs.GetSubId()) return } + trans.SubDelFailMsg = SubDelFailMsg + // + // + // c.timerMap.StopTimer("RIC_SUB_DEL_REQ", int(subs.GetSubId())) responseReceived := trans.CheckResponseReceived() @@ -650,21 +650,8 @@ func (c *Control) handleSubscriptionDeleteFailure(params *RMRParams) { // Subscription Delete timer already received return } - if trans.ForwardRespToXapp == true { - var subDelRespPayload []byte - subDelRespPayload, err = c.e2ap.PackSubscriptionDeleteResponseFromSubDelReq(trans.Payload, subs.GetSubId()) - if err != nil { - xapp.Logger.Error("SubDelFail:Packing SubDelResp failed. Err: %v", err) - return - } - - // RIC SUBSCRIPTION DELETE RESPONSE - c.rmrReplyToSender("SubDelFail to xapp", subs, trans, 12021, subDelRespPayload, len(subDelRespPayload)) - time.Sleep(3 * time.Second) - } - trans.Release() - subs.Release() + c.sendSubscriptionDeleteResponse("SubDelFail", trans, subs) return } @@ -692,27 +679,37 @@ func (c *Control) handleSubscriptionDeleteRequestTimer(strId string, nbrId int, if tryCount < maxSubDelReqTryCount { // Set possible to handle new response for the subId trans.RetryTransaction() - c.rmrSend("SubDelReq(SubDelReq timer retransmit) to E2T", subs, trans, trans.Payload, trans.PayloadLen) + c.rmrSend("SubDelReq timeout: SubDelReq to E2T", subs, trans, trans.Payload, trans.PayloadLen) tryCount++ c.timerMap.StartTimer("RIC_SUB_DEL_REQ", int(subs.GetSubId()), subReqTime, tryCount, c.handleSubscriptionDeleteRequestTimer) return } - if trans.ForwardRespToXapp == true { - var subDelRespPayload []byte - subDelRespPayload, err := c.e2ap.PackSubscriptionDeleteResponseFromSubDelReq(trans.Payload, subs.GetSubId()) - if err != nil { - xapp.Logger.Error("SubDelReq timeout: Unable to pack payload. Dropping this this msg. Err: %v, SubId: %v, Xid: %s, Payload %x", err, subs.GetSubId(), trans.GetXid(), trans.Payload) - return - } + c.sendSubscriptionDeleteResponse("SubDelReq(timer)", trans, subs) + return +} - // RIC SUBSCRIPTION DELETE RESPONSE - c.rmrReplyToSender("SubDelResp(SubDelReq timer) to xapp", subs, trans, 12021, subDelRespPayload, len(subDelRespPayload)) - - time.Sleep(3 * time.Second) +func (c *Control) sendSubscriptionDeleteResponse(desc string, trans *Transaction, subs *Subscription) { + if trans.ForwardRespToXapp == true { + //Always generate SubDelResp + trans.SubDelRespMsg = &e2ap.E2APSubscriptionDeleteResponse{} + trans.SubDelRespMsg.RequestId.Id = trans.SubDelReqMsg.RequestId.Id + trans.SubDelRespMsg.RequestId.Seq = uint32(subs.GetSubId()) + trans.SubDelRespMsg.FunctionId = trans.SubDelReqMsg.FunctionId + + packedData, err := c.e2ap.PackSubscriptionDeleteResponse(trans.SubDelRespMsg) + if err == nil { + trans.Payload = packedData.Buf + trans.PayloadLen = len(packedData.Buf) + c.rmrReplyToSender(desc+": SubDelResp to xapp", subs, trans, 12021, trans.Payload, trans.PayloadLen) + time.Sleep(3 * time.Second) + } else { + //TODO error handling improvement + xapp.Logger.Error("%s: %s for trans %s (continuing cleaning)", desc, err.Error(), trans) + } } + trans.Release() subs.Release() - return } diff --git a/pkg/control/e2ap.go b/pkg/control/e2ap.go index 5f4bb44..8f7fb63 100644 --- a/pkg/control/e2ap.go +++ b/pkg/control/e2ap.go @@ -27,11 +27,9 @@ package control import "C" import ( - "fmt" "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap" "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/e2ap_wrapper" "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/packer" - "unsafe" ) var packerif e2ap.E2APPackerIf = e2ap_wrapper.NewAsn1E2Packer() @@ -39,49 +37,6 @@ var packerif e2ap.E2APPackerIf = e2ap_wrapper.NewAsn1E2Packer() type E2ap struct { } -/* RICsubscriptionDeleteFailure */ - -// Used by submgr -func (c *E2ap) GetSubscriptionDeleteFailureSequenceNumber(payload []byte) (subId uint16, err error) { - cptr := unsafe.Pointer(&payload[0]) - cret := C.e2ap_get_ric_subscription_delete_failure_sequence_number(cptr, C.size_t(len(payload))) - if cret < 0 { - return 0, fmt.Errorf("e2ap wrapper is unable to get Subscirption Delete Failure Sequence Number due to wrong or invalid payload. Erroxappde: %v", cret) - } - subId = uint16(cret) - return -} - -// Used by submgr -func (c *E2ap) SetSubscriptionDeleteFailureSequenceNumber(payload []byte, newSubscriptionid uint16) (err error) { - cptr := unsafe.Pointer(&payload[0]) - size := C.e2ap_set_ric_subscription_delete_failure_sequence_number(cptr, C.size_t(len(payload)), C.long(newSubscriptionid)) - if size < 0 { - return fmt.Errorf("e2ap wrapper is unable to set Subscription Delete Failure Sequence Number due to wrong or invalid payload. Erroxappde: %v", size) - } - return -} - -// Used by submgr -func (c *E2ap) PackSubscriptionDeleteResponseFromSubDelReq(payload []byte, newSubscriptionid uint16) (newPayload []byte, err error) { - - subDelReq, err := c.UnpackSubscriptionDeleteRequest(payload) - if err != nil { - return make([]byte, 0), fmt.Errorf("PackSubDelRespFromSubDelReq: SubDelReq unpack failed: %s", err.Error()) - } - - subDelResp := &e2ap.E2APSubscriptionDeleteResponse{} - subDelResp.RequestId.Id = subDelReq.RequestId.Id - subDelResp.RequestId.Seq = uint32(newSubscriptionid) - subDelResp.FunctionId = subDelReq.FunctionId - - packedData, err := c.PackSubscriptionDeleteResponse(subDelResp) - if err != nil { - return make([]byte, 0), fmt.Errorf("PackSubDelRespFromSubDelReq: SubDelResp pack failed: %s", err.Error()) - } - return packedData.Buf, nil -} - //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- @@ -236,3 +191,34 @@ func (c *E2ap) PackSubscriptionDeleteResponse(req *e2ap.E2APSubscriptionDeleteRe } return packedData, nil } + +//----------------------------------------------------------------------------- +// +//----------------------------------------------------------------------------- +func (c *E2ap) UnpackSubscriptionDeleteFailure(payload []byte) (*e2ap.E2APSubscriptionDeleteFailure, error) { + e2SubDelFail := packerif.NewPackerSubscriptionDeleteFailure() + packedData := &packer.PackedData{} + packedData.Buf = payload + err := e2SubDelFail.UnPack(packedData) + if err != nil { + return nil, err + } + err, subDelFail := e2SubDelFail.Get() + if err != nil { + return nil, err + } + return subDelFail, nil +} + +func (c *E2ap) PackSubscriptionDeleteFailure(req *e2ap.E2APSubscriptionDeleteFailure) (*packer.PackedData, error) { + e2SubDelFail := packerif.NewPackerSubscriptionDeleteFailure() + err := e2SubDelFail.Set(req) + if err != nil { + return nil, err + } + err, packedData := e2SubDelFail.Pack(nil) + if err != nil { + return nil, err + } + return packedData, nil +} diff --git a/pkg/control/transaction.go b/pkg/control/transaction.go index 9821fac..cdfdcfb 100644 --- a/pkg/control/transaction.go +++ b/pkg/control/transaction.go @@ -54,6 +54,7 @@ type Transaction struct { SubFailMsg *e2ap.E2APSubscriptionFailure //SubFail TODO: maybe own transactions per type SubDelReqMsg *e2ap.E2APSubscriptionDeleteRequest //SubDelReq TODO: maybe own transactions per type SubDelRespMsg *e2ap.E2APSubscriptionDeleteResponse //SubDelResp TODO: maybe own transactions per type + SubDelFailMsg *e2ap.E2APSubscriptionDeleteFailure //SubDelFail TODO: maybe own transactions per type Payload []byte //packed message to optimize retransmissions PayloadLen int //packed message len to optimize retransmissions RespReceived bool -- 2.16.6