/
counters.go
77 lines (64 loc) · 2.91 KB
/
counters.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package iface
/*
#include "../csrc/iface/face.h"
*/
import "C"
import (
"fmt"
"github.com/usnistgov/ndn-dpdk/ndni"
)
// Counters contains basic face counters.
type Counters struct {
RxFrames uint64 `json:"rxFrames"` // RX total frames
RxOctets uint64 `json:"rxOctets"` // RX total bytes
DecodeErrs uint64 `json:"decodeErrs"` // decode errors
ReassPackets uint64 `json:"reassPackets"` // RX packets that were reassembled
ReassDrops uint64 `json:"reassDrops"` // RX frames that were dropped by reassembler
RxInterests uint64 `json:"rxInterests"` // RX Interest packets
RxData uint64 `json:"rxData"` // RX Data packets
RxNacks uint64 `json:"rxNacks"` // RX Nack packets
TxInterests uint64 `json:"txInterests"` // TX Interest packets
TxData uint64 `json:"txData"` // TX Data packets
TxNacks uint64 `json:"txNacks"` // TX Nack packets
FragGood uint64 `json:"fragGood"` // fragmented L3 packets
FragBad uint64 `json:"fragBad"` // fragmentation failures
TxAllocErrs uint64 `json:"txAllocErrs"` // allocation errors during TX
TxDropped uint64 `json:"txDropped"` // L2 frames dropped due to full queue
TxFrames uint64 `json:"txFrames"` // sent total frames
TxOctets uint64 `json:"txOctets"` // sent total bytes
}
func (cnt Counters) String() string {
return fmt.Sprintf("RX %dfrm %db %dI %dD %dN %derr reass=(%dpkt %ddrop) TX %dfrm %db %dI %dD %dN frag=(%dgood %dbad) alloc=%derr %ddropped",
cnt.RxFrames, cnt.RxOctets, cnt.RxInterests, cnt.RxData, cnt.RxNacks, cnt.DecodeErrs, cnt.ReassPackets, cnt.ReassDrops,
cnt.TxFrames, cnt.TxOctets, cnt.TxInterests, cnt.TxData, cnt.TxNacks, cnt.FragGood, cnt.FragBad, cnt.TxAllocErrs, cnt.TxDropped)
}
// ReadCounters retrieves basic face counters.
func (f *face) ReadCounters() (cnt Counters) {
c := f.ptr()
if c.impl == nil {
return cnt
}
rxC := &c.impl.rx
for i := 0; i < C.RXPROC_MAX_THREADS; i++ {
rxtC := &rxC.threads[i]
cnt.RxOctets += uint64(rxtC.nFrames[0])
cnt.DecodeErrs += uint64(rxtC.nDecodeErr)
cnt.RxInterests += uint64(rxtC.nFrames[ndni.PktInterest])
cnt.RxData += uint64(rxtC.nFrames[ndni.PktData])
cnt.RxNacks += uint64(rxtC.nFrames[ndni.PktNack])
}
cnt.ReassPackets = uint64(rxC.reass.nDeliverPackets)
cnt.ReassDrops = uint64(rxC.reass.nDropFragments)
cnt.RxFrames = cnt.RxInterests + cnt.RxData + cnt.RxNacks + uint64(rxC.reass.nDeliverFragments) - cnt.ReassPackets + cnt.ReassDrops
txC := &c.impl.tx
cnt.TxInterests = uint64(txC.nFrames[ndni.PktInterest])
cnt.TxData = uint64(txC.nFrames[ndni.PktData])
cnt.TxNacks = uint64(txC.nFrames[ndni.PktNack])
cnt.FragGood = uint64(txC.nL3Fragmented)
cnt.FragBad = uint64(txC.nL3OverLength + txC.nAllocFails)
cnt.TxAllocErrs = uint64(txC.nAllocFails)
cnt.TxDropped = uint64(txC.nDroppedFrames)
cnt.TxFrames = uint64(txC.nFrames[ndni.PktFragment] - txC.nDroppedFrames)
cnt.TxOctets = uint64(txC.nOctets - txC.nDroppedOctets)
return cnt
}