#
# Formula_ALL_ENB_TN: Formulas for TN performance metrics (KPIs) for Ericsson eNBs (ERBS, MSRBSv1 and eventually MSRBSv2)
#
# Copyright (c) 2015 Ericsson AB
# This document may be used and/or copied only with the prior written permission of Ericsson AB
# or in accordance with the terms and conditions stipulated in the contract or agreement under 
# which the document has been supplied.
#
# Notes
#-----------------------------------------------------------------------------------------------
#2) Each formula is split into the formula result variable name (part before the '=' sign) and the formula expression (the part after the '=' sign).
#3) The formula name is further divided into the following parts: <eNB node><TN entity><direction><metric>_<unit>. 
#4 <Unit> is the value of a KPI quantity in some form of unit. See table below.
#5) Any reference in the formula expression to a counter name of other formula name is replaced by a perl variable reference
#6) The order in which the formulas are defined does not have any importance, a formula can refer to other formulas defined further down in the file
#7) The formula names should not start with "pm"
#
# TN KPI/Metric Prefix to eNB Node Mapping
#-----------------------------------------------------------------------------------------------
# Erbs = G1 RBS (DUL20 and DUS41) and mRBS
# Msrbsv1 = pRBS 6401 and pRBS 6402
# Msrbsv2 = G2 RBS (DUS32 and DUS52)
#
# Unit Description
#-----------------------------------------------------------------------------------------------
# pkts = Ethernet or IP packets
# chunks = SCTP data or control chunks
# pct = percentage
# EthMbps = Ethernet layer Mbps
# IpMbps = IP layer Mbps
# CipherIpMbps = Encrypted (Inner) IP Layer Mbps - no outer IP header, ESP header, Integrity Check Value (ICV) and UDP header (ESP NAT Traversal)
# Sctpkbps = SCTP layer kbps - no outer IP header, ESP header, Integrity Check Value (ICV) and UDP header (ESP NAT Traversal)
#
# For more information,refer to Transport Network Performance Metrics 44/1553-HSC 105 50/1
#
# Version
#-----------------------------------------------------------------------------------------------
# 1.4	3/02/2015	Steve Baillargeon	Initial version, valid for ERBS and MSRBSv1, up to L14B
#-----------------------------------------------------------------------------------------------
#
# ERBS Ethernet Interface Integrity (mogroup is gigabitethernet=1)
ErbsEthIfInPktDiscards_pkts					= pmIfInErrorsLink1 + pmIfInUnknownProtosLink1 + pmIfInDiscardsLink1 + pmDot1qTpVlanPortInDiscardsLink1
ErbsEthIfInPktDiscardRatio_pct				= 100 * (pmIfInErrorsLink1 + pmIfInUnknownProtosLink1 + pmIfInDiscardsLink1 + pmDot1qTpVlanPortInDiscardsLink1) / (pmIfInErrorsLink1 + pmIfInUnknownProtosLink1 + pmIfInDiscardsLink1 + pmDot1qTpVlanPortInDiscardsLink1 + pmIfInBroadcastPktsLink1 + pmIfInMulticastPktsLink1 + (pmIfInUcastPktsLink1 * 1000))
ErbsEthIfInUsage_EthMbps					= (((pmIfInOctetsLink1Hi * 2147483648) + pmIfInOctetsLink1Lo + ((pmIfInErrorsLink1 + pmIfInUnknownProtosLink1 + pmIfInDiscardsLink1 + pmDot1qTpVlanPortInDiscardsLink1 + pmIfInBroadcastPktsLink1 + pmIfInMulticastPktsLink1 + (pmifInUcastPktsLink1 * 1000)) * 20)) * 8) / (1000000 * 900)
ErbsEthIfOutPktDiscards_pkts				= pmIfOutDiscardsLink1 + pmIfOutErrorsLink1
ErbsEthIfOutPktDiscardRatio_pct				= 100 * (pmIfOutDiscardsLink1 + pmIfOutErrorsLink1) / (pmIfOutDiscardsLink1 + pmIfOutErrorsLink1 + pmIfOutBroadcastPktsLink1 + pmIfOutMulticastPktsLink1 + (pmIfOutUcastPktsLink1 * 1000))
ErbsEthIfOutUsage_EthMbps					= (((pmIfOutOctetsLink1Hi * 2147483648) + pmIfOutOctetsLink1Lo + ((pmIfOutDiscardsLink1 + pmIfOutErrorsLink1 + pmIfOutBroadcastPktsLink1 + pmIfOutMulticastPktsLink1 + (pmIfOutUcastPktsLink1 * 1000)) * 20)) * 8) / (1000000 * 900)

