...
1
2
3
4
5
6
7
8
9
10
11
12
13
14 package procfs
15
16 import (
17 "bufio"
18 "fmt"
19 "os"
20 "strconv"
21 "strings"
22 )
23
24
25
26 type TLSStat struct {
27
28 TLSCurrTxSw int
29
30 TLSCurrRxSw int
31
32 TLSCurrTxDevice int
33
34 TLSCurrRxDevice int
35
36 TLSTxSw int
37
38 TLSRxSw int
39
40 TLSTxDevice int
41
42 TLSRxDevice int
43
44 TLSDecryptError int
45
46 TLSRxDeviceResync int
47
48 TLSDecryptRetry int
49
50 TLSRxNoPadViolation int
51 }
52
53
54 func NewTLSStat() (TLSStat, error) {
55 fs, err := NewFS(DefaultMountPoint)
56 if err != nil {
57 return TLSStat{}, err
58 }
59
60 return fs.NewTLSStat()
61 }
62
63
64 func (fs FS) NewTLSStat() (TLSStat, error) {
65 file, err := os.Open(fs.proc.Path("net/tls_stat"))
66 if err != nil {
67 return TLSStat{}, err
68 }
69 defer file.Close()
70
71 var (
72 tlsstat = TLSStat{}
73 s = bufio.NewScanner(file)
74 )
75
76 for s.Scan() {
77 fields := strings.Fields(s.Text())
78
79 if len(fields) != 2 {
80 return TLSStat{}, fmt.Errorf("%w: %q line %q", ErrFileParse, file.Name(), s.Text())
81 }
82
83 name := fields[0]
84 value, err := strconv.Atoi(fields[1])
85 if err != nil {
86 return TLSStat{}, err
87 }
88
89 switch name {
90 case "TlsCurrTxSw":
91 tlsstat.TLSCurrTxSw = value
92 case "TlsCurrRxSw":
93 tlsstat.TLSCurrRxSw = value
94 case "TlsCurrTxDevice":
95 tlsstat.TLSCurrTxDevice = value
96 case "TlsCurrRxDevice":
97 tlsstat.TLSCurrRxDevice = value
98 case "TlsTxSw":
99 tlsstat.TLSTxSw = value
100 case "TlsRxSw":
101 tlsstat.TLSRxSw = value
102 case "TlsTxDevice":
103 tlsstat.TLSTxDevice = value
104 case "TlsRxDevice":
105 tlsstat.TLSRxDevice = value
106 case "TlsDecryptError":
107 tlsstat.TLSDecryptError = value
108 case "TlsRxDeviceResync":
109 tlsstat.TLSRxDeviceResync = value
110 case "TlsDecryptRetry":
111 tlsstat.TLSDecryptRetry = value
112 case "TlsRxNoPadViolation":
113 tlsstat.TLSRxNoPadViolation = value
114 }
115
116 }
117
118 return tlsstat, s.Err()
119 }
120
View as plain text