diff --git a/gold/head/packet.go b/gold/head/packet.go index 5e5fed4..69b1efc 100644 --- a/gold/head/packet.go +++ b/gold/head/packet.go @@ -86,7 +86,9 @@ func (p *Packet) Marshal(src net.IP) []byte { } p.DataSZ = uint32(len(p.Data)) - p.Src = src + if src != nil { + p.Src = src + } packet := make([]byte, 52+len(p.Data)) binary.LittleEndian.PutUint32(packet[:4], p.DataSZ) diff --git a/gold/link/link.go b/gold/link/link.go index cc148a0..8476e3f 100644 --- a/gold/link/link.go +++ b/gold/link/link.go @@ -72,10 +72,15 @@ func (l *Link) Read() *head.Packet { } // Write 向 peer 发包 -func (l *Link) Write(p *head.Packet) (n int, err error) { +func (l *Link) Write(p *head.Packet, istransfer bool) (n int, err error) { p.FillHash() p.Data = l.Encode(p.Data) - d := p.Marshal(l.me.me) + var d []byte + if istransfer { + d = p.Marshal(nil) + } else { + d = p.Marshal(l.me.me) + } if d == nil { return 0, errors.New("[link] ttl exceeded") } diff --git a/gold/link/listen.go b/gold/link/listen.go index 4fc5828..6d8e670 100644 --- a/gold/link/listen.go +++ b/gold/link/listen.go @@ -46,7 +46,7 @@ func (m *Me) listen() (conn *net.UDPConn, err error) { case head.ProtoHello: switch p.status { case LINK_STATUS_DOWN: - _, _ = p.Write(head.NewPacket(head.ProtoHello, 0, p.peerip, 0, nil)) + _, _ = p.Write(head.NewPacket(head.ProtoHello, 0, p.peerip, 0, nil), false) logrus.Infoln("[link] send hello ack packet") p.status = LINK_STATUS_HALFUP case LINK_STATUS_HALFUP: @@ -77,7 +77,7 @@ func (m *Me) listen() (conn *net.UDPConn, err error) { } else if p.Accept(packet.Dst) { if p.allowtrans { // 转发 - p.Write(&packet) + p.Write(&packet, true) logrus.Infoln("[link] trans packet to", packet.Dst.String()+":"+strconv.Itoa(int(packet.DstPort))) } else { logrus.Warnln("[link] refused to trans packet to", packet.Dst.String()+":"+strconv.Itoa(int(packet.DstPort))) diff --git a/gold/link/nat.go b/gold/link/nat.go index 29dadaf..23065c1 100644 --- a/gold/link/nat.go +++ b/gold/link/nat.go @@ -15,7 +15,7 @@ func (l *Link) keepAlive() { go func() { t := time.NewTicker(time.Second * time.Duration(l.keepalive)) for range t.C { - _, _ = l.Write(head.NewPacket(head.ProtoHello, 0, l.peerip, 0, nil)) + _, _ = l.Write(head.NewPacket(head.ProtoHello, 0, l.peerip, 0, nil), false) logrus.Infoln("[link.nat] send keep alive packet") } }() diff --git a/gold/link/query.go b/gold/link/query.go index 31fde36..6b2b4b2 100644 --- a/gold/link/query.go +++ b/gold/link/query.go @@ -27,6 +27,6 @@ func (l *Link) SendQuery(peers ...string) error { if err != nil { return err } - _, err = l.Write(head.NewPacket(head.ProtoQuery, 0, l.peerip, 0, data)) + _, err = l.Write(head.NewPacket(head.ProtoQuery, 0, l.peerip, 0, data), false) return err } diff --git a/lower/nic.go b/lower/nic.go index 2cb5111..ed76e1b 100644 --- a/lower/nic.go +++ b/lower/nic.go @@ -79,7 +79,7 @@ func (nc *NIC) Start(m *link.Me) { logrus.Warnln("[lower] connect to peer", dst.String(), "err:", err) continue } - lnk.Write(head.NewPacket(head.ProtoData, srcport, dst, dstport, packet)) + lnk.Write(head.NewPacket(head.ProtoData, srcport, dst, dstport, packet), false) } } diff --git a/upper/services/tunnel/tunnel.go b/upper/services/tunnel/tunnel.go index 71987ed..1ee3f65 100644 --- a/upper/services/tunnel/tunnel.go +++ b/upper/services/tunnel/tunnel.go @@ -79,7 +79,7 @@ func (s *Tunnel) handleWrite() { logrus.Debugln("[tunnel] writing", len(b), "bytes...") for len(b) > int(s.mtu) { logrus.Infoln("[tunnel] split buffer") - _, err := s.l.Write(head.NewPacket(head.ProtoData, s.src, s.peerip, s.dest, b[:s.mtu])) + _, err := s.l.Write(head.NewPacket(head.ProtoData, s.src, s.peerip, s.dest, b[:s.mtu]), false) if err != nil { logrus.Errorln("[tunnel] write err:", err) return @@ -87,7 +87,7 @@ func (s *Tunnel) handleWrite() { logrus.Debugln("[tunnel] write succeeded") b = b[s.mtu:] } - _, err := s.l.Write(head.NewPacket(head.ProtoData, s.src, s.peerip, s.dest, b)) + _, err := s.l.Write(head.NewPacket(head.ProtoData, s.src, s.peerip, s.dest, b), false) if err != nil { logrus.Errorln("[tunnel] write err:", err) break