# ERBS Outer IPv4 Interface Integrity (mogroup is ipinterface=X|ipaccesshostet=Y where X and Y are outer IPv4 interface and host instances)
ErbsOuterIp4IfInPktDiscards_pkts 			= pmIfStatsIpInDiscards + pmInDiscPolicy + pmIpReasmFails/2 + pmIpPortUnreachable + pmUdpInErrors + pmIfStatsIpAddrErrors + pmIfStatsIpInHdrErrors + pmIfStatsIpUnknownProtos
ErbsOuterIp4IfInPktDiscardRatio_pct 		= 100 * (pmIfStatsIpInDiscards + pmInDiscPolicy + pmIpReasmFails/2 + pmIpPortUnreachable + pmUdpInErrors + pmIfStatsIpAddrErrors + pmIfStatsIpInHdrErrors + pmIfStatsIpUnknownProtos) / pmIpIfStatsHCInReceives
ErbsOuterIp4IfInPktReassemblyRatio_pct 		= 100 * pmIpReasmReqds / pmIpIfStatsHCInReceives
ErbsOuterIp4IfInUsage_IpMbps 				= pmIpIfStatsHCInOctets * 8 / (1000000 * 900)
ErbsOuterIp4IfInMcastUsage_IpMbps 			= pmIfStatsHCIpInMcastOctets * 8 / (1000000 * 900)
ErbsOuterIp4IfOutPktDiscards_pkts 			= pmIfStatsIpOutDiscards
ErbsOuterIp4IfOutPktDiscardRatio_pct 		= 100 * pmIfStatsIpOutDiscards / (pmIfStatsIpOutDiscards + pmIpIfStatsHCOutTransmits)
ErbsOuterIp4IfOutPktFragmentationRatio_pct 	= 100 * pmIpFragCreates / pmIpIfStatsHCOutTransmits
ErbsOuterIp4IfOutUsage_IpMbps 				= pmIpIfStatsHCOutOctets * 8 / (1000000 * 900)
ErbsOuterIp4IfOutMcastUsage_IpMbps 			= pmIfStatsHCIpOutMcastOctets * 8 / (1000000 * 900)

# ERBS Inner IPv4 Interface Integrity (mogroup is vpninterface=X|ipaccesshostet=Y where X and Y are inner IPv4 interface and host instances)
ErbsInnerIpv4IfInPktDiscards_pkts 			= pmIpInDiscards + pmIpReasmFails/2 + pmIpPortUnreachable + pmUdpInErrors + pmIpInAddrErrors + pmIpInHdrErrors + pmIpInUnknownProtos + pmOutDroppedPacketsPolicyControl
ErbsInnerIpv4IfInPktDiscardRatio_pct 		= 100 * (pmIpInDiscards + pmIpReasmFails/2 + pmIpPortUnreachable + pmUdpInErrors + pmIpInAddrErrors + pmIpInHdrErrors + pmIpInUnknownProtos + pmOutDroppedPacketsPolicyControl) / (pmIpInReceives * 1000)
ErbsInnerIpv4IfInPktReassemblyRatio_pct 	= 100 * pmIpReasmReqds / (pmIpInReceives * 1000)
ErbsInnerIpv4IfOutPktDiscards_pkts 			= pmIpOutDiscards
ErbsInnerIpv4IfOutPktDiscardRatio_pct		= 100 * pmIpOutDiscards / pmIpOutRequests
ErbsInnerIpv4IfOutPktFragmentationRatio_pct	= 100 * pmIpFragCreates / (pmIpOutRequests - pmIpOutDiscards)

