frame.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package gfsmux
  2. import (
  3. "encoding/binary"
  4. "fmt"
  5. )
  6. const (
  7. // Protocol version 1: old commands
  8. // CmdSyn ... stream open
  9. CmdSyn byte = iota
  10. // CmdFin ... stream close, EOF
  11. CmdFin
  12. // CmdPsh ... push data
  13. CmdPsh
  14. // CmdNop ... noop
  15. CmdNop
  16. // Protocol version 2: new commands
  17. // CmdUpd ... notify bytes consumed by remote peer-end
  18. CmdUpd
  19. )
  20. const (
  21. // data size of CmdUpd, format:
  22. // |4B data consumed(ACK)| 4B window size(WINDOW) |
  23. szCmdUPD = 8
  24. )
  25. const (
  26. // initial peer window guess, a slow-start
  27. initialPeerWindow = 262144
  28. )
  29. const (
  30. sizeOfVer = 1
  31. sizeOfCmd = 1
  32. sizeOfLength = 2
  33. sizeOfSid = 4
  34. // HeaderSize ...
  35. HeaderSize = sizeOfVer + sizeOfCmd + sizeOfSid + sizeOfLength
  36. )
  37. // Frame defines a packet from or to be multiplexed into a single Connection
  38. type Frame struct {
  39. Ver byte
  40. Cmd byte
  41. Sid uint32
  42. Data []byte
  43. }
  44. // NewFrame ...
  45. func NewFrame(
  46. Version,
  47. Cmd byte,
  48. Sid uint32,
  49. ) Frame {
  50. return Frame{Ver: Version, Cmd: Cmd, Sid: Sid}
  51. }
  52. type rawHeader [HeaderSize]byte
  53. func (
  54. h rawHeader,
  55. ) Version() byte {
  56. return h[0]
  57. }
  58. func (
  59. h rawHeader,
  60. ) Cmd() byte {
  61. return h[1]
  62. }
  63. func (
  64. h rawHeader,
  65. ) Length() uint16 {
  66. return binary.LittleEndian.Uint16(
  67. h[2:],
  68. )
  69. }
  70. func (
  71. h rawHeader,
  72. ) StreamID() uint32 {
  73. return binary.LittleEndian.Uint32(
  74. h[4:],
  75. )
  76. }
  77. func (
  78. h rawHeader,
  79. ) String() string {
  80. return fmt.Sprintf(
  81. "Version:%d Cmd:%d StreamID:%d Length:%d",
  82. h.Version(),
  83. h.Cmd(),
  84. h.StreamID(),
  85. h.Length(),
  86. )
  87. }
  88. type updHeader [szCmdUPD]byte
  89. func (
  90. h updHeader,
  91. ) Consumed() uint32 {
  92. return binary.LittleEndian.Uint32(
  93. h[:],
  94. )
  95. }
  96. func (
  97. h updHeader,
  98. ) Window() uint32 {
  99. return binary.LittleEndian.Uint32(
  100. h[4:],
  101. )
  102. }