blob: 4e91db665de61dcf2dcff7530cdf20e9f9ee9fb1 [file] [log] [blame]
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -07001/*
2 * Copyright (c) 2018 - present. Boling Consulting Solutions (bcsw.net)
Matteo Scandolof9d43412021-01-12 11:11:34 -08003 * Copyright 2020-present Open Networking Foundation
4
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -07005 * 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
Matteo Scandolof9d43412021-01-12 11:11:34 -08008
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -07009 * http://www.apache.org/licenses/LICENSE-2.0
Matteo Scandolof9d43412021-01-12 11:11:34 -080010
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -070011 * 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/*
18 * NOTE: This file was generated, manual edits will be overwritten!
19 *
20 * Generated by 'goCodeGenerator.py':
21 * https://github.com/cboling/OMCI-parser/README.md
22 */
Matteo Scandolof9d43412021-01-12 11:11:34 -080023
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -070024package generated
25
26import (
27 "errors"
28 "fmt"
29 "github.com/deckarep/golang-set"
30 "github.com/google/gopacket"
31 "math/bits"
32)
33
Matteo Scandolof9d43412021-01-12 11:11:34 -080034// ManagedEntityDefinition defines a Manage Entity
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -070035type ManagedEntityDefinition struct {
Matteo Scandolof9d43412021-01-12 11:11:34 -080036 Name string
37 ClassID ClassID
38 MessageTypes mapset.Set // Mandatory
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -070039 AllowedAttributeMask uint16
40 AttributeDefinitions AttributeDefinitionMap
Matteo Scandolof9d43412021-01-12 11:11:34 -080041 Access ClassAccess
42 Support ClassSupport
43 Alarms AlarmMap // AlarmBit -> AlarmName
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -070044}
45
46func (bme *ManagedEntityDefinition) String() string {
47 return fmt.Sprintf("Definition: %s: CID: %v, Attributes: %v",
48 bme.Name, bme.ClassID, bme.AttributeDefinitions)
49}
50
Matteo Scandolof9d43412021-01-12 11:11:34 -080051// GetName retrieves the name of a managed entity from a ME Definition
52func (bme ManagedEntityDefinition) GetName() string {
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -070053 return bme.Name
54}
Matteo Scandolof9d43412021-01-12 11:11:34 -080055
56// GetClassID retrieves the 16-bit class ID of a managed entity from a ME Definition
57func (bme ManagedEntityDefinition) GetClassID() ClassID {
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -070058 return bme.ClassID
59}
Matteo Scandolof9d43412021-01-12 11:11:34 -080060
61// SetClassID assigns the 16-bit class ID of a managed entity from a ME Definition
62func (bme *ManagedEntityDefinition) SetClassID(classID ClassID) {
63 bme.ClassID = classID
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -070064}
65
Matteo Scandolof9d43412021-01-12 11:11:34 -080066// GetMessageTypes retrieves the OMCI Message Types supporte3d by a managed entity from a ME Definition
67func (bme ManagedEntityDefinition) GetMessageTypes() mapset.Set {
68 return bme.MessageTypes
69}
70
71// GetAllowedAttributeMask retrieves the allowed/valid 16-bit attribute mask of a managed entity
72// from a ME Definition
73func (bme ManagedEntityDefinition) GetAllowedAttributeMask() uint16 {
74 return bme.AllowedAttributeMask
75}
76
77// GetAttributeDefinitions retrieves the attribute definitions of a managed entity from a ME Definition
78func (bme ManagedEntityDefinition) GetAttributeDefinitions() AttributeDefinitionMap {
79 return bme.AttributeDefinitions
80}
81
82// GetClassSupport returns ONUs support of this class
83func (bme ManagedEntityDefinition) GetClassSupport() ClassSupport {
84 return bme.Support
85}
86
87// GetAlarmMap returns the Alarm bit number to name map
88func (bme ManagedEntityDefinition) GetAlarmMap() AlarmMap {
89 return bme.Alarms
90}
91
92func (bme ManagedEntityDefinition) DecodeAttributes(mask uint16, data []byte, p gopacket.PacketBuilder, msgType byte) (AttributeValueMap, error) {
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -070093 if (mask | bme.GetAllowedAttributeMask()) != bme.GetAllowedAttributeMask() {
94 // TODO: Provide custom error code so a response 'result' can properly be coded
95 return nil, errors.New("unsupported attribute mask")
96 }
97 keyList := GetAttributeDefinitionMapKeys(bme.AttributeDefinitions)
98
99 attrMap := make(AttributeValueMap, bits.OnesCount16(mask))
100 for _, index := range keyList {
101 if index == 0 {
102 continue // Skip Entity ID
103 }
104 attrDef := bme.AttributeDefinitions[index]
105 name := attrDef.GetName()
106
Matteo Scandolof9d43412021-01-12 11:11:34 -0800107 if mask&attrDef.Mask != 0 {
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -0700108 value, err := attrDef.Decode(data, p, msgType)
109 if err != nil {
110 return nil, err
111 }
112 if attrDef.IsTableAttribute() {
113 switch msgType {
114 default:
Matteo Scandolof9d43412021-01-12 11:11:34 -0800115 return nil, fmt.Errorf("unsupported Message Type '%v' for table serialization", msgType)
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -0700116
117 case byte(Get) | AK: // Get Response
118 attrMap[name] = value
119 data = data[4:]
120
121 case byte(GetNext) | AK: // Get Next Response
122 // Value is a partial octet buffer we need to collect and at
123 // the end (last segment) pull it up into more appropriate table
124 // rows
125 valueBuffer, ok := value.([]byte)
126 if !ok {
127 panic("unexpected type already returned as get-next-response attribute data")
128 }
129 if existing, found := attrMap[name]; found {
130 prev, ok := existing.([]byte)
131 if !ok {
132 panic("unexpected type already in attribute value map")
133 }
134 attrMap[name] = append(prev, valueBuffer...)
135 } else {
136 attrMap[name] = valueBuffer
137 }
138 if size := attrDef.GetSize(); size != 0 && size > len(valueBuffer) {
139 panic("unexpected size difference")
140 }
141 data = data[len(valueBuffer):]
142
143 case byte(Set) | AR: // Set Request
Girish Gowdra161d27a2021-05-05 12:01:44 -0700144 // TODO: No support at this time
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -0700145
146 case byte(SetTable) | AR: // Set Table Request
147 // TODO: Only baseline supported at this time
148 return nil, errors.New("attribute encode for set-table-request not yet supported")
149 }
150 } else {
151 attrMap[name] = value
152 data = data[attrDef.GetSize():]
153 }
154 }
155 }
156 return attrMap, nil
157}
158
Matteo Scandolof9d43412021-01-12 11:11:34 -0800159func (bme ManagedEntityDefinition) SerializeAttributes(attr AttributeValueMap, mask uint16,
160 b gopacket.SerializeBuffer, msgType byte, bytesAvailable int, packData bool) (error, uint16) {
161
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -0700162 if (mask | bme.GetAllowedAttributeMask()) != bme.GetAllowedAttributeMask() {
163 // TODO: Provide custom error code so a response 'result' can properly be coded
Matteo Scandolof9d43412021-01-12 11:11:34 -0800164 return errors.New("unsupported attribute mask"), 0
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -0700165 }
166 // TODO: Need to limit number of bytes appended to not exceed packet size
167 // Is there space/metadata info in 'b' parameter to allow this?
168 keyList := GetAttributeDefinitionMapKeys(bme.AttributeDefinitions)
Matteo Scandolof9d43412021-01-12 11:11:34 -0800169 var failedMask uint16
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -0700170
171 for _, index := range keyList {
172 if index == 0 {
173 continue // Skip Entity ID
174 }
175 attrDef := bme.AttributeDefinitions[index]
176
Matteo Scandolof9d43412021-01-12 11:11:34 -0800177 if mask&attrDef.Mask != 0 {
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -0700178 value, ok := attr[attrDef.GetName()]
179 if !ok {
180 msg := fmt.Sprintf("attribute not found: '%v'", attrDef.GetName())
Matteo Scandolof9d43412021-01-12 11:11:34 -0800181 return errors.New(msg), failedMask
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -0700182 }
183 size, err := attrDef.SerializeTo(value, b, msgType, bytesAvailable)
184 if err != nil {
Matteo Scandolof9d43412021-01-12 11:11:34 -0800185 failedMask |= attrDef.Mask
186 if packData {
187 continue
188 }
189 return err, failedMask
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -0700190 }
191 bytesAvailable -= size
192 }
193 }
Matteo Scandolof9d43412021-01-12 11:11:34 -0800194 return nil, failedMask
Matteo Scandoloa6a3aee2019-11-26 13:30:14 -0700195}