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
}