# ERBS Outer IPv6 Interface Integrity (mogroup is ipv6interface=X where X is outer IPv6 interface instance)
ErbsOuterIpv6IfInPktDiscards_pkts 			= pmIpIfStatsInDiscards + pmIpIfStatsReasmFails/2 + pmUdpIfStatsInError + pmIpIfStatsInAddrErrors + pmIpIfStatsInHdrErrors + pmIpIfStatsInUnknownProtos
ErbsOuterIpv6IfInPktDiscardRatio_pct 		= 100 * (pmIpIfStatsInDiscards + pmIpIfStatsReasmFails/2 + pmUdpIfStatsInError + pmIpIfStatsInAddrErrors + pmIpIfStatsInHdrErrors + pmIpIfStatsInUnknownProtos) / pmIpIfStatsHCInReceives
ErbsOuterIpv6IfInPktReassemblyRatio_pct 	= 100 * pmIpIfStatsReasmReqds / pmIpIfStatsHCInReceives
ErbsOuterIpv6IfInUsage_IpMbps 				= pmIpIfStatsHCInOctets * 8 / (1000000 * 900)
ErbsOuterIpv6IfInMcastUsage_IpMbps 			= pmIfStatsHCIpInMcastOctets * 8 / (1000000 * 900)
ErbsOuterIpv6IfOutPktDiscards_pkts 			= pmIfStatsIpOutDiscards
ErbsOuterIpv6ifOutPktDiscardRatio_pct 		= 100 * pmIfStatsIpOutDiscards / (pmIfStatsIpOutDiscards + pmIpIfStatsHCOutTransmits)
ErbsOuterIpv6IfOutPktFragmentationRatio_pct	= 100 * pmIpIfStatsOutFragCreates / pmIpIfStatsHCOutTransmits
ErbsOuterIpv6IfOutUsage_IpMbps 				= pmIpIfStatsHCOutOctets * 8 / (1000000 * 900)
ErbsOuterIpv6IfOutMcastUsage_IpMbps 		= pmIfStatsHCIpOutMcastOctets * 8 / (1000000 * 900)

# ERBS Inner IPv6 Interface Integrity
# None available with current implementation

# ERBS IPSec Tunnel Endpoint Integrity (mogroup is ipsectunnel=X where X is IPsec tunnel instance)
ErbsIpsecTunInPktDiscards_pkts 				= pmInDiscAReFail + pmInDiscIntCh + pmInDiscDec + pmInDiscNoSa
ErbsIpsecTunInPktDiscardRatio_pct 			= 100 * (pmInDiscAReFail + pmInDiscIntCh + pmInDiscDec + pmInDiscNoSa) / (pmInDiscAReFail + pmInDiscIntCh + pmInDiscDec + (pmInPkt * 1000))
ErbsIpsecTunInEncryptRate_CipherIpMbps 		= pmInEspData * 8 / (1000000 * 900)
ErbsIpsecTunOutPktDiscards_pkts 			= pmOutDiscNoSa + pmOutDiscSeqOw
ErbsIpsecTunOutPktDiscardRatio_pct 			= 100 * (pmOutDiscNoSa + pmOutDiscSeqOw) / (pmOutDiscNoSa + pmOutDiscSeqOw + (pmOutPkt * 1000))
ErbsIpsecTunOutEncryptRate_CipherIpMbps 	= pmOutEspData * 8 / (1000000 * 900)

