blob: a2bd2da027cecdb7789e6151bf63f90e59833e16 [file] [log] [blame]
Takahiro Suzuki241c10e2020-12-17 20:17:57 +09001/*
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 /*
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 */
23
24package generated
25
26import (
27 "errors"
28 "fmt"
29 "github.com/deckarep/golang-set"
30 "github.com/google/gopacket"
31 "math/bits"
32)
33
34// ManagedEntityDefinition defines a Manage Entity
35type ManagedEntityDefinition struct {
36 Name string
37 ClassID ClassID
38 MessageTypes mapset.Set // Mandatory
39 // TODO: Support Optional Message types (this has just been fixed in the code generator)
40 AllowedAttributeMask uint16
41 AttributeDefinitions AttributeDefinitionMap
42 Access ClassAccess
43 Support ClassSupport
44}
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
51// GetName retrieves the name of a managed entity from a ME Definition
52func (bme ManagedEntityDefinition) GetName() string {
53 return bme.Name
54}
55
56// GetClassID retrieves the 16-bit class ID of a managed entity from a ME Definition
57func (bme ManagedEntityDefinition) GetClassID() ClassID {
58 return bme.ClassID
59}
60
61// GetMessageTypes retrieves the OMCI Message Types supporte3d by a managed entity from a ME Definition
62func (bme ManagedEntityDefinition) GetMessageTypes() mapset.Set {
63 return bme.MessageTypes
64}
65
66// GetAllowedAttributeMask retrieves the allowed/valid 16-bit attribute mask of a managed entity
67// from a ME Definition
68func (bme ManagedEntityDefinition) GetAllowedAttributeMask() uint16 {
69 return bme.AllowedAttributeMask
70}
71
72// GetAttributeDefinitions retrieves the attribute definitions of a managed entity from a ME Definition
73func (bme ManagedEntityDefinition) GetAttributeDefinitions() AttributeDefinitionMap {
74 return bme.AttributeDefinitions
75}
76
77func (bme ManagedEntityDefinition) DecodeAttributes(mask uint16, data []byte, p gopacket.PacketBuilder, msgType byte) (AttributeValueMap, error) {
78 if (mask | bme.GetAllowedAttributeMask()) != bme.GetAllowedAttributeMask() {
79 // TODO: Provide custom error code so a response 'result' can properly be coded
80 return nil, errors.New("unsupported attribute mask")
81 }
82 keyList := GetAttributeDefinitionMapKeys(bme.AttributeDefinitions)
83
84 attrMap := make(AttributeValueMap, bits.OnesCount16(mask))
85 for _, index := range keyList {
86 if index == 0 {
87 continue // Skip Entity ID
88 }
89 attrDef := bme.AttributeDefinitions[index]
90 name := attrDef.GetName()
91
92 if mask&attrDef.Mask != 0 {
93 value, err := attrDef.Decode(data, p, msgType)
94 if err != nil {
95 return nil, err
96 }
97 if attrDef.IsTableAttribute() {
98 switch msgType {
99 default:
100 return nil, fmt.Errorf("unsupported Message Type '%v' for table serialization", msgType)
101
102 case byte(Get) | AK: // Get Response
103 attrMap[name] = value
104 data = data[4:]
105
106 case byte(GetNext) | AK: // Get Next Response
107 // Value is a partial octet buffer we need to collect and at
108 // the end (last segment) pull it up into more appropriate table
109 // rows
110 valueBuffer, ok := value.([]byte)
111 if !ok {
112 panic("unexpected type already returned as get-next-response attribute data")
113 }
114 if existing, found := attrMap[name]; found {
115 prev, ok := existing.([]byte)
116 if !ok {
117 panic("unexpected type already in attribute value map")
118 }
119 attrMap[name] = append(prev, valueBuffer...)
120 } else {
121 attrMap[name] = valueBuffer
122 }
123 if size := attrDef.GetSize(); size != 0 && size > len(valueBuffer) {
124 panic("unexpected size difference")
125 }
126 data = data[len(valueBuffer):]
127
128 case byte(Set) | AR: // Set Request
129 fmt.Println("TODO")
130
131 case byte(SetTable) | AR: // Set Table Request
132 // TODO: Only baseline supported at this time
133 return nil, errors.New("attribute encode for set-table-request not yet supported")
134 }
135 } else {
136 attrMap[name] = value
137 data = data[attrDef.GetSize():]
138 }
139 }
140 }
141 return attrMap, nil
142}
143
144func (bme ManagedEntityDefinition) SerializeAttributes(attr AttributeValueMap, mask uint16,
145 b gopacket.SerializeBuffer, msgType byte, bytesAvailable int, packData bool) (error, uint16) {
146
147 if (mask | bme.GetAllowedAttributeMask()) != bme.GetAllowedAttributeMask() {
148 // TODO: Provide custom error code so a response 'result' can properly be coded
149 return errors.New("unsupported attribute mask"), 0
150 }
151 // TODO: Need to limit number of bytes appended to not exceed packet size
152 // Is there space/metadata info in 'b' parameter to allow this?
153 keyList := GetAttributeDefinitionMapKeys(bme.AttributeDefinitions)
154 var failedMask uint16
155
156 for _, index := range keyList {
157 if index == 0 {
158 continue // Skip Entity ID
159 }
160 attrDef := bme.AttributeDefinitions[index]
161
162 if mask&attrDef.Mask != 0 {
163 value, ok := attr[attrDef.GetName()]
164 if !ok {
165 msg := fmt.Sprintf("attribute not found: '%v'", attrDef.GetName())
166 return errors.New(msg), failedMask
167 }
168 size, err := attrDef.SerializeTo(value, b, msgType, bytesAvailable)
169 if err != nil {
170 failedMask |= attrDef.Mask
171 if packData {
172 continue
173 }
174 return err, failedMask
175 }
176 bytesAvailable -= size
177 }
178 }
179 return nil, failedMask
180}