...
1 package netlink
2
3 import (
4 "bytes"
5 "errors"
6 "io"
7 )
8
9 const (
10 tcpBBRInfoLen = 20
11 memInfoLen = 16
12 )
13
14 func checkDeserErr(err error) error {
15 if err == io.EOF {
16 return nil
17 }
18 return err
19 }
20
21 func (t *TCPInfo) deserialize(b []byte) error {
22 var err error
23 rb := bytes.NewBuffer(b)
24
25 t.State, err = rb.ReadByte()
26 if err != nil {
27 return checkDeserErr(err)
28 }
29
30 t.Ca_state, err = rb.ReadByte()
31 if err != nil {
32 return checkDeserErr(err)
33 }
34
35 t.Retransmits, err = rb.ReadByte()
36 if err != nil {
37 return checkDeserErr(err)
38 }
39
40 t.Probes, err = rb.ReadByte()
41 if err != nil {
42 return checkDeserErr(err)
43 }
44
45 t.Backoff, err = rb.ReadByte()
46 if err != nil {
47 return checkDeserErr(err)
48 }
49 t.Options, err = rb.ReadByte()
50 if err != nil {
51 return checkDeserErr(err)
52 }
53
54 scales, err := rb.ReadByte()
55 if err != nil {
56 return checkDeserErr(err)
57 }
58 t.Snd_wscale = scales >> 4
59 t.Rcv_wscale = scales & 0xf
60
61 rateLimAndFastOpen, err := rb.ReadByte()
62 if err != nil {
63 return checkDeserErr(err)
64 }
65 t.Delivery_rate_app_limited = rateLimAndFastOpen >> 7
66 t.Fastopen_client_fail = rateLimAndFastOpen >> 5 & 3
67
68 next := rb.Next(4)
69 if len(next) == 0 {
70 return nil
71 }
72 t.Rto = native.Uint32(next)
73
74 next = rb.Next(4)
75 if len(next) == 0 {
76 return nil
77 }
78 t.Ato = native.Uint32(next)
79
80 next = rb.Next(4)
81 if len(next) == 0 {
82 return nil
83 }
84 t.Snd_mss = native.Uint32(next)
85
86 next = rb.Next(4)
87 if len(next) == 0 {
88 return nil
89 }
90 t.Rcv_mss = native.Uint32(next)
91
92 next = rb.Next(4)
93 if len(next) == 0 {
94 return nil
95 }
96 t.Unacked = native.Uint32(next)
97
98 next = rb.Next(4)
99 if len(next) == 0 {
100 return nil
101 }
102 t.Sacked = native.Uint32(next)
103
104 next = rb.Next(4)
105 if len(next) == 0 {
106 return nil
107 }
108 t.Lost = native.Uint32(next)
109
110 next = rb.Next(4)
111 if len(next) == 0 {
112 return nil
113 }
114 t.Retrans = native.Uint32(next)
115
116 next = rb.Next(4)
117 if len(next) == 0 {
118 return nil
119 }
120 t.Fackets = native.Uint32(next)
121
122 next = rb.Next(4)
123 if len(next) == 0 {
124 return nil
125 }
126 t.Last_data_sent = native.Uint32(next)
127
128 next = rb.Next(4)
129 if len(next) == 0 {
130 return nil
131 }
132 t.Last_ack_sent = native.Uint32(next)
133
134 next = rb.Next(4)
135 if len(next) == 0 {
136 return nil
137 }
138 t.Last_data_recv = native.Uint32(next)
139
140 next = rb.Next(4)
141 if len(next) == 0 {
142 return nil
143 }
144 t.Last_ack_recv = native.Uint32(next)
145
146 next = rb.Next(4)
147 if len(next) == 0 {
148 return nil
149 }
150 t.Pmtu = native.Uint32(next)
151
152 next = rb.Next(4)
153 if len(next) == 0 {
154 return nil
155 }
156 t.Rcv_ssthresh = native.Uint32(next)
157
158 next = rb.Next(4)
159 if len(next) == 0 {
160 return nil
161 }
162 t.Rtt = native.Uint32(next)
163
164 next = rb.Next(4)
165 if len(next) == 0 {
166 return nil
167 }
168 t.Rttvar = native.Uint32(next)
169
170 next = rb.Next(4)
171 if len(next) == 0 {
172 return nil
173 }
174 t.Snd_ssthresh = native.Uint32(next)
175
176 next = rb.Next(4)
177 if len(next) == 0 {
178 return nil
179 }
180 t.Snd_cwnd = native.Uint32(next)
181
182 next = rb.Next(4)
183 if len(next) == 0 {
184 return nil
185 }
186 t.Advmss = native.Uint32(next)
187
188 next = rb.Next(4)
189 if len(next) == 0 {
190 return nil
191 }
192 t.Reordering = native.Uint32(next)
193
194 next = rb.Next(4)
195 if len(next) == 0 {
196 return nil
197 }
198 t.Rcv_rtt = native.Uint32(next)
199
200 next = rb.Next(4)
201 if len(next) == 0 {
202 return nil
203 }
204 t.Rcv_space = native.Uint32(next)
205
206 next = rb.Next(4)
207 if len(next) == 0 {
208 return nil
209 }
210 t.Total_retrans = native.Uint32(next)
211
212 next = rb.Next(8)
213 if len(next) == 0 {
214 return nil
215 }
216 t.Pacing_rate = native.Uint64(next)
217
218 next = rb.Next(8)
219 if len(next) == 0 {
220 return nil
221 }
222 t.Max_pacing_rate = native.Uint64(next)
223
224 next = rb.Next(8)
225 if len(next) == 0 {
226 return nil
227 }
228 t.Bytes_acked = native.Uint64(next)
229
230 next = rb.Next(8)
231 if len(next) == 0 {
232 return nil
233 }
234 t.Bytes_received = native.Uint64(next)
235
236 next = rb.Next(4)
237 if len(next) == 0 {
238 return nil
239 }
240 t.Segs_out = native.Uint32(next)
241
242 next = rb.Next(4)
243 if len(next) == 0 {
244 return nil
245 }
246 t.Segs_in = native.Uint32(next)
247 next = rb.Next(4)
248 if len(next) == 0 {
249 return nil
250 }
251 t.Notsent_bytes = native.Uint32(next)
252 next = rb.Next(4)
253 if len(next) == 0 {
254 return nil
255 }
256 t.Min_rtt = native.Uint32(next)
257 next = rb.Next(4)
258 if len(next) == 0 {
259 return nil
260 }
261 t.Data_segs_in = native.Uint32(next)
262 next = rb.Next(4)
263 if len(next) == 0 {
264 return nil
265 }
266 t.Data_segs_out = native.Uint32(next)
267
268 next = rb.Next(8)
269 if len(next) == 0 {
270 return nil
271 }
272 t.Delivery_rate = native.Uint64(next)
273
274 next = rb.Next(8)
275 if len(next) == 0 {
276 return nil
277 }
278 t.Busy_time = native.Uint64(next)
279
280 next = rb.Next(8)
281 if len(next) == 0 {
282 return nil
283 }
284 t.Rwnd_limited = native.Uint64(next)
285
286 next = rb.Next(8)
287 if len(next) == 0 {
288 return nil
289 }
290 t.Sndbuf_limited = native.Uint64(next)
291
292 next = rb.Next(4)
293 if len(next) == 0 {
294 return nil
295 }
296 t.Delivered = native.Uint32(next)
297
298 next = rb.Next(4)
299 if len(next) == 0 {
300 return nil
301 }
302 t.Delivered_ce = native.Uint32(next)
303
304 next = rb.Next(8)
305 if len(next) == 0 {
306 return nil
307 }
308 t.Bytes_sent = native.Uint64(next)
309
310 next = rb.Next(8)
311 if len(next) == 0 {
312 return nil
313 }
314 t.Bytes_retrans = native.Uint64(next)
315
316 next = rb.Next(4)
317 if len(next) == 0 {
318 return nil
319 }
320 t.Dsack_dups = native.Uint32(next)
321
322 next = rb.Next(4)
323 if len(next) == 0 {
324 return nil
325 }
326 t.Reord_seen = native.Uint32(next)
327
328 next = rb.Next(4)
329 if len(next) == 0 {
330 return nil
331 }
332 t.Rcv_ooopack = native.Uint32(next)
333
334 next = rb.Next(4)
335 if len(next) == 0 {
336 return nil
337 }
338 t.Snd_wnd = native.Uint32(next)
339 return nil
340 }
341
342 func (t *TCPBBRInfo) deserialize(b []byte) error {
343 if len(b) != tcpBBRInfoLen {
344 return errors.New("Invalid length")
345 }
346
347 rb := bytes.NewBuffer(b)
348 t.BBRBW = native.Uint64(rb.Next(8))
349 t.BBRMinRTT = native.Uint32(rb.Next(4))
350 t.BBRPacingGain = native.Uint32(rb.Next(4))
351 t.BBRCwndGain = native.Uint32(rb.Next(4))
352
353 return nil
354 }
355
356 func (m *MemInfo) deserialize(b []byte) error {
357 if len(b) != memInfoLen {
358 return errors.New("Invalid length")
359 }
360
361 rb := bytes.NewBuffer(b)
362 m.RMem = native.Uint32(rb.Next(4))
363 m.WMem = native.Uint32(rb.Next(4))
364 m.FMem = native.Uint32(rb.Next(4))
365 m.TMem = native.Uint32(rb.Next(4))
366
367 return nil
368 }
369
View as plain text