blob: e72093bc84369566df50affcfdaedfe53a7101f7 [file] [log] [blame]
/*
* Copyright 2018-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 devices
import (
"math/rand"
"strconv"
"time"
"github.com/looplab/fsm"
"github.com/opencord/bbsim/internal/common"
"github.com/opencord/voltha-protos/v2/go/openolt"
)
type mode int
// Constants for Controlled Activation modes
const (
Default mode = iota
OnlyONU
OnlyPON
Both
)
// ControlledActivationModes maps string to int value of mode
var ControlledActivationModes = map[string]mode{
"default": Default,
"only-onu": OnlyONU,
"only-pon": OnlyPON,
"both": Both,
}
var newFSM = fsm.NewFSM
func getOperStateFSM(cb fsm.Callback) *fsm.FSM {
return newFSM(
"down",
fsm.Events{
{Name: "enable", Src: []string{"down"}, Dst: "up"},
{Name: "disable", Src: []string{"up"}, Dst: "down"},
},
fsm.Callbacks{
"enter_state": func(e *fsm.Event) {
cb(e)
},
},
)
}
// deprecated
func onuSnToString(sn *openolt.SerialNumber) string {
s := string(sn.VendorId)
for _, i := range sn.VendorSpecific {
s = s + strconv.FormatInt(int64(i/16), 16) + strconv.FormatInt(int64(i%16), 16)
}
return s
}
func publishEvent(eventType string, intfID int32, onuID int32, onuSerial string) {
if olt.PublishEvents {
currentTime := time.Now()
event := common.Event{
EventType: eventType,
OltID: olt.ID,
IntfID: intfID,
OnuID: onuID,
OnuSerial: onuSerial,
Timestamp: currentTime.Format("2006-01-02 15:04:05.000000000"),
EpochTime: currentTime.UnixNano() / 1000000,
}
olt.EventChannel <- event
}
}
func getPortStats(packetCount uint64, incrementStat bool) (*openolt.PortStatistics, uint64) {
// increment current packet count by random number
if incrementStat {
packetCount = packetCount + uint64(rand.Intn(50)+1*10)
}
// fill all other stats based on packet count
portStats := &openolt.PortStatistics{
RxBytes: packetCount * 64,
RxPackets: packetCount,
RxUcastPackets: packetCount * 40 / 100,
RxMcastPackets: packetCount * 30 / 100,
RxBcastPackets: packetCount * 30 / 100,
RxErrorPackets: 0,
TxBytes: packetCount * 64,
TxPackets: packetCount,
TxUcastPackets: packetCount * 40 / 100,
TxMcastPackets: packetCount * 30 / 100,
TxBcastPackets: packetCount * 30 / 100,
TxErrorPackets: 0,
RxCrcErrors: 0,
BipErrors: 0,
Timestamp: uint32(time.Now().Unix()),
}
return portStats, packetCount
}
// InterfaceIDToPortNo converts InterfaceID to voltha PortID
// Refer openolt adapter code(master) voltha-openolt-adapter/adaptercore/olt_platform.go: IntfIDToPortNo()
func InterfaceIDToPortNo(intfID uint32, intfType string) uint32 {
// Converts interface-id to port-numbers that can be understood by the VOLTHA
if intfType == "nni" {
// nni at voltha starts with 1,048,576
// nni = 1,048,576 + InterfaceID
return 0x1<<20 + intfID
} else if intfType == "pon" {
// pon = 536,870,912 + InterfaceID
return (0x2 << 28) + intfID
}
return 0
}