blob: aa49e8cdf893b2e8f502dd3d27c4c86886324601 [file] [log] [blame]
Chip Boling6e27b352020-02-14 09:10:01 -06001/*
2 * Copyright (c) 2018 - present. Boling Consulting Solutions (bcsw.net)
Andrea Campanella7167ebb2020-02-24 09:56:38 +01003 * Copyright 2020-present Open Networking Foundation
4
Chip Boling6e27b352020-02-14 09:10:01 -06005 * 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
Andrea Campanella7167ebb2020-02-24 09:56:38 +01008
Chip Boling6e27b352020-02-14 09:10:01 -06009 * http://www.apache.org/licenses/LICENSE-2.0
Andrea Campanella7167ebb2020-02-24 09:56:38 +010010
Chip Boling6e27b352020-02-14 09:10:01 -060011 * 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.
Chip Boling6e27b352020-02-14 09:10:01 -060016 */
17
18package omci
19
20import (
21 "errors"
Chip Boling6e27b352020-02-14 09:10:01 -060022 "github.com/google/gopacket"
David K. Bainbridgeadf422d2021-04-09 16:06:41 +000023 me "github.com/opencord/omci-lib-go/generated"
Chip Boling6e27b352020-02-14 09:10:01 -060024)
25
26var nextLayerMapping map[MessageType]gopacket.LayerType
27
28var (
Chip Boling157c9b92021-04-21 09:58:36 -050029 // Baseline Message Types
Chip Boling6e27b352020-02-14 09:10:01 -060030 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
Chip Boling157c9b92021-04-21 09:58:36 -050051
52 // Extended Message Types
53 LayerTypeGetRequestExtended gopacket.LayerType
Chip Boling6e27b352020-02-14 09:10:01 -060054)
55var (
Chip Boling157c9b92021-04-21 09:58:36 -050056 // Baseline Message Types
Chip Boling6e27b352020-02-14 09:10:01 -060057 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
Chip Boling157c9b92021-04-21 09:58:36 -050080
81 // Extended Message Types
82 LayerTypeGetResponseExtended gopacket.LayerType
Chip Boling6e27b352020-02-14 09:10:01 -060083)
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
Chip Boling157c9b92021-04-21 09:58:36 -0500150 // 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
Chip Boling6e27b352020-02-14 09:10:01 -0600155 // 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
Chip Boling8c8018e2021-02-22 15:56:00 -0600170 nextLayerMapping[DownloadSectionRequestWithResponseType] = LayerTypeDownloadSectionRequest
Chip Boling6e27b352020-02-14 09:10:01 -0600171 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
Chip Boling157c9b92021-04-21 09:58:36 -0500204
205 // Extended message support
206 nextLayerMapping[GetRequestType+ExtendedTypeDecodeOffset] = LayerTypeGetRequestExtended
207 nextLayerMapping[GetResponseType+ExtendedTypeDecodeOffset] = LayerTypeGetResponseExtended
Chip Boling6e27b352020-02-14 09:10:01 -0600208}
209
Chip Boling157c9b92021-04-21 09:58:36 -0500210func MsgTypeToNextLayer(mt MessageType, isExtended bool) (gopacket.LayerType, error) {
211 if isExtended {
212 mt |= ExtendedTypeDecodeOffset
213 }
Chip Boling6e27b352020-02-14 09:10:01 -0600214 nextLayer, ok := nextLayerMapping[mt]
215 if ok {
216 return nextLayer, nil
217 }
Chip Boling157c9b92021-04-21 09:58:36 -0500218 return gopacket.LayerTypeZero, errors.New("unknown/unsupported message type")
Chip Boling6e27b352020-02-14 09:10:01 -0600219}