blob: 038cc201d383b3b8c559c4deed88b68c994b14ba [file] [log] [blame]
Chip Boling610117d2021-09-09 11:24:34 -05001/*
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 "encoding/binary"
22 "fmt"
23 "github.com/google/gopacket"
Andrea Campanellae0cd8232021-10-15 15:10:23 +020024 me "github.com/opencord/omci-lib-go/v2/generated"
Chip Boling610117d2021-09-09 11:24:34 -050025)
26
27type DeleteRequest struct {
28 MeBasePacket
29}
30
31func (omci *DeleteRequest) String() string {
32 return fmt.Sprintf("%v", omci.MeBasePacket.String())
33}
34
35// LayerType returns LayerTypeDeleteRequest
36func (omci *DeleteRequest) LayerType() gopacket.LayerType {
37 return LayerTypeDeleteRequest
38}
39
40// CanDecode returns the set of layer types that this DecodingLayer can decode
41func (omci *DeleteRequest) CanDecode() gopacket.LayerClass {
42 return LayerTypeDeleteRequest
43}
44
45// NextLayerType returns the layer type contained by this DecodingLayer.
46func (omci *DeleteRequest) NextLayerType() gopacket.LayerType {
47 return gopacket.LayerTypePayload
48}
49
50// DecodeFromBytes decodes the given bytes of a Delete Request into this layer
51func (omci *DeleteRequest) DecodeFromBytes(data []byte, p gopacket.PacketBuilder) error {
52 // Common ClassID/EntityID decode in msgBase
53 var hdrSize int
54 if omci.Extended {
55 hdrSize = 6
56 } else {
57 hdrSize = 4
58 }
59 err := omci.MeBasePacket.DecodeFromBytes(data, p, hdrSize)
60 if err != nil {
61 return err
62 }
63 entity, omciErr := me.LoadManagedEntityDefinition(omci.EntityClass,
64 me.ParamData{EntityID: omci.EntityInstance})
65 if omciErr.StatusCode() != me.Success {
66 return omciErr.GetError()
67 }
68 // ME needs to support Delete
69 if !me.SupportsMsgType(entity, me.Delete) {
70 return me.NewProcessingError("managed entity does not support the Delete Message-Type")
71 }
72 return nil
73}
74
75func decodeDeleteRequest(data []byte, p gopacket.PacketBuilder) error {
76 omci := &DeleteRequest{}
77 omci.MsgLayerType = LayerTypeDeleteRequest
78 return decodingLayerDecoder(omci, data, p)
79}
80
81func decodeDeleteRequestExtended(data []byte, p gopacket.PacketBuilder) error {
82 omci := &DeleteRequest{}
83 omci.MsgLayerType = LayerTypeDeleteRequest
84 omci.Extended = true
85 return decodingLayerDecoder(omci, data, p)
86}
87
88// SerializeTo provides serialization of an Delete Request message
89func (omci *DeleteRequest) SerializeTo(b gopacket.SerializeBuffer, _ gopacket.SerializeOptions) error {
90 // Basic (common) OMCI Header is 8 octets, 10
91 err := omci.MeBasePacket.SerializeTo(b)
92 if err != nil {
93 return err
94 }
95 entity, omciErr := me.LoadManagedEntityDefinition(omci.EntityClass,
96 me.ParamData{EntityID: omci.EntityInstance})
97 if omciErr.StatusCode() != me.Success {
98 return omciErr.GetError()
99 }
100 // ME needs to support Delete
101 if !me.SupportsMsgType(entity, me.Delete) {
102 return me.NewProcessingError("managed entity does not support the Delete Message-Type")
103 }
104 if omci.Extended {
105 bytes, err := b.AppendBytes(2)
106 if err != nil {
107 return err
108 }
109 binary.BigEndian.PutUint16(bytes, 0)
110 }
111 return nil
112}
113
114type DeleteResponse struct {
115 MeBasePacket
116 Result me.Results
117}
118
119func (omci *DeleteResponse) String() string {
120 return fmt.Sprintf("%v, Result: %d (%v)",
121 omci.MeBasePacket.String(), omci.Result, omci.Result)
122}
123
124// LayerType returns LayerTypeDeleteResponse
125func (omci *DeleteResponse) LayerType() gopacket.LayerType {
126 return LayerTypeDeleteResponse
127}
128
129// CanDecode returns the set of layer types that this DecodingLayer can decode
130func (omci *DeleteResponse) CanDecode() gopacket.LayerClass {
131 return LayerTypeDeleteResponse
132}
133
134// NextLayerType returns the layer type contained by this DecodingLayer.
135func (omci *DeleteResponse) NextLayerType() gopacket.LayerType {
136 return gopacket.LayerTypePayload
137}
138
139// DecodeFromBytes decodes the given bytes of a Delete Response into this layer
140func (omci *DeleteResponse) DecodeFromBytes(data []byte, p gopacket.PacketBuilder) error {
141 // Common ClassID/EntityID decode in msgBase
142 var hdrSize int
143 if omci.Extended {
144 hdrSize = 6 + 1
145 } else {
146 hdrSize = 4 + 1
147 }
148 err := omci.MeBasePacket.DecodeFromBytes(data, p, hdrSize)
149 if err != nil {
150 return err
151 }
152 entity, omciErr := me.LoadManagedEntityDefinition(omci.EntityClass,
153 me.ParamData{EntityID: omci.EntityInstance})
154 if omciErr.StatusCode() != me.Success {
155 return omciErr.GetError()
156 }
157 // ME needs to support Delete
158 if !me.SupportsMsgType(entity, me.Delete) {
159 return me.NewProcessingError("managed entity does not support the Delete Message-Type")
160 }
161 offset := hdrSize - 1
162 omci.Result = me.Results(data[offset])
163 return nil
164}
165
166func decodeDeleteResponse(data []byte, p gopacket.PacketBuilder) error {
167 omci := &DeleteResponse{}
168 omci.MsgLayerType = LayerTypeDeleteResponse
169 return decodingLayerDecoder(omci, data, p)
170}
171
172func decodeDeleteResponseExtended(data []byte, p gopacket.PacketBuilder) error {
173 omci := &DeleteResponse{}
174 omci.MsgLayerType = LayerTypeDeleteResponse
175 omci.Extended = true
176 return decodingLayerDecoder(omci, data, p)
177}
178
179// SerializeTo provides serialization of an Delete Response message
180func (omci *DeleteResponse) SerializeTo(b gopacket.SerializeBuffer, _ gopacket.SerializeOptions) error {
181 // Basic (common) OMCI Header is 8 octets, 10
182 err := omci.MeBasePacket.SerializeTo(b)
183 if err != nil {
184 return err
185 }
186 entity, omciErr := me.LoadManagedEntityDefinition(omci.EntityClass,
187 me.ParamData{EntityID: omci.EntityInstance})
188 if omciErr.StatusCode() != me.Success {
189 return omciErr.GetError()
190 }
191 // ME needs to support Delete
192 if !me.SupportsMsgType(entity, me.Delete) {
193 return me.NewProcessingError("managed entity does not support the Delete Message-Type")
194 }
195 var offset int
196 if omci.Extended {
197 offset = 2
198 } else {
199 offset = 0
200 }
201 bytes, err := b.AppendBytes(offset + 1)
202 if omci.Extended {
203 binary.BigEndian.PutUint16(bytes, 1)
204 }
205 if err != nil {
206 return err
207 }
208 bytes[offset] = byte(omci.Result)
209 return nil
210}