blob: 0c2329d9425c159d134362c4c03da8b92108477b [file] [log] [blame]
/*
* 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.
*/
package core
import (
"encoding/binary"
)
type Onu2GAttributes int
const (
_ = iota
EquipmentID Onu2GAttributes = 0x8000
OmccVersion Onu2GAttributes = 0x4000
VendorProductCode Onu2GAttributes = 0x2000
SecurityCapability Onu2GAttributes = 0x1000
SecurityMode Onu2GAttributes = 0x0800
TotalPriorityQueueNumber Onu2GAttributes = 0x0400
TotalTrafficSchedulerNumber Onu2GAttributes = 0x0200
Mode Onu2GAttributes = 0x0100
TotalGemPortIDNumber Onu2GAttributes = 0x0080
SysUptime Onu2GAttributes = 0x0040
ConnectivityCapability Onu2GAttributes = 0x0020
CurrentConnectivityMode Onu2GAttributes = 0x0010
QosConfigurationFlexibility Onu2GAttributes = 0x0008
PriorityQueueScaleFactor Onu2GAttributes = 0x0004
)
type Onu2GAttributeHandler func(*uint, []byte) ([]byte, error)
var Onu2GAttributeHandlers = map[Onu2GAttributes]Onu2GAttributeHandler{
EquipmentID: GetEquipmentID,
OmccVersion: GetOmccVersion,
VendorProductCode: GetVendorProductCode,
SecurityCapability: GetSecurityCapability,
SecurityMode: GetSecurityMode,
TotalPriorityQueueNumber: GetTotalPriorityQueueNumber,
TotalTrafficSchedulerNumber: GetTotalTrafficSchedulerNumber,
Mode: GetMode,
TotalGemPortIDNumber: GetTotalGemPortIDNumber,
SysUptime: GetSysUptime,
ConnectivityCapability: GetConnectivityCapability,
CurrentConnectivityMode: GetCurrentConnectivityMode,
QosConfigurationFlexibility: GetQosConfigurationFlexibility,
PriorityQueueScaleFactor: GetPriorityQueueScaleFactor,
}
func GetOnu2GAttributes(pos *uint, pkt []byte, content OmciContent) ([]byte, error) {
AttributesMask := getAttributeMask(content)
for index := uint(16); index >= 1; index-- {
Attribute := 1 << (index - 1)
reqAttribute := Attribute & AttributesMask
if reqAttribute != 0 {
pkt, _ = Onu2GAttributeHandlers[Onu2GAttributes(reqAttribute)](pos, pkt)
}
}
pkt[8] = 0x00 // Command Processed Successfully
pkt[9] = uint8(AttributesMask >> 8)
pkt[10] = uint8(AttributesMask & 0x00FF)
return pkt, nil
}
func GetEquipmentID(pos *uint, pkt []byte) ([]byte, error) {
// 20 bytes
equipid := []byte("12345123451234512345")
for _, ch := range equipid {
pkt[*pos] = ch
*pos++
}
return pkt, nil
}
func GetOmccVersion(pos *uint, pkt []byte) ([]byte, error) {
// 1 bytes
pkt[*pos] = 0xB4
*pos++
return pkt, nil
}
func GetVendorProductCode(pos *uint, pkt []byte) ([]byte, error) {
// 2 bytes
prodcode := []byte{0x00, 0x00}
for _, ch := range prodcode {
pkt[*pos] = ch
*pos++
}
return pkt, nil
}
func GetSecurityCapability(pos *uint, pkt []byte) ([]byte, error) {
// 1 byte
pkt[*pos] = 0x01
*pos++
return pkt, nil
}
func GetSecurityMode(pos *uint, pkt []byte) ([]byte, error) {
// 1 byte
pkt[*pos] = 0x01
*pos++
return pkt, nil
}
func GetTotalPriorityQueueNumber(pos *uint, pkt []byte) ([]byte, error) {
// 2 bytes
// report 0 queues because thats what BRCM does...
numqueues := 0
bs := make([]byte, 2)
binary.BigEndian.PutUint16(bs, uint16(numqueues))
for _, ch := range bs {
pkt[*pos] = ch
*pos++
}
return pkt, nil
}
func GetTotalTrafficSchedulerNumber(pos *uint, pkt []byte) ([]byte, error) {
// 1 byte
pkt[*pos] = 0x00
*pos++
return pkt, nil
}
func GetMode(pos *uint, pkt []byte) ([]byte, error) {
// 1 byte
pkt[*pos] = 0x01
*pos++
return pkt, nil
}
func GetTotalGemPortIDNumber(pos *uint, pkt []byte) ([]byte, error) {
// 2 bytes
gemports := 32
bs := make([]byte, 2)
binary.BigEndian.PutUint16(bs, uint16(gemports))
for _, ch := range bs {
pkt[*pos] = ch
*pos++
}
return pkt, nil
}
func GetSysUptime(pos *uint, pkt []byte) ([]byte, error) {
// 4 byte int
uptime := 0
bs := make([]byte, 4)
binary.BigEndian.PutUint32(bs, uint32(uptime))
for _, ch := range bs {
pkt[*pos] = ch
*pos++
}
return pkt, nil
}
func GetConnectivityCapability(pos *uint, pkt []byte) ([]byte, error) {
// 2 bytes
caps := []byte{0x00, 0x7F}
for _, ch := range caps {
pkt[*pos] = ch
*pos++
}
return pkt, nil
}
func GetCurrentConnectivityMode(pos *uint, pkt []byte) ([]byte, error) {
// 1 byte
pkt[*pos] = 0x00
*pos++
return pkt, nil
}
func GetQosConfigurationFlexibility(pos *uint, pkt []byte) ([]byte, error) {
// 2 bytes
qosconf := []byte{0x00, 0x30}
for _, ch := range qosconf {
pkt[*pos] = ch
*pos++
}
return pkt, nil
}
func GetPriorityQueueScaleFactor(pos *uint, pkt []byte) ([]byte, error) {
// 1 bytes
pkt[*pos] = 0x01
*pos++
return pkt, nil
}