#The formulas below are taken from the CPI DOCUMENT: RADIO NETWORK KPI  120/1553-HSD 101 02/10
#0) More information on formula syntax: http://doc.itk.ericsson.se/binder/current/html/ItkViewGuide/07_FormulaFiles.html
#1) Any text starting with a '#' is treated as a comment and discarded
#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) Any reference in the formula expression to a counter name of other formula name is replaced by a perl variable reference
#4) The special names sum_<countername>, sum_time_<countername> and sum_mo_<countername> are replaced by a perl reference to variable containing counter aggregates:
#      - sum_<countername>: Returns the sum of counter 'name' across the time and object domains. 
#      - sum_time_<countername>: Returns the sum of counter 'name' across the object domain for the current time. 
#      - sum_mo_<countername>:   Returns the sum of counter or field 'name' across the time domain for the current MO. 
#5) Each formula expression is then evaluated using perl 'eval'. This means that the syntax of the expressions is the same as that of perl - you can use any perl operators & functions.
#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"

# Q.Aal2 Setup Performance (Aal2Ap) 
NoAal2SetupAttempts = pmSuccInConnsRemoteQosClassA + pmSuccInConnsRemoteQosClassB + pmSuccInConnsRemoteQosClassC + pmSuccInConnsRemoteQosClassD + pmSuccOutConnsRemoteQosClassA + pmSuccOutConnsRemoteQosClassB + pmSuccOutConnsRemoteQosClassC + pmSuccOutConnsRemoteQosClassD + pmUnSuccInConnsRemoteQosClassA + pmUnSuccInConnsRemoteQosClassB + pmUnSuccInConnsRemoteQosClassC + pmUnSuccInConnsRemoteQosClassD + pmUnSuccInConnsLocalQosClassA + pmUnSuccInConnsLocalQosClassB + pmUnSuccInConnsLocalQosClassC + pmUnSuccInConnsLocalQosClassD + pmUnSuccOutConnsLocalQosClassA + pmUnSuccOutConnsLocalQosClassB + pmUnSuccOutConnsLocalQosClassC + pmUnSuccOutConnsLocalQosClassD + pmUnSuccOutConnsRemoteQosClassA + pmUnSuccOutConnsRemoteQosClassB + pmUnSuccOutConnsRemoteQosClassC + pmUnSuccOutConnsRemoteQosClassD
Aal2SetupFail = 100 * (pmUnSuccInConnsRemoteQosClassA + pmUnSuccInConnsRemoteQosClassB + pmUnSuccInConnsRemoteQosClassC + pmUnSuccInConnsRemoteQosClassD + pmUnSuccOutConnsRemoteQosClassA + pmUnSuccOutConnsRemoteQosClassB + pmUnSuccOutConnsRemoteQosClassC + pmUnSuccOutConnsRemoteQosClassD) / NoAal2SetupAttempts
Aal2Congestion = 100 * ( pmUnSuccInConnsLocalQosClassA + pmUnSuccInConnsLocalQosClassB + pmUnSuccInConnsLocalQosClassC + pmUnSuccInConnsLocalQosClassD + pmUnSuccOutConnsLocalQosClassA + pmUnSuccOutConnsLocalQosClassB + pmUnSuccOutConnsLocalQosClassC + pmUnSuccOutConnsLocalQosClassD) / NoAal2SetupAttempts

NoAal2SetupAttemptsClassA = pmSuccInConnsRemoteQosClassA + pmSuccOutConnsRemoteQosClassA + pmUnSuccInConnsRemoteQosClassA + pmUnSuccInConnsLocalQosClassA + pmUnSuccOutConnsLocalQosClassA + pmUnSuccOutConnsRemoteQosClassA
Aal2FailClassA = 100 * (pmUnSuccInConnsRemoteQosClassA + pmUnSuccOutConnsRemoteQosClassA) / NoAal2SetupAttemptsClassA
CongestClassA = 100 * ( pmUnSuccInConnsLocalQosClassA + pmUnSuccOutConnsLocalQosClassA) / NoAal2SetupAttemptsClassA

