blob: 41f7a1f8c4666281612ff7c2339547411f833041 [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 "encoding/binary"
22 "fmt"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000023 "github.com/google/gopacket"
24 "github.com/google/gopacket/layers"
David K. Bainbridged80007b2021-04-12 12:22:29 +000025 me "github.com/opencord/omci-lib-go/generated"
Holger Hildebrandtfa074992020-03-27 15:42:06 +000026)
27
28type MeBasePacket struct {
29 EntityClass me.ClassID
30 EntityInstance uint16
31
32 gopacket.Layer
33 layers.BaseLayer
34 MsgLayerType gopacket.LayerType
Girish Gowdra6afb56a2021-04-27 17:47:57 -070035 Extended bool
Holger Hildebrandtfa074992020-03-27 15:42:06 +000036}
37
38func (msg *MeBasePacket) String() string {
39 return fmt.Sprintf("ClassID: %v, InstanceId: %d/%#x",
40 msg.EntityClass, msg.EntityInstance, msg.EntityInstance)
41}
42
43// CanDecode returns the set of layer types that this DecodingLayer can decode
44func (msg *MeBasePacket) CanDecode() gopacket.LayerClass {
45 return msg.MsgLayerType
46}
47
48// LayerType returns MsgLayerType. It partially satisfies Layer and SerializableLayer
49func (msg *MeBasePacket) LayerType() gopacket.LayerType {
50 return msg.MsgLayerType
51}
52
53// LayerContents returns the bytes of the packet layer.
54func (msg *MeBasePacket) LayerContents() []byte {
55 return msg.Contents
56}
57
58// LayerPayload returns the bytes contained within the packet layer
59func (msg *MeBasePacket) LayerPayload() []byte {
60 return msg.Payload
61}
62
63// NextLayerType returns the layer type contained by this DecodingLayer
64func (msg *MeBasePacket) NextLayerType() gopacket.LayerType {
65 return gopacket.LayerTypeZero
66}
67
68// DecodeFromBytes decodes the given bytes into this layer
mpagenkobf67a092021-03-17 09:52:28 +000069func (msg *MeBasePacket) DecodeFromBytes(data []byte, p gopacket.PacketBuilder, contentSize int) error {
Holger Hildebrandtfa074992020-03-27 15:42:06 +000070 // Note: Base OMCI frame already checked for frame with at least 10 octets
71 msg.EntityClass = me.ClassID(binary.BigEndian.Uint16(data[0:]))
72 msg.EntityInstance = binary.BigEndian.Uint16(data[2:])
mpagenkobf67a092021-03-17 09:52:28 +000073 msg.BaseLayer = layers.BaseLayer{Contents: data[:contentSize], Payload: data[contentSize:]}
Holger Hildebrandtfa074992020-03-27 15:42:06 +000074 return nil
75}
76
77// SerializeTo provides serialization of this message layer
78func (msg *MeBasePacket) SerializeTo(b gopacket.SerializeBuffer) error {
79 // Add class ID and entity ID
80 bytes, err := b.PrependBytes(4)
81 if err != nil {
82 return err
83 }
84 binary.BigEndian.PutUint16(bytes, uint16(msg.EntityClass))
85 binary.BigEndian.PutUint16(bytes[2:], msg.EntityInstance)
86 return nil
87}
88
89type layerDecodingLayer interface {
90 gopacket.Layer
91 DecodeFromBytes([]byte, gopacket.PacketBuilder) error
92 NextLayerType() gopacket.LayerType
93}
94
95func decodingLayerDecoder(d layerDecodingLayer, data []byte, p gopacket.PacketBuilder) error {
96 err := d.DecodeFromBytes(data, p)
97 if err != nil {
98 return err
99 }
100 p.AddLayer(d)
101 next := d.NextLayerType()
102 if next == gopacket.LayerTypeZero {
103 return nil
104 }
105 return p.NextDecoder(next)
106}