61 lines
1.1 KiB
Go
61 lines
1.1 KiB
Go
|
package smux
|
||
|
|
||
|
import (
|
||
|
"encoding/binary"
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
version = 1
|
||
|
)
|
||
|
|
||
|
const ( // cmds
|
||
|
cmdSYN byte = iota // stream open
|
||
|
cmdFIN // stream close, a.k.a EOF mark
|
||
|
cmdPSH // data push
|
||
|
cmdNOP // no operation
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
sizeOfVer = 1
|
||
|
sizeOfCmd = 1
|
||
|
sizeOfLength = 2
|
||
|
sizeOfSid = 4
|
||
|
headerSize = sizeOfVer + sizeOfCmd + sizeOfSid + sizeOfLength
|
||
|
)
|
||
|
|
||
|
// Frame defines a packet from or to be multiplexed into a single connection
|
||
|
type Frame struct {
|
||
|
ver byte
|
||
|
cmd byte
|
||
|
sid uint32
|
||
|
data []byte
|
||
|
}
|
||
|
|
||
|
func newFrame(cmd byte, sid uint32) Frame {
|
||
|
return Frame{ver: version, cmd: cmd, sid: sid}
|
||
|
}
|
||
|
|
||
|
type rawHeader []byte
|
||
|
|
||
|
func (h rawHeader) Version() byte {
|
||
|
return h[0]
|
||
|
}
|
||
|
|
||
|
func (h rawHeader) Cmd() byte {
|
||
|
return h[1]
|
||
|
}
|
||
|
|
||
|
func (h rawHeader) Length() uint16 {
|
||
|
return binary.LittleEndian.Uint16(h[2:])
|
||
|
}
|
||
|
|
||
|
func (h rawHeader) StreamID() uint32 {
|
||
|
return binary.LittleEndian.Uint32(h[4:])
|
||
|
}
|
||
|
|
||
|
func (h rawHeader) String() string {
|
||
|
return fmt.Sprintf("Version:%d Cmd:%d StreamID:%d Length:%d",
|
||
|
h.Version(), h.Cmd(), h.StreamID(), h.Length())
|
||
|
}
|