NoAal2SetupAttemptsClassB = pmSuccInConnsRemoteQosClassB + pmSuccOutConnsRemoteQosClassB + pmUnSuccInConnsRemoteQosClassB + pmUnSuccInConnsLocalQosClassB + pmUnSuccOutConnsLocalQosClassB + pmUnSuccOutConnsRemoteQosClassB
Aal2FailClassB = 100 * (pmUnSuccInConnsRemoteQosClassB + pmUnSuccOutConnsRemoteQosClassB) / NoAal2SetupAttemptsClassB
CongestClassB = 100 * ( pmUnSuccInConnsLocalQosClassB + pmUnSuccOutConnsLocalQosClassB) / NoAal2SetupAttemptsClassB

NoAal2SetupAttemptsClassC = pmSuccInConnsRemoteQosClassC + pmSuccOutConnsRemoteQosClassC + pmUnSuccInConnsRemoteQosClassC + pmUnSuccInConnsLocalQosClassC + pmUnSuccOutConnsLocalQosClassC + pmUnSuccOutConnsRemoteQosClassC
Aal2FailClassC = 100 * (pmUnSuccInConnsRemoteQosClassC + pmUnSuccOutConnsRemoteQosClassC) / NoAal2SetupAttemptsClassC
CongestClassC = 100 * ( pmUnSuccInConnsLocalQosClassC + pmUnSuccOutConnsLocalQosClassC) / NoAal2SetupAttemptsClassC

NoAal2SetupAttemptsClassD = pmSuccInConnsRemoteQosClassD + pmSuccOutConnsRemoteQosClassD + pmUnSuccInConnsRemoteQosClassD + pmUnSuccInConnsLocalQosClassD + pmUnSuccOutConnsLocalQosClassD + pmUnSuccOutConnsRemoteQosClassD
Aal2FailClassD = 100 * (pmUnSuccInConnsRemoteQosClassD + pmUnSuccOutConnsRemoteQosClassD) / NoAal2SetupAttemptsClassD
CongestClassD = 100 * ( pmUnSuccInConnsLocalQosClassD + pmUnSuccOutConnsLocalQosClassD) / NoAal2SetupAttemptsClassD

#Sctp
SctpPacketLossRatio = 100 * pmSctpStatRetransChunks / (pmSctpStatSentChunks + pmSctpStatRetransChunks) 

#AtmPort,VplTp,VclTp
AtmIn = pmReceivedAtmCells * 53 * 8 / (900 * 1000000)
AtmOut = pmTransmittedAtmCells * 53 * 8 / (900 * 1000000)
AtmTot = (pmTransmittedAtmCells + pmReceivedAtmCells) * 53 * 8 / (900 * 1000000)

#GigabitEthernet
GigaPortIn =  ((pmIfInOctetsLink1Hi  * 2147483648 + pmIfInOctetsLink1Lo  + pmIfInOctetsLink2Hi  * 2147483648 + pmIfInOctetsLink2Lo ) /  (900 * 1000000))* 8
GigaPortOut = ((pmIfOutOctetsLink1Hi * 2147483648 + pmIfOutOctetsLink1Lo + pmIfOutOctetsLink2Hi * 2147483648 + pmIfOutOctetsLink2Lo ) / (900 * 1000000))* 8
GigaPortTot = GigaPortIn + GigaPortOut 
GigaP1In =  ((pmIfInOctetsLink1Hi * 2147483648 + pmIfInOctetsLink1Lo ) / (900 * 1000000))* 8
GigaP1Out = ((pmIfOutOctetsLink1Hi * 2147483648 + pmIfOutOctetsLink1Lo ) / (900 * 1000000))* 8
GigaP2In =  ((pmIfInOctetsLink2Hi * 2147483648 + pmIfInOctetsLink2Lo ) / (900 * 1000000))* 8
GigaP2Out = ((pmIfOutOctetsLink2Hi * 2147483648 + pmIfOutOctetsLink2Lo ) / (900 * 1000000))* 8
GigaP1InDisc = pmDot1qTpVlanPortInDiscardsLink1 + pmIfInDiscardsLink1 + pmIfInErrorsLink1
GigaP2InDisc = pmDot1qTpVlanPortInDiscardsLink2 + pmIfInDiscardsLink2 + pmIfInErrorsLink2
GigaP1OutDisc = pmIfOutDiscardsLink1 + pmIfOutErrorsLink1
GigaP2OutDisc = pmIfOutDiscardsLink2 + pmIfOutErrorsLink2
GigaP1InUcst = (1000 * pmIfInUcastPktsLink1) / 900
GigaP2InUcst = (1000 * pmIfInUcastPktsLink2) / 900
GigaP1OutUcst = (1000 * pmIfOutUcastPktsLink1) / 900
GigaP2OutUcst = (1000 * pmIfOutUcastPktsLink2) / 900
GigaP1InOth = pmIfInBroadcastPktsLink1 + pmIfInMulticastPktsLink1 + pmIfInUnknownProtosLink1
GigaP2InOth = pmIfInBroadcastPktsLink2 + pmIfInMulticastPktsLink2 + pmIfInUnknownProtosLink2
GigaP1OutOth = pmIfOutBroadcastPktsLink1 + pmIfOutMulticastPktsLink1 + pmIfOutUnknownProtosLink1
GigaP2OutOth = pmIfOutBroadcastPktsLink2 + pmIfOutMulticastPktsLink2 + pmIfOutUnknownProtosLink2


