diff --git a/gold/head/packet.go b/gold/head/packet.go index 420b66f..4d19c7b 100644 --- a/gold/head/packet.go +++ b/gold/head/packet.go @@ -77,14 +77,17 @@ func (p *Packet) Unmarshal(data []byte) (complete bool, err error) { p.rembytes = p.DataSZ } - p.Flags = binary.LittleEndian.Uint16(data[10:12]) + flags := binary.LittleEndian.Uint16(data[10:12]) - p.Src = make(net.IP, 4) - copy(p.Src, data[12:16]) - p.Dst = make(net.IP, 4) - copy(p.Dst, data[16:20]) - copy(p.Hash[:], data[20:52]) - p.rembytes -= uint16(copy(p.Data[p.Flags<<3:], data[52:])) + if flags&0x1fff == 0 { + p.Flags = flags + p.Src = make(net.IP, 4) + copy(p.Src, data[12:16]) + p.Dst = make(net.IP, 4) + copy(p.Dst, data[16:20]) + copy(p.Hash[:], data[20:52]) + } + p.rembytes -= uint16(copy(p.Data[flags<<3:], data[52:])) complete = p.rembytes == 0 @@ -93,14 +96,14 @@ func (p *Packet) Unmarshal(data []byte) (complete bool, err error) { // Marshal 将自身数据编码为 []byte // offset 必须为 8 的倍数,表示偏移的 8 位 -func (p *Packet) Marshal(src net.IP, offset uint16, dontfrag, hasmore bool) []byte { +func (p *Packet) Marshal(src net.IP, datasz, offset uint16, dontfrag, hasmore bool) []byte { p.TTL-- if p.TTL == 0 { return nil } - p.DataSZ = uint16(len(p.Data)) if src != nil { + p.DataSZ = datasz p.Src = src offset >>= 3 if dontfrag { diff --git a/gold/link/link.go b/gold/link/link.go index 19c7661..38fe9a7 100644 --- a/gold/link/link.go +++ b/gold/link/link.go @@ -78,6 +78,8 @@ func (l *Link) Write(p *head.Packet, istransfer bool) (n int, err error) { if len(p.Data) <= int(l.me.mtu) { return l.write(p, 0, istransfer, false) } + p.FillHash() + p.Data = l.Encode(p.Data) data := p.Data totl := len(data) i := 0 @@ -121,11 +123,9 @@ func (l *Link) write(p *head.Packet, offset uint16, istransfer, hasmore bool) (n if p.Flags&0x4000 == 0x4000 && len(p.Data) > int(l.me.mtu) { return len(p.Data), errors.New("drop dont fragmnet big trans packet") } - d = p.Marshal(nil, 0, false, false) + d = p.Marshal(nil, 0, 0, false, false) } else { - p.FillHash() - p.Data = l.Encode(p.Data) - d = p.Marshal(l.me.me, offset, false, hasmore) + d = p.Marshal(l.me.me, uint16(len(p.Data)), offset, false, hasmore) } if d == nil { return 0, errors.New("[link] ttl exceeded")