# ERBS Egress IP (Shaping) Queue Integrity (moGroup is trafficmanagementqueue=X where X is traffic management queue instance)
ErbsIpQueueOutPktDiscards_pkts 				= pmQueueDroppedPackets 
ErbsIpQueueOutPktDiscardRatio_pct 			= 100 * pmQueueDroppedPackets / (pmQueueDroppedPackets + pmQueueOutPackets)
ErbsIpQueueOutDiscardRate_IpMbps 			= pmQueueDroppedOctets * 8 / (1000000 * 900)
ErbsIpQueueOutUsage_IpMbps 					= pmQueueOutOctets * 8 / (1000000 * 900)

# ERBS SCTP Association Integrity (mogroup is sctpassociation=X where X is SCTP association instance ) 
ErbsSctpAssocInDataChunkDiscards_chunks 	= pmInDataChunkDiscards + pmInDataChunkAbnormal 
ErbsSctpAssocInDataChunkDiscardRatio_pct 		= 100 * (pmInDataChunkDiscards + pmInDataChunkAbnormal) / (pmInDataChunkDiscards + pmInDataChunkAbnormal + pmInDataChunks)
ErbsSctpAssocInControlChunkDiscards_chunks 	= pmInControlChunkDiscards + pmInControlChunkAbnormal
ErbsSctpAssocInControlDiscardRatio_pct 		= 100 * (pmInControlChunkDiscards + pmInControlChunkAbnormal) / (pmInControlChunkDiscards + pmInControlChunkAbnormal + pmInControlChunks)
ErbsSctpAssocInUsage_Sctpkbps 				= pmInOctets * 8 / (1000 * 900)
ErbsSctpAssocOutDataChunkDiscards_chunks 	= pmOutDataChunkDiscards + pmOutUserMsgDiscards
ErbsSctpAssocOutDataChunkDiscardRatio_pct 	= 100 * (pmInDataChunkDiscards + pmInDataChunkAbnormal) / (pmInDataChunkDiscards + pmInDataChunkAbnormal + pmOutDataChunks)
ErbsSctpAssocOutRtxRatio_pct 				= 100 * pmRtxChunks / (pmRtxChunks + pmOutDataChunks)
ErbsSctpAssocOutUsage_Sctpkbps 				= pmOutOctets * 8 / (1000 * 900)
ErbsSctpAssocAvailability_pct 				= 100 * (900 - pmTimeUnavail) / 900

# ERBS Outer IPv4 Flow Endpoint Integrity (mogroup is ipflowmonitor=X where X is IP flow monitor instance)
ErbsIpFlowInMaxBitrate_IpMbps 				= pmIpFlowMaxInBitrate / 1000
ErbsIpFlowIn90ptileBitrate_IpMbps 			= (Percentile(90,pmIpFlowInOctets)) *8 / (1000000 * @{pmIpFlowInOctets}[0])
ErbsIpFlowIn75ptileBitrate_IpMbps 			= (Percentile(75,pmIpFlowInOctets)) *8 / (1000000 * @{pmIpFlowInOctets}[0])
ErbsIpFlowIn50ptileBitrate_IpMbps 			= (Percentile(50,pmIpFlowInOctets)) *8 / (1000000 * @{pmIpFlowInOctets}[0])
ErbsIpFlowInMinBitrate_IpMbps 				= pmIpFlowMinInBitrate / 1000
ErbsIpFlowOutMaxBitrate_IpMbps 				= pmIpFlowMaxOutBitrate / 1000
ErbsIpFlowOut90ptileBitrate_IpMbps 			= (Percentile(90,pmIpFlowOutOctets)) *8 / (1000000 * @{pmIpFlowOutOctets}[0])
ErbsIpFlowOut75ptileBitrate_IpMbps 			= (Percentile(75,pmIpFlowOutOctets)) *8 / (1000000 * @{pmIpFlowOutOctets}[0])
ErbsIpFlowOut50ptileBitrate_IpMbps 			= (Percentile(50,pmIpFlowOutOctets)) *8 / (1000000 * @{pmIpFlowOutOctets}[0])
ErbsIpFlowOutMinBitrate_IpMbps 				= pmIpFlowMinOutBitrate / 1000