#IpInterface
#Note: pmRopCounter can only be used on reports that are aggregated on ManagedElement 
#From 44/1553-HSC 105 50/1 :
IpLayerMbpsOut = 8 * pmIpIfStatsHCOutOctets / (1000000 * 900)
IpLayerMbpsIn = 8 * pmIpIfStatsHCInOctets / (1000000 * 900)
EthLayerMbpsOut = (8 * pmIpIfStatsHCOutOctets + 336 * pmIpIfStatsHCOutTransmits) / (1000000 * 900)
EthLayerMbpsIn = (8 * pmIpIfStatsHCInOctets + 336 * pmIpIfStatsHCInReceives) / (1000000 * 900)

IpIfInMbps = (8 * pmIpIfStatsHCInOctets) / (1000000) / 900
IpIfInPkt = (pmIfStatsIpInReceives * 1000) / 900
IpIfOutMbps = (8 * pmIpIfStatsHCOutOctets) / (1000000) / 900
IpIfOutPkt = (pmIfStatsIpOutRequests * 1000) / 900
IpIfEsp = 100 * ((pmInEsp * 1000) / pmIpIfStatsHCInReceives)
IpIfInErr = pmIfStatsIpAddrErrors + pmIfStatsIpInDiscards + pmIfStatsIpInHdrErrors + pmIfStatsIpUnknownProtos
IpIfOutErr = pmIfStatsIpOutDiscards 

#IpAccessHostEt
IpEtIcmpInDstUnr = pmIcmpInDestUnreachs
IpEtIcmpInOth = pmIcmpInEchoReps + pmIcmpInEchos + pmIcmpInErrors + pmIcmpInParamProbs + pmIcmpInRedirects + pmIcmpInSrcQuenchs + pmIcmpInTimeExcds
IpEtIcmpOutDstUnr = pmIcmpOutDestUnreachs 
IpEtIcmpOutOth =  pmIcmpOutEchoReps + pmIcmpOutEchos + pmIcmpOutErrors + pmIcmpOutMsgs + pmIcmpOutParamProbs
# Assumption is that pmIpInDelivers counts only one time for the re-assembled packet (not for each fragment)
IpEtReasmTrf = 100 * (pmIpReasmOks / (pmIpInDelivers * 1000))
IpEtReasmSuc = 100 - (100 * pmIpReasmFails / pmIpReasmOks)
IpEtFragTrf = 100 * (pmIpFragOks / (pmIpOutRequests * 1000))
IpEtFragSuc = 100 - (100 * pmIpFragFails / pmIpFragOks)
IpEtIpRxDrop = (100 * pmIpInDiscards) / (pmIpInDelivers * 1000)
IpEtOutPkt = (pmIpOutRequests * 1000) / 900
IpEtInPkt = (pmIpInDelivers * 1000) / 900
# Does pmIpInDiscards count for all discards, hdr errors etc?
IpEtUdpIpInError = pmIpInAddrErrors + pmIpInDiscards + pmIpInUnknownProtos + pmUdpInErrors + pmInAppLayerError
IpEtIpOutError = pmIpOutDiscards
IpEtUdpOut = (pmUdpOutDatagrams * 1000) / 900
IpEtUdpIn = (pmUdpInDatagrams * 1000) / 900

