tcp_linux.go 5.9 KB

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