frame.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package gfsmux // import "go.gridfinity.dev/gfsmux"
  2. import (
  3. "encoding/binary"
  4. "fmt"
  5. )
  6. const ( // Commands:
  7. // Protocol version 1
  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 = sizeOfVer + sizeOfCmd + sizeOfSid + sizeOfLength
  35. )
  36. // Frame defines a packet from or to be multiplexed into a single Connection
  37. type Frame struct {
  38. Ver byte
  39. Cmd byte
  40. Sid uint32
  41. Data []byte
  42. }
  43. func NewFrame(Version, Cmd byte, Sid uint32) Frame {
  44. return Frame{Ver: Version, Cmd: Cmd, Sid: Sid}
  45. }
  46. type rawHeader [HeaderSize]byte
  47. func (h rawHeader) Version() byte {
  48. return h[0]
  49. }
  50. func (h rawHeader) Cmd() byte {
  51. return h[1]
  52. }
  53. func (h rawHeader) Length() uint16 {
  54. return binary.LittleEndian.Uint16(h[2:])
  55. }
  56. func (h rawHeader) StreamID() uint32 {
  57. return binary.LittleEndian.Uint32(h[4:])
  58. }
  59. func (h rawHeader) String() string {
  60. return fmt.Sprintf("Version:%d Cmd:%d StreamID:%d Length:%d",
  61. h.Version(), h.Cmd(), h.StreamID(), h.Length())
  62. }
  63. type updHeader [szCmdUPD]byte
  64. func (h updHeader) Consumed() uint32 {
  65. return binary.LittleEndian.Uint32(h[:])
  66. }
  67. func (h updHeader) Window() uint32 {
  68. return binary.LittleEndian.Uint32(h[4:])
  69. }