blob: 8924e7db499a3510f233340e885c190025e329a4 [file] [log] [blame]
/*
* Copyright (c) 2018 - present. Boling Consulting Solutions (bcsw.net)
* Copyright 2020-present Open Networking Foundation
* 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 (
"fmt"
"github.com/deckarep/golang-set"
"github.com/google/gopacket"
)
// MsgType represents a OMCI message-type
type MsgType byte
// MsgType represents the status field in a OMCI Response frame
type Results byte
// AttributeAccess represents the access allowed to an Attribute. Some MEs
// are instantiated by the ONU autonomously. Others are instantiated on
// explicit request of the OLT via a create command, and a few ME types may
// be instantiated in either way, depending on the ONU architecture or
// circumstances.
//
// Attributes of an ME that is auto-instantiated by the ONU can be read (R),
// write (W), or read, write (R, W). On the other hand, attributes of a ME
// that is instantiated by the OLT can be either (R), (W), (R, W),
// (R, set by create) or (R, W, set by create).
type AttributeAccess byte
// ClassID is a 16-bit value that uniquely defines a Managed Entity clas
// from the ITU-T G.988 specification.
type ClassID uint16
// AlarmMap is a mapping of alarm bit numbers to alarm names and can be
// used during decode of Alarm Notification messages
type AlarmMap map[uint8]string
func (cid ClassID) String() string {
if entity, err := LoadManagedEntityDefinition(cid); err.StatusCode() == Success {
return fmt.Sprintf("[%s] (%d/%#x)",
entity.GetManagedEntityDefinition().GetName(), uint16(cid), uint16(cid))
}
return fmt.Sprintf("unknown ClassID: %d (%#x)", uint16(cid), uint16(cid))
}
const (
// AK (Bit 6), indicates whether this message is an AK to an action request.
// If a message is an AK, this bit is set to 1. If the message is not a
// response to a command, this bit is set to 0. In messages sent by the OLT,
// this bit is always 0.
AK byte = 0x20
// AR (Bit 7), acknowledge request, indicates whether the message requires an
// AK. An AK is a response to an action request, not a link layer handshake.
// If an AK is expected, this bit is set to 1. If no AK is expected, this bit
// is 0. In messages sent by the ONU, this bit is always 0
AR byte = 0x40
// MsgTypeMask provides a mask to get the base message type
MsgTypeMask = 0x1F
)
const (
// Message Types
Create MsgType = 4
Delete MsgType = 6
Set MsgType = 8
Get MsgType = 9
GetAllAlarms MsgType = 11
GetAllAlarmsNext MsgType = 12
MibUpload MsgType = 13
MibUploadNext MsgType = 14
MibReset MsgType = 15
AlarmNotification MsgType = 16
AttributeValueChange MsgType = 17
Test MsgType = 18
StartSoftwareDownload MsgType = 19
DownloadSection MsgType = 20
EndSoftwareDownload MsgType = 21
ActivateSoftware MsgType = 22
CommitSoftware MsgType = 23
SynchronizeTime MsgType = 24
Reboot MsgType = 25
GetNext MsgType = 26
TestResult MsgType = 27
GetCurrentData MsgType = 28
SetTable MsgType = 29 // Defined in Extended Message Set Only
)
func (mt MsgType) String() string {
switch mt {
default:
return "Unknown"
case Create:
return "Create"
case Delete:
return "Delete"
case Set:
return "Set"
case Get:
return "Get"
case GetAllAlarms:
return "Get All Alarms"
case GetAllAlarmsNext:
return "Get All Alarms Next"
case MibUpload:
return "MIB Upload"
case MibUploadNext:
return "MIB Upload Next"
case MibReset:
return "MIB Reset"
case AlarmNotification:
return "Alarm Notification"
case AttributeValueChange:
return "Attribute Value Change"
case Test:
return "Test"
case StartSoftwareDownload:
return "Start Software Download"
case DownloadSection:
return "Download Section"
case EndSoftwareDownload:
return "EndSoftware Download"
case ActivateSoftware:
return "Activate Software"
case CommitSoftware:
return "Commit Software"
case SynchronizeTime:
return "Synchronize Time"
case Reboot:
return "Reboot"
case GetNext:
return "Get Next"
case TestResult:
return "Test Result"
case GetCurrentData:
return "Get Current Data"
case SetTable:
return "Set Table"
}
}
var allNotificationTypes = [...]MsgType{
AlarmNotification,
AttributeValueChange,
TestResult,
}
// SupportsMsgType returns true if the managed entity supports the desired
// Message Type / action
func SupportsMsgType(entity IManagedEntityDefinition, msgType MsgType) bool {
return entity.GetMessageTypes().Contains(msgType)
}
func IsAutonomousNotification(mt MsgType) bool {
for _, m := range allNotificationTypes {
if mt == m {
return true
}
}
return false
}
const (
// Response status codes
Success Results = 0 // command processed successfully
ProcessingError Results = 1 // command processing error
NotSupported Results = 2 // command not supported
ParameterError Results = 3 // parameter error
UnknownEntity Results = 4 // unknown managed entity
UnknownInstance Results = 5 // unknown managed entity instance
DeviceBusy Results = 6 // device busy
InstanceExists Results = 7 // instance exists
AttributeFailure Results = 9 // Attribute(s) failed or unknown
)
func (rc Results) String() string {
switch rc {
default:
return "Unknown"
case Success:
return "Success"
case ProcessingError:
return "Processing Error"
case NotSupported:
return "Not Supported"
case ParameterError:
return "Parameter Error"
case UnknownEntity:
return "Unknown Entity"
case UnknownInstance:
return "Unknown Instance"
case DeviceBusy:
return "Device Busy"
case InstanceExists:
return "Instance Exists"
case AttributeFailure:
return "Attribute Failure"
}
}
const (
// Access allowed on a Managed Entity attribute
Read AttributeAccess = 1 << iota
Write
SetByCreate
)
func (access AttributeAccess) String() string {
switch access {
default:
return "Unknown"
case Read:
return "Read"
case Write:
return "Write"
case SetByCreate:
return "SetByCreate"
case Read | Write:
return "Read/Write"
case Read | SetByCreate:
return "Read/SetByCreate"
case Write | SetByCreate:
return "Write/SetByCreate"
case Read | Write | SetByCreate:
return "Read/Write/SetByCreate"
}
}
// SupportsAttributeAccess returns true if the managed entity attribute
// supports the desired access
func SupportsAttributeAccess(attr AttributeDefinition, acc AttributeAccess) bool {
return attr.GetAccess().Contains(acc)
}
type IManagedEntityDefinition interface {
GetName() string
GetClassID() ClassID
GetMessageTypes() mapset.Set
GetAllowedAttributeMask() uint16
GetAttributeDefinitions() AttributeDefinitionMap
GetAlarmMap() AlarmMap
DecodeAttributes(uint16, []byte, gopacket.PacketBuilder, byte) (AttributeValueMap, error)
SerializeAttributes(AttributeValueMap, uint16, gopacket.SerializeBuffer, byte, int, bool) (error, uint16)
}
type IManagedEntity interface {
IManagedEntityDefinition
GetManagedEntityDefinition() IManagedEntityDefinition
GetEntityID() uint16
SetEntityID(uint16) error
GetAttributeMask() uint16
GetAttributeValueMap() AttributeValueMap
GetAttribute(string) (interface{}, error)
GetAttributeByIndex(uint) (interface{}, error)
SetAttribute(string, interface{}) error
SetAttributeByIndex(uint, interface{}) error
DeleteAttribute(string) error
DeleteAttributeByIndex(uint) error
}