blob: aa49e8cdf893b2e8f502dd3d27c4c86886324601 [file] [log] [blame]
Holger Hildebrandtfa074992020-03-27 15:42:06 +00001/*
2 * Copyright (c) 2018 - present. Boling Consulting Solutions (bcsw.net)
3 * Copyright 2020-present Open Networking Foundation
4
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8
9 * http://www.apache.org/licenses/LICENSE-2.0
10
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18package omci
19
20import (
21 "errors"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000022 "github.com/google/gopacket"
David K. Bainbridged80007b2021-04-12 12:22:29 +000023 me "github.com/opencord/omci-lib-go/generated"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000024)
25
26var nextLayerMapping map[MessageType]gopacket.LayerType
27
28var (
Girish Gowdra6afb56a2021-04-27 17:47:57 -070029 // Baseline Message Types
Holger Hildebrandtfa074992020-03-27 15:42:06 +000030 LayerTypeCreateRequest gopacket.LayerType
31 LayerTypeDeleteRequest gopacket.LayerType
32 LayerTypeSetRequest gopacket.LayerType
33 LayerTypeGetRequest gopacket.LayerType
34 LayerTypeGetAllAlarmsRequest gopacket.LayerType
35 LayerTypeGetAllAlarmsNextRequest gopacket.LayerType
36 LayerTypeMibUploadRequest gopacket.LayerType
37 LayerTypeMibUploadNextRequest gopacket.LayerType
38 LayerTypeMibResetRequest gopacket.LayerType
39 LayerTypeTestRequest gopacket.LayerType
40 LayerTypeStartSoftwareDownloadRequest gopacket.LayerType
41 LayerTypeDownloadSectionRequest gopacket.LayerType
42 LayerTypeDownloadSectionLastRequest gopacket.LayerType
43 LayerTypeEndSoftwareDownloadRequest gopacket.LayerType
44 LayerTypeActivateSoftwareRequest gopacket.LayerType
45 LayerTypeCommitSoftwareRequest gopacket.LayerType
46 LayerTypeSynchronizeTimeRequest gopacket.LayerType
47 LayerTypeRebootRequest gopacket.LayerType
48 LayerTypeGetNextRequest gopacket.LayerType
49 LayerTypeGetCurrentDataRequest gopacket.LayerType
50 LayerTypeSetTableRequest gopacket.LayerType
Girish Gowdra6afb56a2021-04-27 17:47:57 -070051
52 // Extended Message Types
53 LayerTypeGetRequestExtended gopacket.LayerType
Holger Hildebrandtfa074992020-03-27 15:42:06 +000054)
55var (
Girish Gowdra6afb56a2021-04-27 17:47:57 -070056 // Baseline Message Types
Holger Hildebrandtfa074992020-03-27 15:42:06 +000057 LayerTypeCreateResponse gopacket.LayerType
58 LayerTypeDeleteResponse gopacket.LayerType
59 LayerTypeSetResponse gopacket.LayerType
60 LayerTypeGetResponse gopacket.LayerType
61 LayerTypeGetAllAlarmsResponse gopacket.LayerType
62 LayerTypeGetAllAlarmsNextResponse gopacket.LayerType
63 LayerTypeMibUploadResponse gopacket.LayerType
64 LayerTypeMibUploadNextResponse gopacket.LayerType
65 LayerTypeMibResetResponse gopacket.LayerType
66 LayerTypeAlarmNotification gopacket.LayerType
67 LayerTypeAttributeValueChange gopacket.LayerType
68 LayerTypeTestResponse gopacket.LayerType
69 LayerTypeStartSoftwareDownloadResponse gopacket.LayerType
70 LayerTypeDownloadSectionResponse gopacket.LayerType
71 LayerTypeEndSoftwareDownloadResponse gopacket.LayerType
72 LayerTypeActivateSoftwareResponse gopacket.LayerType
73 LayerTypeCommitSoftwareResponse gopacket.LayerType
74 LayerTypeSynchronizeTimeResponse gopacket.LayerType
75 LayerTypeRebootResponse gopacket.LayerType
76 LayerTypeGetNextResponse gopacket.LayerType
77 LayerTypeTestResult gopacket.LayerType
78 LayerTypeGetCurrentDataResponse gopacket.LayerType
79 LayerTypeSetTableResponse gopacket.LayerType
Girish Gowdra6afb56a2021-04-27 17:47:57 -070080
81 // Extended Message Types
82 LayerTypeGetResponseExtended gopacket.LayerType
Holger Hildebrandtfa074992020-03-27 15:42:06 +000083)
84
85func mkReqLayer(mt me.MsgType, mts string, decode gopacket.DecodeFunc) gopacket.LayerType {
86 return gopacket.RegisterLayerType(1000+(int(mt)|int(me.AR)),
87 gopacket.LayerTypeMetadata{Name: mts, Decoder: decode})
88}
89
90func mkRespLayer(mt me.MsgType, mts string, decode gopacket.DecodeFunc) gopacket.LayerType {
91 return gopacket.RegisterLayerType(1000+(int(mt)|int(me.AK)),
92 gopacket.LayerTypeMetadata{Name: mts, Decoder: decode})
93}
94
95func mkLayer(mt me.MsgType, mts string, decode gopacket.DecodeFunc) gopacket.LayerType {
96 return gopacket.RegisterLayerType(1000+(int(mt)),
97 gopacket.LayerTypeMetadata{Name: mts, Decoder: decode})
98}
99
100func init() {
101 // Create layers for message_type & action
102 LayerTypeCreateRequest = mkReqLayer(me.Create, "CreateRequest", gopacket.DecodeFunc(decodeCreateRequest))
103 LayerTypeDeleteRequest = mkReqLayer(me.Delete, "DeleteRequest", gopacket.DecodeFunc(decodeDeleteRequest))
104 LayerTypeSetRequest = mkReqLayer(me.Set, "SetRequest", gopacket.DecodeFunc(decodeSetRequest))
105 LayerTypeGetRequest = mkReqLayer(me.Get, "GetRequest", gopacket.DecodeFunc(decodeGetRequest))
106 LayerTypeGetAllAlarmsRequest = mkReqLayer(me.GetAllAlarms, "GetAllAlarmsRequest", gopacket.DecodeFunc(decodeGetAllAlarmsRequest))
107 LayerTypeGetAllAlarmsNextRequest = mkReqLayer(me.GetAllAlarmsNext, "GetAllAlarmsNextRequest", gopacket.DecodeFunc(decodeGetAllAlarmsNextRequest))
108 LayerTypeMibUploadRequest = mkReqLayer(me.MibUpload, "MibUploadRequest", gopacket.DecodeFunc(decodeMibUploadRequest))
109 LayerTypeMibUploadNextRequest = mkReqLayer(me.MibUploadNext, "MibUploadNextRequest", gopacket.DecodeFunc(decodeMibUploadNextRequest))
110 LayerTypeMibResetRequest = mkReqLayer(me.MibReset, "MibResetRequest", gopacket.DecodeFunc(decodeMibResetRequest))
111 LayerTypeTestRequest = mkReqLayer(me.Test, "TestRequest", gopacket.DecodeFunc(decodeTestRequest))
112 LayerTypeStartSoftwareDownloadRequest = mkReqLayer(me.StartSoftwareDownload, "StartSoftwareDownloadRequest", gopacket.DecodeFunc(decodeStartSoftwareDownloadRequest))
113
114 // For Download section, AR=0 if not response expected, AR=1 if response expected (last section of a window)
115 LayerTypeDownloadSectionRequest = mkLayer(me.DownloadSection, "DownloadSectionRequest", gopacket.DecodeFunc(decodeDownloadSectionRequest))
116 LayerTypeDownloadSectionLastRequest = mkReqLayer(me.DownloadSection, "DownloadLastSectionRequest", gopacket.DecodeFunc(decodeDownloadSectionRequest))
117 LayerTypeEndSoftwareDownloadRequest = mkReqLayer(me.EndSoftwareDownload, "EndSoftwareDownloadRequest", gopacket.DecodeFunc(decodeEndSoftwareDownloadRequest))
118 LayerTypeActivateSoftwareRequest = mkReqLayer(me.ActivateSoftware, "ActivateSoftwareRequest", gopacket.DecodeFunc(decodeActivateSoftwareRequest))
119 LayerTypeCommitSoftwareRequest = mkReqLayer(me.CommitSoftware, "CommitSoftwareRequest", gopacket.DecodeFunc(decodeCommitSoftwareRequest))
120 LayerTypeSynchronizeTimeRequest = mkReqLayer(me.SynchronizeTime, "SynchronizeTimeRequest", gopacket.DecodeFunc(decodeSynchronizeTimeRequest))
121 LayerTypeRebootRequest = mkReqLayer(me.Reboot, "RebootRequest", gopacket.DecodeFunc(decodeRebootRequest))
122 LayerTypeGetNextRequest = mkReqLayer(me.GetNext, "GetNextRequest", gopacket.DecodeFunc(decodeGetNextRequest))
123 LayerTypeGetCurrentDataRequest = mkReqLayer(me.GetCurrentData, "GetCurrentDataRequest", gopacket.DecodeFunc(decodeGetCurrentDataRequest))
124 LayerTypeSetTableRequest = mkReqLayer(me.SetTable, "SetTableRequest", gopacket.DecodeFunc(decodeSetTableRequest))
125
126 LayerTypeCreateResponse = mkRespLayer(me.Create, "CreateResponse", gopacket.DecodeFunc(decodeCreateResponse))
127 LayerTypeDeleteResponse = mkRespLayer(me.Delete, "DeleteResponse", gopacket.DecodeFunc(decodeDeleteResponse))
128 LayerTypeSetResponse = mkRespLayer(me.Set, "SetResponse", gopacket.DecodeFunc(decodeSetResponse))
129 LayerTypeGetResponse = mkRespLayer(me.Get, "GetResponse", gopacket.DecodeFunc(decodeGetResponse))
130 LayerTypeGetAllAlarmsResponse = mkRespLayer(me.GetAllAlarms, "GetAllAlarmsResponse", gopacket.DecodeFunc(decodeGetAllAlarmsResponse))
131 LayerTypeGetAllAlarmsNextResponse = mkRespLayer(me.GetAllAlarmsNext, "GetAllAlarmsNextResponse", gopacket.DecodeFunc(decodeGetAllAlarmsNextResponse))
132 LayerTypeMibUploadResponse = mkRespLayer(me.MibUpload, "MibUploadResponse", gopacket.DecodeFunc(decodeMibUploadResponse))
133 LayerTypeMibUploadNextResponse = mkRespLayer(me.MibUploadNext, "MibUploadNextResponse", gopacket.DecodeFunc(decodeMibUploadNextResponse))
134 LayerTypeMibResetResponse = mkRespLayer(me.MibReset, "MibResetResponse", gopacket.DecodeFunc(decodeMibResetResponse))
135 LayerTypeAlarmNotification = mkLayer(me.AlarmNotification, "AlarmNotification", gopacket.DecodeFunc(decodeAlarmNotification))
136 LayerTypeAttributeValueChange = mkLayer(me.AttributeValueChange, "AttributeValueChange", gopacket.DecodeFunc(decodeAttributeValueChange))
137 LayerTypeTestResponse = mkRespLayer(me.Test, "TestResponse", gopacket.DecodeFunc(decodeTestResponse))
138 LayerTypeStartSoftwareDownloadResponse = mkRespLayer(me.StartSoftwareDownload, "StartSoftwareDownloadResponse", gopacket.DecodeFunc(decodeStartSoftwareDownloadResponse))
139 LayerTypeDownloadSectionResponse = mkRespLayer(me.DownloadSection, "DownloadSectionResponse", gopacket.DecodeFunc(decodeDownloadSectionResponse))
140 LayerTypeEndSoftwareDownloadResponse = mkRespLayer(me.EndSoftwareDownload, "EndSoftwareDownloadResponse", gopacket.DecodeFunc(decodeEndSoftwareDownloadResponse))
141 LayerTypeActivateSoftwareResponse = mkRespLayer(me.ActivateSoftware, "ActivateSoftwareResponse", gopacket.DecodeFunc(decodeActivateSoftwareResponse))
142 LayerTypeCommitSoftwareResponse = mkRespLayer(me.CommitSoftware, "CommitSoftwareResponse", gopacket.DecodeFunc(decodeCommitSoftwareResponse))
143 LayerTypeSynchronizeTimeResponse = mkRespLayer(me.SynchronizeTime, "SynchronizeTimeResponse", gopacket.DecodeFunc(decodeSynchronizeTimeResponse))
144 LayerTypeRebootResponse = mkRespLayer(me.Reboot, "RebootResponse", gopacket.DecodeFunc(decodeRebootResponse))
145 LayerTypeGetNextResponse = mkRespLayer(me.GetNext, "GetNextResponse", gopacket.DecodeFunc(decodeGetNextResponse))
146 LayerTypeTestResult = mkRespLayer(me.TestResult, "TestResult", gopacket.DecodeFunc(decodeTestResult))
147 LayerTypeGetCurrentDataResponse = mkRespLayer(me.GetCurrentData, "GetCurrentDataResponse", gopacket.DecodeFunc(decodeGetCurrentDataResponse))
148 LayerTypeSetTableResponse = mkRespLayer(me.SetTable, "SetTableResponse", gopacket.DecodeFunc(decodeSetTableResponse))
149
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700150 // Extended message set support
151
152 LayerTypeGetRequestExtended = mkReqLayer(me.Get|me.ExtendedOffset, "GetRequest-Ext", gopacket.DecodeFunc(decodeGetRequestExtended))
153 LayerTypeGetResponseExtended = mkRespLayer(me.Get|me.ExtendedOffset, "GetResponse-Ext", gopacket.DecodeFunc(decodeGetResponseExtended))
154
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000155 // Map message_type and action to layer
156 nextLayerMapping = make(map[MessageType]gopacket.LayerType)
157
158 nextLayerMapping[CreateRequestType] = LayerTypeCreateRequest
159 nextLayerMapping[DeleteRequestType] = LayerTypeDeleteRequest
160 nextLayerMapping[SetRequestType] = LayerTypeSetRequest
161 nextLayerMapping[GetRequestType] = LayerTypeGetRequest
162 nextLayerMapping[GetAllAlarmsRequestType] = LayerTypeGetAllAlarmsRequest
163 nextLayerMapping[GetAllAlarmsNextRequestType] = LayerTypeGetAllAlarmsNextRequest
164 nextLayerMapping[MibUploadRequestType] = LayerTypeMibUploadRequest
165 nextLayerMapping[MibUploadNextRequestType] = LayerTypeMibUploadNextRequest
166 nextLayerMapping[MibResetRequestType] = LayerTypeMibResetRequest
167 nextLayerMapping[TestRequestType] = LayerTypeTestRequest
168 nextLayerMapping[StartSoftwareDownloadRequestType] = LayerTypeStartSoftwareDownloadRequest
169 nextLayerMapping[DownloadSectionRequestType] = LayerTypeDownloadSectionRequest
Girish Gowdra8a7b4562021-02-23 16:27:42 -0800170 nextLayerMapping[DownloadSectionRequestWithResponseType] = LayerTypeDownloadSectionRequest
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000171 nextLayerMapping[EndSoftwareDownloadRequestType] = LayerTypeEndSoftwareDownloadRequest
172 nextLayerMapping[ActivateSoftwareRequestType] = LayerTypeActivateSoftwareRequest
173 nextLayerMapping[CommitSoftwareRequestType] = LayerTypeCommitSoftwareRequest
174 nextLayerMapping[SynchronizeTimeRequestType] = LayerTypeSynchronizeTimeRequest
175 nextLayerMapping[RebootRequestType] = LayerTypeRebootRequest
176 nextLayerMapping[GetNextRequestType] = LayerTypeGetNextRequest
177 nextLayerMapping[GetCurrentDataRequestType] = LayerTypeGetCurrentDataRequest
178 nextLayerMapping[SetTableRequestType] = LayerTypeSetTableRequest
179
180 nextLayerMapping[CreateResponseType] = LayerTypeCreateResponse
181 nextLayerMapping[DeleteResponseType] = LayerTypeDeleteResponse
182 nextLayerMapping[SetResponseType] = LayerTypeSetResponse
183 nextLayerMapping[GetResponseType] = LayerTypeGetResponse
184 nextLayerMapping[GetAllAlarmsResponseType] = LayerTypeGetAllAlarmsResponse
185 nextLayerMapping[GetAllAlarmsNextResponseType] = LayerTypeGetAllAlarmsNextResponse
186 nextLayerMapping[MibUploadResponseType] = LayerTypeMibUploadResponse
187 nextLayerMapping[MibUploadNextResponseType] = LayerTypeMibUploadNextResponse
188 nextLayerMapping[MibResetResponseType] = LayerTypeMibResetResponse
189 nextLayerMapping[TestResponseType] = LayerTypeTestResponse
190 nextLayerMapping[StartSoftwareDownloadResponseType] = LayerTypeStartSoftwareDownloadResponse
191 nextLayerMapping[DownloadSectionResponseType] = LayerTypeDownloadSectionResponse
192 nextLayerMapping[EndSoftwareDownloadResponseType] = LayerTypeEndSoftwareDownloadResponse
193 nextLayerMapping[ActivateSoftwareResponseType] = LayerTypeActivateSoftwareResponse
194 nextLayerMapping[CommitSoftwareResponseType] = LayerTypeCommitSoftwareResponse
195 nextLayerMapping[SynchronizeTimeResponseType] = LayerTypeSynchronizeTimeResponse
196 nextLayerMapping[RebootResponseType] = LayerTypeRebootResponse
197 nextLayerMapping[GetNextResponseType] = LayerTypeGetNextResponse
198 nextLayerMapping[GetCurrentDataResponseType] = LayerTypeGetCurrentDataResponse
199 nextLayerMapping[SetTableResponseType] = LayerTypeSetTableResponse
200
201 nextLayerMapping[AttributeValueChangeType] = LayerTypeAttributeValueChange
202 nextLayerMapping[AlarmNotificationType] = LayerTypeAlarmNotification
203 nextLayerMapping[TestResultType] = LayerTypeTestResult
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700204
205 // Extended message support
206 nextLayerMapping[GetRequestType+ExtendedTypeDecodeOffset] = LayerTypeGetRequestExtended
207 nextLayerMapping[GetResponseType+ExtendedTypeDecodeOffset] = LayerTypeGetResponseExtended
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000208}
209
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700210func MsgTypeToNextLayer(mt MessageType, isExtended bool) (gopacket.LayerType, error) {
211 if isExtended {
212 mt |= ExtendedTypeDecodeOffset
213 }
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000214 nextLayer, ok := nextLayerMapping[mt]
215 if ok {
216 return nextLayer, nil
217 }
Girish Gowdra6afb56a2021-04-27 17:47:57 -0700218 return gopacket.LayerTypeZero, errors.New("unknown/unsupported message type")
Holger Hildebrandtfa074992020-03-27 15:42:06 +0000219}