48 lines
897 B
Go
48 lines
897 B
Go
package peer
|
|
|
|
import "unsafe"
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
const (
|
|
headerSize = 12
|
|
controlHeaderSize = 24
|
|
dataHeaderSize = 12
|
|
|
|
dataStreamID = 1
|
|
controlStreamID = 2
|
|
)
|
|
|
|
type Header struct {
|
|
Version byte
|
|
StreamID byte
|
|
SourceIP byte
|
|
DestIP byte
|
|
Counter uint64 // Init with time.Now().Unix << 30 to ensure monotonic.
|
|
}
|
|
|
|
func parseHeader(b []byte) (h Header) {
|
|
h.Version = b[0]
|
|
h.StreamID = b[1]
|
|
h.SourceIP = b[2]
|
|
h.DestIP = b[3]
|
|
h.Counter = *(*uint64)(unsafe.Pointer(&b[4]))
|
|
return h
|
|
}
|
|
|
|
func (h *Header) Parse(b []byte) {
|
|
h.Version = b[0]
|
|
h.StreamID = b[1]
|
|
h.SourceIP = b[2]
|
|
h.DestIP = b[3]
|
|
h.Counter = *(*uint64)(unsafe.Pointer(&b[4]))
|
|
}
|
|
|
|
func (h *Header) Marshal(buf []byte) {
|
|
buf[0] = h.Version
|
|
buf[1] = h.StreamID
|
|
buf[2] = h.SourceIP
|
|
buf[3] = h.DestIP
|
|
*(*uint64)(unsafe.Pointer(&buf[4])) = h.Counter
|
|
}
|