1
0
mirror of https://github.com/fumiama/WireGold.git synced 2026-06-11 20:20:27 +08:00

feat(head): add more method to packet

This commit is contained in:
源文雨
2025-02-26 00:07:39 +09:00
parent fa7b9d4f0a
commit f0a853e449
7 changed files with 39 additions and 29 deletions

2
go.mod
View File

@@ -8,7 +8,7 @@ require (
github.com/fumiama/blake2b-simd v0.0.0-20220412110131-4481822068bb github.com/fumiama/blake2b-simd v0.0.0-20220412110131-4481822068bb
github.com/fumiama/go-base16384 v1.7.0 github.com/fumiama/go-base16384 v1.7.0
github.com/fumiama/go-x25519 v1.0.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/fumiama/water v0.0.0-20211231134027-da391938d6ac
github.com/klauspost/compress v1.17.9 github.com/klauspost/compress v1.17.9
github.com/sirupsen/logrus v1.9.3 github.com/sirupsen/logrus v1.9.3

4
go.sum
View File

@@ -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-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 h1:hiGg9EhseVmGCc8T1jECVkj8Keu/aJ1ZK05RM8Vuavo=
github.com/fumiama/go-x25519 v1.0.0/go.mod h1:8VOhfyGZzw4IUs4nCjQFqW9cA3V/QpSCtP3fo2dLNg4= 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-20250225150552-190281785ccc h1:fW8dJIg6Yoz8k7dQ6zdUyhud5Pgi6khbqJw/IydqrtU=
github.com/fumiama/orbyte v0.0.0-20250225143058-717b07486e38/go.mod h1:qkUllQ1+gTx5sGrmKvIsqUgsnOO21Hiq847YHJRifbk= 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 h1:A/5A0rODsg+EQHH61Ew5mMUtDpRXaSNqHhPvW+fN4C4=
github.com/fumiama/water v0.0.0-20211231134027-da391938d6ac/go.mod h1:BBnNY9PwK+UUn4trAU+H0qsMEypm7+3Bj1bVFuJItlo= 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= github.com/fumiama/wintun v0.0.0-20211229152851-8bc97c8034c0 h1:WfrSFlIlCAtg6Rt2IGna0HhJYSDE45YVHiYqO4wwsEw=

View File

@@ -63,8 +63,8 @@ func NewPacketPartial(
proto uint8, srcPort uint16, proto uint8, srcPort uint16,
dst net.IP, dstPort uint16, dst net.IP, dstPort uint16,
data pbuf.Bytes, data pbuf.Bytes,
) (p *orbyte.Item[Packet]) { ) *orbyte.Item[Packet] {
p = selectPacket() p := selectPacket()
pp := p.Pointer() pp := p.Pointer()
pp.Proto = proto pp.Proto = proto
pp.TTL = 16 pp.TTL = 16
@@ -73,7 +73,7 @@ func NewPacketPartial(
pp.Dst = dst pp.Dst = dst
pp.data = data pp.data = data
pp.b = data.Len() pp.b = data.Len()
return return p
} }
func ParsePacket(p Packet) *orbyte.Item[Packet] { 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) { func (p *Packet) ParseData(data []byte) (complete bool) {
sz := p.Len() sz := p.Len()
if sz+PacketHeadLen == len(data) { if sz+PacketHeadLen == len(data) {
p.data = pbuf.ParseBytes(data[PacketHeadLen:]...) p.data = pbuf.ParseBytes(data[PacketHeadLen:]...).Copy()
return true return true
} }
@@ -199,14 +199,14 @@ func (p *Packet) MarshalWith(
w.Write(p.Hash[:]) w.Write(p.Hash[:])
p.crc64 = CalcCRC64(w.UnsafeBytes()) p.crc64 = CalcCRC64(w.UnsafeBytes())
w.WriteUInt64(p.crc64) w.WriteUInt64(p.crc64)
w.Write(p.Body()) w.Write(p.UnsafeBody())
}) })
} }
// FillHash 生成 p.Data 的 Hash // FillHash 生成 p.Data 的 Hash
func (p *Packet) FillHash() { func (p *Packet) FillHash() {
h := blake2b.New256() h := blake2b.New256()
_, err := h.Write(p.Body()) _, err := h.Write(p.UnsafeBody())
if err != nil { if err != nil {
logrus.Errorln("[packet] err when fill hash:", err) logrus.Errorln("[packet] err when fill hash:", err)
return return
@@ -220,7 +220,7 @@ func (p *Packet) FillHash() {
// IsVaildHash 验证 packet 合法性 // IsVaildHash 验证 packet 合法性
func (p *Packet) IsVaildHash() bool { func (p *Packet) IsVaildHash() bool {
h := blake2b.New256() h := blake2b.New256()
_, err := h.Write(p.Body()) _, err := h.Write(p.UnsafeBody())
if err != nil { if err != nil {
logrus.Errorln("[packet] err when check hash:", err) logrus.Errorln("[packet] err when check hash:", err)
return false return false
@@ -228,7 +228,7 @@ func (p *Packet) IsVaildHash() bool {
var sum [32]byte var sum [32]byte
_ = h.Sum(sum[:0]) _ = h.Sum(sum[:0])
if config.ShowDebugLog { 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 calulated:", hex.EncodeToString(sum[:]))
logrus.Debugln("[packet] sum in packet:", hex.EncodeToString(p.Hash[:])) logrus.Debugln("[packet] sum in packet:", hex.EncodeToString(p.Hash[:]))
} }
@@ -254,8 +254,15 @@ func (p *Packet) CRC64() uint64 {
return p.crc64 return p.crc64
} }
// Body returns data // TransBody returns item.Trans().Slice()
func (p *Packet) Body() []byte { 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] return p.data.Bytes()[p.a:p.b]
} }

View File

@@ -47,7 +47,7 @@ func TestMarshalUnmarshal(t *testing.T) {
t.Fatal("index", i) t.Fatal("index", i)
} }
if !p.Pointer().IsVaildHash() { 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 { if p.Pointer().Proto != proto {
t.Fatal("index", i) t.Fatal("index", i)

View File

@@ -126,7 +126,7 @@ func (m *Me) waitordispatch(index int, addr p2p.EndPoint, buf pbuf.Bytes, hasntf
return return
} }
if config.ShowDebugLog { 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 { if index >= 0 {
defer hasntfinished[index].Unlock() defer hasntfinished[index].Unlock()
@@ -176,24 +176,27 @@ func (m *Me) dispatch(packet *orbyte.Item[head.Packet], addr p2p.EndPoint, index
} }
addt := pp.AdditionalData() addt := pp.AdditionalData()
var err error 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 err != nil {
if config.ShowDebugLog { if config.ShowDebugLog {
logrus.Debugln("[listen] @", index, "drop invalid packet key idx:", pp.CipherIndex(), "addt:", addt, "err:", err) logrus.Debugln("[listen] @", index, "drop invalid packet key idx:", pp.CipherIndex(), "addt:", addt, "err:", err)
} }
return return
} }
pp.SetBody(data.Trans().Bytes())
if p.usezstd { if p.usezstd {
dat, err := decodezstd(pp.Body()) dat, err := decodezstd(data.Trans().Bytes())
if err != nil { if err != nil {
if config.ShowDebugLog { if config.ShowDebugLog {
logrus.Debugln("[listen] @", index, "drop invalid zstd packet:", err) logrus.Debugln("[listen] @", index, "drop invalid zstd packet:", err)
} }
return 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 !pp.IsVaildHash() {
if config.ShowDebugLog { if config.ShowDebugLog {
logrus.Debugln("[listen] @", index, "drop invalid hash packet") 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 { switch pp.Proto {
case head.ProtoHello: case head.ProtoHello:
switch { switch {
case len(pp.Body()) == 0: case len(pp.UnsafeBody()) == 0:
logrus.Warnln("[listen] @", index, "recv old hello packet, do nothing") 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( n, err := p.WritePacket(head.NewPacketPartial(
head.ProtoHello, m.SrcPort(), p.peerip, m.DstPort(), pbuf.ParseBytes(byte(head.HelloPong))), false) head.ProtoHello, m.SrcPort(), p.peerip, m.DstPort(), pbuf.ParseBytes(byte(head.HelloPong))), false)
if err == nil { if err == nil {
@@ -218,10 +221,10 @@ func (m *Me) dispatch(packet *orbyte.Item[head.Packet], addr p2p.EndPoint, index
} }
case head.ProtoNotify: case head.ProtoNotify:
logrus.Infoln("[listen] @", index, "recv notify from", pp.Src) logrus.Infoln("[listen] @", index, "recv notify from", pp.Src)
p.onNotify(pp.Body()) p.onNotify(pp.UnsafeBody())
case head.ProtoQuery: case head.ProtoQuery:
logrus.Infoln("[listen] @", index, "recv query from", pp.Src) logrus.Infoln("[listen] @", index, "recv query from", pp.Src)
p.onQuery(pp.Body()) p.onQuery(pp.UnsafeBody())
case head.ProtoData: case head.ProtoData:
if p.pipe != nil { if p.pipe != nil {
p.pipe <- packet.Copy() 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) logrus.Debugln("[listen] @", index, "deliver to pipe of", p.peerip)
} }
} else { } else {
_, err := m.nic.Write(pp.Body()) _, err := m.nic.Write(pp.UnsafeBody())
if err != nil { if err != nil {
logrus.Errorln("[listen] @", index, "deliver", pp.BodyLen(), "bytes data to nic err:", err) logrus.Errorln("[listen] @", index, "deliver", pp.BodyLen(), "bytes data to nic err:", err)
} else if config.ShowDebugLog { } else if config.ShowDebugLog {

View File

@@ -96,7 +96,7 @@ func (l *Link) encrypt(p *head.Packet, sndcnt uint16, teatype uint8) {
if config.ShowDebugLog { if config.ShowDebugLog {
logrus.Debugln("[send] data len before encrypt:", p.BodyLen()) logrus.Debugln("[send] data len before encrypt:", p.BodyLen())
} }
data := p.Body() data := p.TransBody().Bytes()
if l.usezstd { if l.usezstd {
data = encodezstd(data).Trans().Bytes() data = encodezstd(data).Trans().Bytes()
if config.ShowDebugLog { if config.ShowDebugLog {

View File

@@ -76,10 +76,10 @@ func (s *Tunnel) Read(p []byte) (int, error) {
return 0, io.EOF return 0, io.EOF
} }
if pkt.Pointer().BodyLen() < 4 { 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 return 0, io.EOF
} }
d = pkt.Pointer().Body()[4:] d = pkt.Pointer().UnsafeBody()[4:]
} }
if d != nil { if d != nil {
if len(p) >= len(d) { if len(p) >= len(d) {
@@ -180,9 +180,9 @@ func (s *Tunnel) handleRead() {
endl = "." endl = "."
} }
if config.ShowDebugLog { 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 recvseq == seq {
if config.ShowDebugLog { if config.ShowDebugLog {
logrus.Debugln("[tunnel] dispatch seq", seq) logrus.Debugln("[tunnel] dispatch seq", seq)