tcp_linux.go 5.6 KB

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