diff --git a/go.mod b/go.mod index d12ed72..89f51a0 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/fumiama/blake2b-simd v0.0.0-20220412110131-4481822068bb github.com/fumiama/go-base16384 v1.7.0 github.com/fumiama/go-x25519 v1.0.0 - github.com/fumiama/orbyte v0.0.0-20250225143058-717b07486e38 + github.com/fumiama/orbyte v0.0.0-20250225150552-190281785ccc github.com/fumiama/water v0.0.0-20211231134027-da391938d6ac github.com/klauspost/compress v1.17.9 github.com/sirupsen/logrus v1.9.3 diff --git a/go.sum b/go.sum index d6a77ff..4af92c9 100644 --- a/go.sum +++ b/go.sum @@ -11,8 +11,8 @@ github.com/fumiama/go-base16384 v1.7.0 h1:6fep7XPQWxRlh4Hu+KsdH+6+YdUp+w6CwRXtMW github.com/fumiama/go-base16384 v1.7.0/go.mod h1:OEn+947GV5gsbTAnyuUW/SrfxJYUdYupSIQXOuGOcXM= github.com/fumiama/go-x25519 v1.0.0 h1:hiGg9EhseVmGCc8T1jECVkj8Keu/aJ1ZK05RM8Vuavo= github.com/fumiama/go-x25519 v1.0.0/go.mod h1:8VOhfyGZzw4IUs4nCjQFqW9cA3V/QpSCtP3fo2dLNg4= -github.com/fumiama/orbyte v0.0.0-20250225143058-717b07486e38 h1:BZ4Hl4hKwdhbf3IzXLLJvAm8qoIm5+yudCLV245tN/0= -github.com/fumiama/orbyte v0.0.0-20250225143058-717b07486e38/go.mod h1:qkUllQ1+gTx5sGrmKvIsqUgsnOO21Hiq847YHJRifbk= +github.com/fumiama/orbyte v0.0.0-20250225150552-190281785ccc h1:fW8dJIg6Yoz8k7dQ6zdUyhud5Pgi6khbqJw/IydqrtU= +github.com/fumiama/orbyte v0.0.0-20250225150552-190281785ccc/go.mod h1:qkUllQ1+gTx5sGrmKvIsqUgsnOO21Hiq847YHJRifbk= github.com/fumiama/water v0.0.0-20211231134027-da391938d6ac h1:A/5A0rODsg+EQHH61Ew5mMUtDpRXaSNqHhPvW+fN4C4= github.com/fumiama/water v0.0.0-20211231134027-da391938d6ac/go.mod h1:BBnNY9PwK+UUn4trAU+H0qsMEypm7+3Bj1bVFuJItlo= github.com/fumiama/wintun v0.0.0-20211229152851-8bc97c8034c0 h1:WfrSFlIlCAtg6Rt2IGna0HhJYSDE45YVHiYqO4wwsEw= diff --git a/gold/head/packet.go b/gold/head/packet.go index 3cb9ee2..506f42f 100644 --- a/gold/head/packet.go +++ b/gold/head/packet.go @@ -63,8 +63,8 @@ func NewPacketPartial( proto uint8, srcPort uint16, dst net.IP, dstPort uint16, data pbuf.Bytes, -) (p *orbyte.Item[Packet]) { - p = selectPacket() +) *orbyte.Item[Packet] { + p := selectPacket() pp := p.Pointer() pp.Proto = proto pp.TTL = 16 @@ -73,7 +73,7 @@ func NewPacketPartial( pp.Dst = dst pp.data = data pp.b = data.Len() - return + return p } func ParsePacket(p Packet) *orbyte.Item[Packet] { @@ -131,7 +131,7 @@ func ParsePacketHeader(data []byte) (p *orbyte.Item[Packet], err error) { func (p *Packet) ParseData(data []byte) (complete bool) { sz := p.Len() if sz+PacketHeadLen == len(data) { - p.data = pbuf.ParseBytes(data[PacketHeadLen:]...) + p.data = pbuf.ParseBytes(data[PacketHeadLen:]...).Copy() return true } @@ -199,14 +199,14 @@ func (p *Packet) MarshalWith( w.Write(p.Hash[:]) p.crc64 = CalcCRC64(w.UnsafeBytes()) w.WriteUInt64(p.crc64) - w.Write(p.Body()) + w.Write(p.UnsafeBody()) }) } // FillHash 生成 p.Data 的 Hash func (p *Packet) FillHash() { h := blake2b.New256() - _, err := h.Write(p.Body()) + _, err := h.Write(p.UnsafeBody()) if err != nil { logrus.Errorln("[packet] err when fill hash:", err) return @@ -220,7 +220,7 @@ func (p *Packet) FillHash() { // IsVaildHash 验证 packet 合法性 func (p *Packet) IsVaildHash() bool { h := blake2b.New256() - _, err := h.Write(p.Body()) + _, err := h.Write(p.UnsafeBody()) if err != nil { logrus.Errorln("[packet] err when check hash:", err) return false @@ -228,7 +228,7 @@ func (p *Packet) IsVaildHash() bool { var sum [32]byte _ = h.Sum(sum[:0]) if config.ShowDebugLog { - logrus.Debugln("[packet] sum data len:", len(p.Body())) + logrus.Debugln("[packet] sum data len:", len(p.UnsafeBody())) logrus.Debugln("[packet] sum calulated:", hex.EncodeToString(sum[:])) logrus.Debugln("[packet] sum in packet:", hex.EncodeToString(p.Hash[:])) } @@ -254,8 +254,15 @@ func (p *Packet) CRC64() uint64 { return p.crc64 } -// Body returns data -func (p *Packet) Body() []byte { +// TransBody returns item.Trans().Slice() +func (p *Packet) TransBody() pbuf.Bytes { + d := p.data.Trans().Slice(p.a, p.b) + p.data = pbuf.Bytes{} + return d +} + +// UnsafeBody returns data +func (p *Packet) UnsafeBody() []byte { return p.data.Bytes()[p.a:p.b] } diff --git a/gold/head/packet_test.go b/gold/head/packet_test.go index 581eda4..c3ca074 100644 --- a/gold/head/packet_test.go +++ b/gold/head/packet_test.go @@ -47,7 +47,7 @@ func TestMarshalUnmarshal(t *testing.T) { t.Fatal("index", i) } if !p.Pointer().IsVaildHash() { - t.Fatal("index", i, "expect body", hex.EncodeToString(data.SliceTo(i).Bytes()), "got", hex.EncodeToString(p.Pointer().Body())) + t.Fatal("index", i, "expect body", hex.EncodeToString(data.SliceTo(i).Bytes()), "got", hex.EncodeToString(p.Pointer().UnsafeBody())) } if p.Pointer().Proto != proto { t.Fatal("index", i) diff --git a/gold/link/listen.go b/gold/link/listen.go index 73337ba..5d58979 100644 --- a/gold/link/listen.go +++ b/gold/link/listen.go @@ -126,7 +126,7 @@ func (m *Me) waitordispatch(index int, addr p2p.EndPoint, buf pbuf.Bytes, hasntf return } if config.ShowDebugLog { - logrus.Debugln("[listen] index", index, "dispatch", len(packet.Pointer().Body()), "bytes packet") + logrus.Debugln("[listen] index", index, "dispatch", len(packet.Pointer().UnsafeBody()), "bytes packet") } if index >= 0 { defer hasntfinished[index].Unlock() @@ -176,24 +176,27 @@ func (m *Me) dispatch(packet *orbyte.Item[head.Packet], addr p2p.EndPoint, index } addt := pp.AdditionalData() var err error - data, err := p.decode(pp.CipherIndex(), addt, pp.Body()) + data, err := p.decode(pp.CipherIndex(), addt, pp.UnsafeBody()) if err != nil { if config.ShowDebugLog { logrus.Debugln("[listen] @", index, "drop invalid packet key idx:", pp.CipherIndex(), "addt:", addt, "err:", err) } return } - pp.SetBody(data.Trans().Bytes()) if p.usezstd { - dat, err := decodezstd(pp.Body()) + dat, err := decodezstd(data.Trans().Bytes()) if err != nil { if config.ShowDebugLog { logrus.Debugln("[listen] @", index, "drop invalid zstd packet:", err) } return } - pp.SetBody(dat.Trans().Bytes()) + if config.ShowDebugLog { + logrus.Debugln("[listen] @", index, "zstd decoded len:", dat.Len()) + } + data = dat } + pp.SetBody(data.Trans().Bytes()) if !pp.IsVaildHash() { if config.ShowDebugLog { logrus.Debugln("[listen] @", index, "drop invalid hash packet") @@ -203,9 +206,9 @@ func (m *Me) dispatch(packet *orbyte.Item[head.Packet], addr p2p.EndPoint, index switch pp.Proto { case head.ProtoHello: switch { - case len(pp.Body()) == 0: + case len(pp.UnsafeBody()) == 0: logrus.Warnln("[listen] @", index, "recv old hello packet, do nothing") - case pp.Body()[0] == byte(head.HelloPing): + case pp.UnsafeBody()[0] == byte(head.HelloPing): n, err := p.WritePacket(head.NewPacketPartial( head.ProtoHello, m.SrcPort(), p.peerip, m.DstPort(), pbuf.ParseBytes(byte(head.HelloPong))), false) if err == nil { @@ -218,10 +221,10 @@ func (m *Me) dispatch(packet *orbyte.Item[head.Packet], addr p2p.EndPoint, index } case head.ProtoNotify: logrus.Infoln("[listen] @", index, "recv notify from", pp.Src) - p.onNotify(pp.Body()) + p.onNotify(pp.UnsafeBody()) case head.ProtoQuery: logrus.Infoln("[listen] @", index, "recv query from", pp.Src) - p.onQuery(pp.Body()) + p.onQuery(pp.UnsafeBody()) case head.ProtoData: if p.pipe != nil { p.pipe <- packet.Copy() @@ -229,7 +232,7 @@ func (m *Me) dispatch(packet *orbyte.Item[head.Packet], addr p2p.EndPoint, index logrus.Debugln("[listen] @", index, "deliver to pipe of", p.peerip) } } else { - _, err := m.nic.Write(pp.Body()) + _, err := m.nic.Write(pp.UnsafeBody()) if err != nil { logrus.Errorln("[listen] @", index, "deliver", pp.BodyLen(), "bytes data to nic err:", err) } else if config.ShowDebugLog { diff --git a/gold/link/send.go b/gold/link/send.go index 5bad4fc..fb76aae 100644 --- a/gold/link/send.go +++ b/gold/link/send.go @@ -96,7 +96,7 @@ func (l *Link) encrypt(p *head.Packet, sndcnt uint16, teatype uint8) { if config.ShowDebugLog { logrus.Debugln("[send] data len before encrypt:", p.BodyLen()) } - data := p.Body() + data := p.TransBody().Bytes() if l.usezstd { data = encodezstd(data).Trans().Bytes() if config.ShowDebugLog { diff --git a/upper/services/tunnel/tunnel.go b/upper/services/tunnel/tunnel.go index db84d16..03b52df 100644 --- a/upper/services/tunnel/tunnel.go +++ b/upper/services/tunnel/tunnel.go @@ -76,10 +76,10 @@ func (s *Tunnel) Read(p []byte) (int, error) { return 0, io.EOF } if pkt.Pointer().BodyLen() < 4 { - logrus.Warnln("[tunnel] unexpected packet data len", pkt.Pointer().BodyLen(), "content", hex.EncodeToString(pkt.Pointer().Body())) + logrus.Warnln("[tunnel] unexpected packet data len", pkt.Pointer().BodyLen(), "content", hex.EncodeToString(pkt.Pointer().UnsafeBody())) return 0, io.EOF } - d = pkt.Pointer().Body()[4:] + d = pkt.Pointer().UnsafeBody()[4:] } if d != nil { if len(p) >= len(d) { @@ -180,9 +180,9 @@ func (s *Tunnel) handleRead() { endl = "." } if config.ShowDebugLog { - logrus.Debugln("[tunnel] read recv", hex.EncodeToString(pp.Body()[:end]), endl) + logrus.Debugln("[tunnel] read recv", hex.EncodeToString(pp.UnsafeBody()[:end]), endl) } - recvseq := binary.LittleEndian.Uint32(pp.Body()[:4]) + recvseq := binary.LittleEndian.Uint32(pp.UnsafeBody()[:4]) if recvseq == seq { if config.ShowDebugLog { logrus.Debugln("[tunnel] dispatch seq", seq)