mirror of
https://github.com/fumiama/WireGold.git
synced 2026-06-11 20:20:27 +08:00
add istransfer option in link.Write
This commit is contained in:
@@ -86,7 +86,9 @@ func (p *Packet) Marshal(src net.IP) []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
p.DataSZ = uint32(len(p.Data))
|
p.DataSZ = uint32(len(p.Data))
|
||||||
p.Src = src
|
if src != nil {
|
||||||
|
p.Src = src
|
||||||
|
}
|
||||||
|
|
||||||
packet := make([]byte, 52+len(p.Data))
|
packet := make([]byte, 52+len(p.Data))
|
||||||
binary.LittleEndian.PutUint32(packet[:4], p.DataSZ)
|
binary.LittleEndian.PutUint32(packet[:4], p.DataSZ)
|
||||||
|
|||||||
@@ -72,10 +72,15 @@ func (l *Link) Read() *head.Packet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Write 向 peer 发包
|
// 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.FillHash()
|
||||||
p.Data = l.Encode(p.Data)
|
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 {
|
if d == nil {
|
||||||
return 0, errors.New("[link] ttl exceeded")
|
return 0, errors.New("[link] ttl exceeded")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ func (m *Me) listen() (conn *net.UDPConn, err error) {
|
|||||||
case head.ProtoHello:
|
case head.ProtoHello:
|
||||||
switch p.status {
|
switch p.status {
|
||||||
case LINK_STATUS_DOWN:
|
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")
|
logrus.Infoln("[link] send hello ack packet")
|
||||||
p.status = LINK_STATUS_HALFUP
|
p.status = LINK_STATUS_HALFUP
|
||||||
case 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) {
|
} else if p.Accept(packet.Dst) {
|
||||||
if p.allowtrans {
|
if p.allowtrans {
|
||||||
// 转发
|
// 转发
|
||||||
p.Write(&packet)
|
p.Write(&packet, true)
|
||||||
logrus.Infoln("[link] trans packet to", packet.Dst.String()+":"+strconv.Itoa(int(packet.DstPort)))
|
logrus.Infoln("[link] trans packet to", packet.Dst.String()+":"+strconv.Itoa(int(packet.DstPort)))
|
||||||
} else {
|
} else {
|
||||||
logrus.Warnln("[link] refused to trans packet to", packet.Dst.String()+":"+strconv.Itoa(int(packet.DstPort)))
|
logrus.Warnln("[link] refused to trans packet to", packet.Dst.String()+":"+strconv.Itoa(int(packet.DstPort)))
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ func (l *Link) keepAlive() {
|
|||||||
go func() {
|
go func() {
|
||||||
t := time.NewTicker(time.Second * time.Duration(l.keepalive))
|
t := time.NewTicker(time.Second * time.Duration(l.keepalive))
|
||||||
for range t.C {
|
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")
|
logrus.Infoln("[link.nat] send keep alive packet")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|||||||
@@ -27,6 +27,6 @@ func (l *Link) SendQuery(peers ...string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
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
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ func (nc *NIC) Start(m *link.Me) {
|
|||||||
logrus.Warnln("[lower] connect to peer", dst.String(), "err:", err)
|
logrus.Warnln("[lower] connect to peer", dst.String(), "err:", err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
lnk.Write(head.NewPacket(head.ProtoData, srcport, dst, dstport, packet))
|
lnk.Write(head.NewPacket(head.ProtoData, srcport, dst, dstport, packet), false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ func (s *Tunnel) handleWrite() {
|
|||||||
logrus.Debugln("[tunnel] writing", len(b), "bytes...")
|
logrus.Debugln("[tunnel] writing", len(b), "bytes...")
|
||||||
for len(b) > int(s.mtu) {
|
for len(b) > int(s.mtu) {
|
||||||
logrus.Infoln("[tunnel] split buffer")
|
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 {
|
if err != nil {
|
||||||
logrus.Errorln("[tunnel] write err:", err)
|
logrus.Errorln("[tunnel] write err:", err)
|
||||||
return
|
return
|
||||||
@@ -87,7 +87,7 @@ func (s *Tunnel) handleWrite() {
|
|||||||
logrus.Debugln("[tunnel] write succeeded")
|
logrus.Debugln("[tunnel] write succeeded")
|
||||||
b = b[s.mtu:]
|
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 {
|
if err != nil {
|
||||||
logrus.Errorln("[tunnel] write err:", err)
|
logrus.Errorln("[tunnel] write err:", err)
|
||||||
break
|
break
|
||||||
|
|||||||
Reference in New Issue
Block a user