blob: e9e1585c10c5dfb8b7fb395bd7bb46cd31b9f41a [file] [log] [blame]
/*
* Copyright 2017-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 (
"github.com/opencord/voltha/ponsim/v2/common"
"github.com/opencord/voltha/protos/go/voltha"
"github.com/sirupsen/logrus"
)
/*
metricCounter holds details for a specific metric
*/
type metricCounter struct {
Name string
Value [2]int // [PON,NNI] values
Min int
Max int
}
/*
Create a new MetricCounter instance for TX packets
*/
func newTxMetricCounter(name txMetricCounterType, min int, max int) *metricCounter {
return &metricCounter{Name: name.String(), Min: min, Max: max}
}
/*
Create a new MetricCounter instance for RX packets
*/
func newRxMetricCounter(name rxMetricCounterType, min int, max int) *metricCounter {
return &metricCounter{Name: name.String(), Min: min, Max: max}
}
/*
Define TX constants
*/
type txMetricCounterType uint8
const (
tx_64_pkts txMetricCounterType = iota
tx_65_127_pkts
tx_128_255_pkts
tx_256_511_pkts
tx_512_1023_pkts
tx_1024_1518_pkts
tx_1519_9k_pkts
)
/*
TX packet constants string equivalents
*/
var txMetricCounterEnum = []string{
"tx_64_pkts",
"tx_65_127_pkts",
"tx_128_255_pkts",
"tx_256_511_pkts",
"tx_512_1023_pkts",
"tx_1024_1518_pkts",
"tx_1519_9k_pkts",
}
func (t txMetricCounterType) String() string {
return txMetricCounterEnum[t]
}
/*
Define RX constants
*/
type rxMetricCounterType uint8
const (
rx_64_pkts rxMetricCounterType = iota
rx_65_127_pkts
rx_128_255_pkts
rx_256_511_pkts
rx_512_1023_pkts
rx_1024_1518_pkts
rx_1519_9k_pkts
)
/*
RX packet constants string equivalents
*/
var rxMetricCounterEnum = []string{
"rx_64_pkts",
"rx_65_127_pkts",
"rx_128_255_pkts",
"rx_256_511_pkts",
"rx_512_1023_pkts",
"rx_1024_1518_pkts",
"rx_1519_9k_pkts",
}
func (t rxMetricCounterType) String() string {
return rxMetricCounterEnum[t]
}
/*
*/
type PonSimMetricCounter struct {
Name string
Device_Type string
TxCounters map[txMetricCounterType]*metricCounter
RxCounters map[rxMetricCounterType]*metricCounter
}
/*
NewPonSimMetricCounter instantiates new metric counters for a PON device
*/
func NewPonSimMetricCounter(name string, device_type string) *PonSimMetricCounter {
counter := &PonSimMetricCounter{Name: name, Device_Type: device_type}
counter.TxCounters = map[txMetricCounterType]*metricCounter{
tx_64_pkts: newTxMetricCounter(tx_64_pkts, 1, 64),
tx_65_127_pkts: newTxMetricCounter(tx_65_127_pkts, 65, 127),
tx_128_255_pkts: newTxMetricCounter(tx_128_255_pkts, 128, 255),
tx_256_511_pkts: newTxMetricCounter(tx_256_511_pkts, 256, 511),
tx_512_1023_pkts: newTxMetricCounter(tx_512_1023_pkts, 512, 1023),
tx_1024_1518_pkts: newTxMetricCounter(tx_1024_1518_pkts, 1024, 1518),
tx_1519_9k_pkts: newTxMetricCounter(tx_1519_9k_pkts, 1519, 9216),
}
counter.RxCounters = map[rxMetricCounterType]*metricCounter{
rx_64_pkts: newRxMetricCounter(rx_64_pkts, 1, 64),
rx_65_127_pkts: newRxMetricCounter(rx_65_127_pkts, 65, 127),
rx_128_255_pkts: newRxMetricCounter(rx_128_255_pkts, 128, 255),
rx_256_511_pkts: newRxMetricCounter(rx_256_511_pkts, 256, 511),
rx_512_1023_pkts: newRxMetricCounter(rx_512_1023_pkts, 512, 1023),
rx_1024_1518_pkts: newRxMetricCounter(rx_1024_1518_pkts, 1024, 1518),
rx_1519_9k_pkts: newRxMetricCounter(rx_1519_9k_pkts, 1519, 9216),
}
return counter
}
/*
CountRxFrame increments the receive count for a specific packet size metric
*/
func (mc *PonSimMetricCounter) CountRxFrame(port int, size int) {
for k, v := range mc.RxCounters {
if size >= v.Min && size <= v.Max {
mc.RxCounters[k].Value[port-1] += 1
}
}
}
/*
CountTxFrame increments the transmit count for a specific packet size metric
*/
func (mc *PonSimMetricCounter) CountTxFrame(port int, size int) {
for k, v := range mc.TxCounters {
if size >= v.Min && size <= v.Max {
mc.TxCounters[k].Value[port-1] += 1
}
}
}
/*
LogCounts logs the current counts for all RX/TX packets
*/
func (mc *PonSimMetricCounter) LogCounts() {
common.Logger().WithFields(logrus.Fields{
"counters": mc.RxCounters,
}).Info("RX Metrics")
common.Logger().WithFields(logrus.Fields{
"counters": mc.TxCounters,
}).Info("TX Metrics")
}
/*
MakeProto collects all RX/TX metrics with which it constructs a GRPC proto metrics structure
*/
func (mc *PonSimMetricCounter) MakeProto() *voltha.PonSimMetrics {
simMetrics := &voltha.PonSimMetrics{Device: mc.Name}
ponMetrics := &voltha.PonSimPortMetrics{PortName: "pon"}
portMetrics := &voltha.PonSimPortMetrics{}
if (mc.Device_Type == "ONU") {
portMetrics.PortName = "uni"
} else if (mc.Device_Type == "OLT") {
portMetrics.PortName = "nni"
} else {
common.Logger().WithFields(logrus.Fields{
"counters": mc.RxCounters,
}).Error("Unknown Device_Type in PonSimMetricCounter")
portMetrics.PortName = "unknown"
}
// Collect RX metrics
for _, c := range mc.RxCounters {
// PON values
ponMetrics.Packets = append(
ponMetrics.Packets,
&voltha.PonSimPacketCounter{
Name: c.Name,
Value: int64(c.Value[0]),
},
)
// NNI/UNI values
portMetrics.Packets = append(
portMetrics.Packets,
&voltha.PonSimPacketCounter{
Name: c.Name,
Value: int64(c.Value[1]),
},
)
}
// Collect TX metrics
for _, c := range mc.TxCounters {
// PON values
ponMetrics.Packets = append(
ponMetrics.Packets,
&voltha.PonSimPacketCounter{
Name: c.Name,
Value: int64(c.Value[0]),
},
)
// NNI/UNI values
portMetrics.Packets = append(
portMetrics.Packets,
&voltha.PonSimPacketCounter{
Name: c.Name,
Value: int64(c.Value[1]),
},
)
}
// Populate GRPC proto structure
simMetrics.Metrics = append(simMetrics.Metrics, ponMetrics)
simMetrics.Metrics = append(simMetrics.Metrics, portMetrics)
return simMetrics
}