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 "gerrit.o-ran-sc.org/r/ric-plt/e2ap/pkg/packer"
27 //-----------------------------------------------------------------------------
29 //-----------------------------------------------------------------------------
30 type E2APMsgPackerIf interface {
31 Pack(*packer.PackedData) (error, *packer.PackedData)
32 UnPack(msg *packer.PackedData) error
36 //-----------------------------------------------------------------------------
38 //-----------------------------------------------------------------------------
39 type E2APMsgPackerSubscriptionRequestIf interface {
41 Set(*E2APSubscriptionRequest) error
42 Get() (error, *E2APSubscriptionRequest)
45 //-----------------------------------------------------------------------------
47 //-----------------------------------------------------------------------------
48 type E2APMsgPackerSubscriptionResponseIf interface {
50 Set(*E2APSubscriptionResponse) error
51 Get() (error, *E2APSubscriptionResponse)
54 //-----------------------------------------------------------------------------
56 //-----------------------------------------------------------------------------
57 type E2APMsgPackerSubscriptionFailureIf interface {
59 Set(*E2APSubscriptionFailure) error
60 Get() (error, *E2APSubscriptionFailure)
63 //-----------------------------------------------------------------------------
65 //-----------------------------------------------------------------------------
66 type E2APMsgPackerSubscriptionDeleteRequestIf interface {
68 Set(*E2APSubscriptionDeleteRequest) error
69 Get() (error, *E2APSubscriptionDeleteRequest)
72 //-----------------------------------------------------------------------------
74 //-----------------------------------------------------------------------------
75 type E2APMsgPackerSubscriptionDeleteResponseIf interface {
77 Set(*E2APSubscriptionDeleteResponse) error
78 Get() (error, *E2APSubscriptionDeleteResponse)
81 //-----------------------------------------------------------------------------
83 //-----------------------------------------------------------------------------
84 type E2APMsgPackerSubscriptionDeleteFailureIf interface {
86 Set(*E2APSubscriptionDeleteFailure) error
87 Get() (error, *E2APSubscriptionDeleteFailure)
90 //-----------------------------------------------------------------------------
92 //-----------------------------------------------------------------------------
93 type E2APMsgPackerIndicationIf interface {
95 Set(*E2APIndication) error
96 Get() (error, *E2APIndication)
99 //-----------------------------------------------------------------------------
101 //-----------------------------------------------------------------------------
102 type E2APPackerIf interface {
103 NewPackerSubscriptionRequest() E2APMsgPackerSubscriptionRequestIf
104 NewPackerSubscriptionResponse() E2APMsgPackerSubscriptionResponseIf
105 NewPackerSubscriptionFailure() E2APMsgPackerSubscriptionFailureIf
106 NewPackerSubscriptionDeleteRequest() E2APMsgPackerSubscriptionDeleteRequestIf
107 NewPackerSubscriptionDeleteResponse() E2APMsgPackerSubscriptionDeleteResponseIf
108 NewPackerSubscriptionDeleteFailure() E2APMsgPackerSubscriptionDeleteFailureIf
109 NewPackerIndication() E2APMsgPackerIndicationIf
110 MessageInfo(msg *packer.PackedData) *packer.MessageInfo
113 //-----------------------------------------------------------------------------
115 //-----------------------------------------------------------------------------
116 type E2APAutoPacker struct {
120 func NewE2APAutoPacker(packer E2APPackerIf) *E2APAutoPacker {
121 return &E2APAutoPacker{packer: packer}
124 // TODO improve openasn handling to reuse PDU etc...
125 // Now practically decodes two times each E2/X2 message, as first round solves message type
126 func (autopacker *E2APAutoPacker) UnPack(msg *packer.PackedData) (error, interface{}) {
128 msgInfo := autopacker.packer.MessageInfo(msg)
130 switch msgInfo.MsgType {
131 case E2AP_InitiatingMessage:
132 switch msgInfo.MsgId {
133 case E2AP_RICSubscriptionRequest:
134 unpa := autopacker.packer.NewPackerSubscriptionRequest()
135 err = unpa.UnPack(msg)
139 case E2AP_RICSubscriptionDeleteRequest:
140 unpa := autopacker.packer.NewPackerSubscriptionDeleteRequest()
141 err = unpa.UnPack(msg)
145 case E2AP_RICIndication:
146 unpa := autopacker.packer.NewPackerIndication()
147 err = unpa.UnPack(msg)
152 err = fmt.Errorf("MsgType: E2AP_InitiatingMessage => MsgId:%d unknown", msgInfo.MsgId)
154 case E2AP_SuccessfulOutcome:
155 switch msgInfo.MsgId {
156 case E2AP_RICSubscriptionResponse:
157 unpa := autopacker.packer.NewPackerSubscriptionResponse()
158 err = unpa.UnPack(msg)
162 case E2AP_RICSubscriptionDeleteResponse:
163 unpa := autopacker.packer.NewPackerSubscriptionDeleteResponse()
164 err = unpa.UnPack(msg)
169 err = fmt.Errorf("MsgType: E2AP_SuccessfulOutcome => MsgId:%d unknown", msgInfo.MsgId)
171 case E2AP_UnsuccessfulOutcome:
172 switch msgInfo.MsgId {
173 case E2AP_RICSubscriptionFailure:
174 unpa := autopacker.packer.NewPackerSubscriptionFailure()
175 err = unpa.UnPack(msg)
179 case E2AP_RICSubscriptionDeleteFailure:
180 unpa := autopacker.packer.NewPackerSubscriptionDeleteFailure()
181 err = unpa.UnPack(msg)
186 err = fmt.Errorf("MsgType: E2AP_UnsuccessfulOutcome => MsgId:%d unknown", msgInfo.MsgId)
189 err = fmt.Errorf("MsgType: %d and MsgId:%d unknown", msgInfo.MsgType, msgInfo.MsgId)
192 err = fmt.Errorf("MsgInfo not received")
197 func (autopacker *E2APAutoPacker) Pack(data interface{}, trg *packer.PackedData) (error, *packer.PackedData) {
199 switch themsg := data.(type) {
200 case *E2APSubscriptionRequest:
201 pa := autopacker.packer.NewPackerSubscriptionRequest()
206 case *E2APSubscriptionResponse:
207 pa := autopacker.packer.NewPackerSubscriptionResponse()
212 case *E2APSubscriptionFailure:
213 pa := autopacker.packer.NewPackerSubscriptionFailure()
218 case *E2APSubscriptionDeleteRequest:
219 pa := autopacker.packer.NewPackerSubscriptionDeleteRequest()
224 case *E2APSubscriptionDeleteResponse:
225 pa := autopacker.packer.NewPackerSubscriptionDeleteResponse()
230 case *E2APSubscriptionDeleteFailure:
231 pa := autopacker.packer.NewPackerSubscriptionDeleteFailure()
236 case *E2APIndication:
237 pa := autopacker.packer.NewPackerIndication()
243 err = fmt.Errorf("unknown message")