Import of https://github.com/cboling/omci at commit 7495182a09db38a9b6454a4a457fdd111c1618ac

Change-Id: I3250449080300b21b9d81c64dcc33f98f2e4cd1b
diff --git a/generated/medef.go b/generated/medef.go
new file mode 100644
index 0000000..402f23d
--- /dev/null
+++ b/generated/medef.go
@@ -0,0 +1,177 @@
+/*
+ * Copyright (c) 2018 - present.  Boling Consulting Solutions (bcsw.net)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/*
+ * NOTE: This file was generated, manual edits will be overwritten!
+ *
+ * Generated by 'goCodeGenerator.py':
+ *              https://github.com/cboling/OMCI-parser/README.md
+ */
+
+package generated
+
+import (
+	"errors"
+	"fmt"
+	"github.com/deckarep/golang-set"
+	"github.com/google/gopacket"
+	"math/bits"
+)
+
+// ManagedEntityDefinition defines a Manage Entity
+type ManagedEntityDefinition struct {
+	Name         string
+	ClassID      ClassID
+	MessageTypes mapset.Set // Mandatory
+	// TODO: Support Optional Message types  (this has just been fixed in the code generator)
+	AllowedAttributeMask uint16
+	AttributeDefinitions AttributeDefinitionMap
+	Access               ClassAccess
+	Support              ClassSupport
+}
+
+func (bme *ManagedEntityDefinition) String() string {
+	return fmt.Sprintf("Definition: %s: CID: %v, Attributes: %v",
+		bme.Name, bme.ClassID, bme.AttributeDefinitions)
+}
+
+// GetName retrieves the name of a managed entity from a ME Definition
+func (bme ManagedEntityDefinition) GetName() string {
+	return bme.Name
+}
+
+// GetClassID retrieves the 16-bit class ID of a managed entity from a ME Definition
+func (bme ManagedEntityDefinition) GetClassID() ClassID {
+	return bme.ClassID
+}
+
+// GetMessageTypes retrieves the OMCI Message Types supporte3d by a managed entity from a ME Definition
+func (bme ManagedEntityDefinition) GetMessageTypes() mapset.Set {
+	return bme.MessageTypes
+}
+
+// GetAllowedAttributeMask retrieves the allowed/valid 16-bit attribute mask of a managed entity
+// from a ME Definition
+func (bme ManagedEntityDefinition) GetAllowedAttributeMask() uint16 {
+	return bme.AllowedAttributeMask
+}
+
+// GetAttributeDefinitions retrieves the attribute definitions of a managed entity from a ME Definition
+func (bme ManagedEntityDefinition) GetAttributeDefinitions() AttributeDefinitionMap {
+	return bme.AttributeDefinitions
+}
+
+func (bme ManagedEntityDefinition) DecodeAttributes(mask uint16, data []byte, p gopacket.PacketBuilder, msgType byte) (AttributeValueMap, error) {
+	if (mask | bme.GetAllowedAttributeMask()) != bme.GetAllowedAttributeMask() {
+		// TODO: Provide custom error code so a response 'result' can properly be coded
+		return nil, errors.New("unsupported attribute mask")
+	}
+	keyList := GetAttributeDefinitionMapKeys(bme.AttributeDefinitions)
+
+	attrMap := make(AttributeValueMap, bits.OnesCount16(mask))
+	for _, index := range keyList {
+		if index == 0 {
+			continue // Skip Entity ID
+		}
+		attrDef := bme.AttributeDefinitions[index]
+		name := attrDef.GetName()
+
+		if mask&attrDef.Mask != 0 {
+			value, err := attrDef.Decode(data, p, msgType)
+			if err != nil {
+				return nil, err
+			}
+			if attrDef.IsTableAttribute() {
+				switch msgType {
+				default:
+					return nil, fmt.Errorf("unsupported Message Type '%v' for table serialization", msgType)
+
+				case byte(Get) | AK: // Get Response
+					attrMap[name] = value
+					data = data[4:]
+
+				case byte(GetNext) | AK: // Get Next Response
+					// Value is a partial octet buffer we need to collect and at
+					// the end (last segment) pull it up into more appropriate table
+					// rows
+					valueBuffer, ok := value.([]byte)
+					if !ok {
+						panic("unexpected type already returned as get-next-response attribute data")
+					}
+					if existing, found := attrMap[name]; found {
+						prev, ok := existing.([]byte)
+						if !ok {
+							panic("unexpected type already in attribute value map")
+						}
+						attrMap[name] = append(prev, valueBuffer...)
+					} else {
+						attrMap[name] = valueBuffer
+					}
+					if size := attrDef.GetSize(); size != 0 && size > len(valueBuffer) {
+						panic("unexpected size difference")
+					}
+					data = data[len(valueBuffer):]
+
+				case byte(Set) | AR: // Set Request
+					fmt.Println("TODO")
+
+				case byte(SetTable) | AR: // Set Table Request
+					// TODO: Only baseline supported at this time
+					return nil, errors.New("attribute encode for set-table-request not yet supported")
+				}
+			} else {
+				attrMap[name] = value
+				data = data[attrDef.GetSize():]
+			}
+		}
+	}
+	return attrMap, nil
+}
+
+func (bme ManagedEntityDefinition) SerializeAttributes(attr AttributeValueMap, mask uint16,
+	b gopacket.SerializeBuffer, msgType byte, bytesAvailable int, packData bool) (error, uint16) {
+
+	if (mask | bme.GetAllowedAttributeMask()) != bme.GetAllowedAttributeMask() {
+		// TODO: Provide custom error code so a response 'result' can properly be coded
+		return errors.New("unsupported attribute mask"), 0
+	}
+	// TODO: Need to limit number of bytes appended to not exceed packet size
+	// Is there space/metadata info in 'b' parameter to allow this?
+	keyList := GetAttributeDefinitionMapKeys(bme.AttributeDefinitions)
+	var failedMask uint16
+
+	for _, index := range keyList {
+		if index == 0 {
+			continue // Skip Entity ID
+		}
+		attrDef := bme.AttributeDefinitions[index]
+
+		if mask&attrDef.Mask != 0 {
+			value, ok := attr[attrDef.GetName()]
+			if !ok {
+				msg := fmt.Sprintf("attribute not found: '%v'", attrDef.GetName())
+				return errors.New(msg), failedMask
+			}
+			size, err := attrDef.SerializeTo(value, b, msgType, bytesAvailable)
+			if err != nil {
+				failedMask |= attrDef.Mask
+				if packData {
+					continue
+				}
+				return err, failedMask
+			}
+			bytesAvailable -= size
+		}
+	}
+	return nil, failedMask
+}