IpIpRxDrop = (100 * pmIpInDiscards) / (pmIpInDelivers * 1000)
IpReasmSuc = 100 - (100 * pmIpReasmFails / pmIpReasmOks)


#IpSecTunnel
IpSecRxPeerFaults = pmInInvalid + pmInInvalidSpi
IpSecRxDrop = 100 * ((pmInDiscAReFail + pmInDiscDec + pmInDiscIntCh + pmInDiscNoSa) / (1000 * pmInPkt))
IpSecTxDrop = 100 * ((pmOutDiscNoSa + pmOutDiscSeqOw) / (pmOutPkt * 1000))
IpSecEspIn = (8 * pmInEspData) / 900
IpSecEspOut = (8* pmOutEspData) / 900

# ISL load
InternalLinkGroupLoad = pmPeakBwLevel


# EthernetSwitchPort
EsPortIn = ((pmIfInOctetsHi * 2147483648 + pmIfInOctetsLo) / (900 * 1000000)) * 8
EsPortOut = ((pmIfOutOctetsHi * 2147483648 + pmIfOutOctetsLo) / (900 * 1000000)) * 8
EsPortTot = EsPortIn + EsPortOut
EsPortInDisc = pmIfInDiscards + pmIfInErrors
EsPortOutDisc = pmIfOutDiscards + pmIfOutErrors
EsPortInUcast = pmIfInUcastPkts / 900
EsPortOutUcast = pmIfOutUcastPkts / 900
EsPortInBcast = pmIfInBroadcastPkts / 900
EsPortOutBcast = pmIfOutBroadcastPkts / 900
EsPortDiscTot = EsPortInDisc + EsPortOutDisc
EsPortUcastTot = EsPortInUcast + EsPortOutUcast
EsPortBcastTot = EsPortInBcast + EsPortOutBcast

#EthernetSwitchModulePort
EsmPortIn =  (((pmIfInOctetsHi  * 2147483648) + pmIfInOctetsLo ) * 8) / (900 * 1000000)
EsmPortOut = (((pmIfOutOctetsHi * 2147483648) + pmIfOutOctetsLo) * 8) / (900 * 1000000)
EsmPortTot = EsmPortIn + EsmPortOut
EsmPInDisc = pmIfInDiscards + pmIfInErrors
EsmPOutDisc = pmIfOutDiscards + pmIfOutErrors
EsmPInUcast = (1000 * pmIfInUcastPkts) / 900
EsmPOutUcast = (1000 * pmIfOutUcastPkts) / 900
EsmPInBcast = pmIfInBroadcastPkts / 900
EsmPOutBcast = pmIfOutBroadcastPkts / 900


# InternalEthernetPort
IntEthIn = ((pmIfInOctetsHi * 2147483648 + pmIfInOctetsLo) / (900 * 1000000)) * 8
IntEthOut = ((pmIfOutOctetsHi * 2147483648 + pmIfOutOctetsLo) / (900 * 1000000)) * 8
IntEthInDisc = pmDot1qTpVlanPortInDiscardsLink + pmIfInDiscards + pmIfInErrors
IntEthOutDisc = pmIfOutDiscards + pmIfOutErrors
IntEthInUcast = (1000 * pmIfInUcastPkts) / 900
IntEthOutUcast = (1000 * pmIfOutUcastPkts) / 900
IntEthInBcast = pmIfInBroadcastPkts / 900
IntEthOutBcast = pmIfOutBroadcastPkts / 900
IntEthTot = IntEthIn + IntEthOut
IntEthDiscTot = IntEthInDisc + IntEthOutDisc
IntEthUcastTot = IeethpInUcast + IntEthOutUcast
IntEthBcastTot = IntEthInBcast + IntEthOutBcast

#EthernetPort
EthPortIn =  pmIfInOctets * 8 / (900 * 1000000)
EthPortOut = pmIfOutOctets * 8 / (900 * 1000000)
EthPortTot = EthPortIn + EthPortOut
EthPInDisc = pmIfInDiscards + pmIfInErrors
EthPOutDisc = pmIfOutDiscards + pmIfOutErrors
EthPInUcast = pmIfInUcastPkts / 900
EthPOutUcast = pmIfOutUcastPkts / 900
EthPInBcast = pmIfInBroadcastPkts / 900
EthPOutBcast = pmIfOutBroadcastPkts / 900