# MSRBSv1 Ethernet Interface Integrity (mogroup is ethernetport=1)
Msrbsv1EthIfInPktDiscards_pkts 				= ifInErrors + ifInDiscards # it does not include all possible discards
Msrbsv1EthIfInPktDiscardRatio_pct 			= 100 * (ifInErrors + ifInDiscards) / (ifInErrors + ifInDiscards + ifHCInBroadcastPkts + ifHCInMulticastPkts + ifHCInUcastPkts)
Msrbsv1EthIfInUsage_EthMbps 				= ((ifHCInOctets + ((ifInErrors + ifInDiscards + ifHCInBroadcastPkts + ifHCInMulticastPkts + ifHCInUcastPkts) * 20)) * 8) / (1000000 * 900)
Msrbsv1EthIfOutPktDiscards_pkts 			= ifOutDiscards + ifOutErrors # it does not include all possible discards
Msrbsv1EthIfOutPktDiscardRatio_pct 			= 100 * (ifOutDiscards + ifOutErrors) / (ifOutDiscards + ifOutErrors + ifHCInBroadcastPkts + ifHCInMulticastPkts +ifHCOutUcastPkts)
Msrbsv1EthIfOutUsage_EthMbps 				= ((ifHCOutOctets + ((ifOutDiscards + ifOutErrors + ifHCInBroadcastPkts + ifHCInMulticastPkts +ifHCOutUcastPkts) * 20)) * 8) / (1000000 * 900)

# MSRBSv1 Egress Ethernet Queue Integrity (mogroup is queue=X where X is Ethernet queue instance)
Msrbsv1EthQueueOutUsage_EthMbps 			= (queueHCOutOctets + (queueHCOutPkts * 20)) * 8 / (1000000 * 900)

# MSRBSv1 IP System Integrity (mogroup is transport=1)
Msrbsv1IpSystemInPktDiscards_pkts 			= udpInErrors + ipSystemStatsInAddrErrors + ipSystemStatsInUnknownProtos # it does not include all possible discards 

# MSRBSv1 SCTP System Integrity (mogroup is transport=1) 
Msrbsv1SctpInDataChunkDiscards_chunks 		= sctpInDataDroppedChunks # it does not include all possible discards
Msrbsv1SctpOutDataChunkDiscards_chunks 		= sctpOutDataChunkDiscards # it does not include all possible discards

# MSRBSv1 IPSec Tunnel Endpoint Integrity (mogroup is ipsectunnel=X where X is IPsec tunnel instance)
Msrbsv1IpsecTunInPktDiscards_pkts 			= ipSecTunInReplayDropPkts + ipSecTunInEspAuthFails + ipSecTunInTsFails # it does not include all possible discards
Msrbsv1IpsecTunInPktDiscardRatio_pct 		= 100 * (ipSecTunInReplayDropPkts + ipSecTunInEspAuthFails + ipSecTunInTsFails) / (ipSecTunInReplayDropPkts + ipSecTunInEspAuthFails + ipSecTunHCInDecryptedPkts)
Msrbsv1IpsecTunInDecryptRate_IpMbps 		= ipSecTunHCInDecryptedOctets * 8 / (1000000 * 900) #inner IP layer MBps after decryption
Msrbsv1IpsecTunOutPktDiscards_pkts 			= ipSecTunOutSnOverflows  # it does not include all possible discards
Msrbsv1IpsecTunOutPktDiscardRatio_pct 		= 100 * ipSecTunOutSnOverflows / (ipSecTunOutSnOverflows + ipSecTunHCOutPkts)
Msrbsv1IpsecTunOutEncryptRate_CipherIpMbps 	= ipSecTunHCOutOctets * 8 / (1000000 * 900)