Commit 86435f98 authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent b29c53e9
...@@ -1119,7 +1119,7 @@ func (nl *NodeLink) sendPkt(pkt *pktBuf) error { ...@@ -1119,7 +1119,7 @@ func (nl *NodeLink) sendPkt(pkt *pktBuf) error {
} }
// NOTE Write writes data in full, or it is error // NOTE Write writes data in full, or it is error
_, err := nl.peerLink.Write(pkt.Data) _, err := nl.peerLink.Write(pkt.data)
pkt.Free() pkt.Free()
return err return err
} }
...@@ -1137,7 +1137,7 @@ func (nl *NodeLink) recvPkt() (*pktBuf, error) { ...@@ -1137,7 +1137,7 @@ func (nl *NodeLink) recvPkt() (*pktBuf, error) {
pkt := pktAlloc(4096) pkt := pktAlloc(4096)
// len=4K but cap can be more since pkt is from pool - use all space to buffer reads // len=4K but cap can be more since pkt is from pool - use all space to buffer reads
// XXX vvv -> pktAlloc() ? // XXX vvv -> pktAlloc() ?
data := pkt.Data[:cap(pkt.Data)] data := pkt.data[:cap(pkt.data)]
n := 0 // number of pkt bytes obtained so far n := 0 // number of pkt bytes obtained so far
...@@ -1190,7 +1190,7 @@ func (nl *NodeLink) recvPkt() (*pktBuf, error) { ...@@ -1190,7 +1190,7 @@ func (nl *NodeLink) recvPkt() (*pktBuf, error) {
// fixup data/pkt // fixup data/pkt
data = data[:n] data = data[:n]
pkt.Data = data pkt.data = data
if /* XXX temp show only tx */ true && dumpio { if /* XXX temp show only tx */ true && dumpio {
// XXX -> log // XXX -> log
......
...@@ -36,31 +36,37 @@ import ( ...@@ -36,31 +36,37 @@ import (
// //
// Allocate pktBuf via pktAlloc() and free via pktBuf.Free(). // Allocate pktBuf via pktAlloc() and free via pktBuf.Free().
type pktBuf struct { type pktBuf struct {
Data []byte // whole packet data including all headers data []byte // whole packet data including all headers
} }
// Header returns pointer to packet header. // Header returns pointer to packet header.
func (pkt *pktBuf) Header() *proto.PktHeader { func (pkt *pktBuf) Header() *proto.PktHeader {
// XXX check len(Data) < PktHeader ? -> no, Data has to be allocated with cap >= PktHeaderLen // NOTE no need to check len(.data) < PktHeader:
return (*proto.PktHeader)(unsafe.Pointer(&pkt.Data[0])) // .data is always allocated with cap >= PktHeaderLen
return (*proto.PktHeader)(unsafe.Pointer(&pkt.data[0]))
} }
// Payload returns []byte representing packet payload. // Payload returns []byte representing packet payload.
func (pkt *pktBuf) Payload() []byte { func (pkt *pktBuf) Payload() []byte {
return pkt.Data[proto.PktHeaderLen:] return pkt.data[proto.PktHeaderLen:]
} }
// ---- pktBuf freelist ---- // ---- pktBuf freelist ----
// pktBufPool is sync.Pool<pktBuf> // pktBufPool is sync.Pool<pktBuf>
var pktBufPool = sync.Pool{New: func() interface{} { var pktBufPool = sync.Pool{New: func() interface{} {
return &pktBuf{Data: make([]byte, 0, 4096)} return &pktBuf{data: make([]byte, 0, 4096)}
}} }}
// pktAlloc allocates pktBuf with len=n // pktAlloc allocates pktBuf with len=n.
//
// n must be >= sizeof(proto.PktHeader).
func pktAlloc(n int) *pktBuf { func pktAlloc(n int) *pktBuf {
if n < proto.PktHeaderLen {
panic("pktAlloc: n < sizeof(PktHeader)")
}
pkt := pktBufPool.Get().(*pktBuf) pkt := pktBufPool.Get().(*pktBuf)
pkt.Data = xbytes.Realloc(pkt.Data, n) pkt.data = xbytes.Realloc(pkt.data, n)
return pkt return pkt
} }
...@@ -74,8 +80,8 @@ func (pkt *pktBuf) Free() { ...@@ -74,8 +80,8 @@ func (pkt *pktBuf) Free() {
// Strings dumps a packet in human-readable form // Strings dumps a packet in human-readable form
func (pkt *pktBuf) String() string { func (pkt *pktBuf) String() string {
if len(pkt.Data) < proto.PktHeaderLen { if len(pkt.data) < proto.PktHeaderLen {
return fmt.Sprintf("(! < PktHeaderLen) % x", pkt.Data) return fmt.Sprintf("(! < PktHeaderLen) % x", pkt.data)
} }
h := pkt.Header() h := pkt.Header()
...@@ -109,8 +115,8 @@ func (pkt *pktBuf) String() string { ...@@ -109,8 +115,8 @@ func (pkt *pktBuf) String() string {
// Dump dumps a packet in raw form // Dump dumps a packet in raw form
func (pkt *pktBuf) Dump() string { func (pkt *pktBuf) Dump() string {
if len(pkt.Data) < proto.PktHeaderLen { if len(pkt.data) < proto.PktHeaderLen {
return fmt.Sprintf("(! < pktHeaderLen) % x", pkt.Data) return fmt.Sprintf("(! < pktHeaderLen) % x", pkt.data)
} }
h := pkt.Header() h := pkt.Header()
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment