mirror of
https://github.com/fumiama/WireGold.git
synced 2026-06-23 03:50:32 +08:00
fix 分片
This commit is contained in:
2
go.mod
2
go.mod
@@ -6,7 +6,7 @@ require (
|
|||||||
github.com/fumiama/go-base16384 v1.2.1
|
github.com/fumiama/go-base16384 v1.2.1
|
||||||
github.com/fumiama/go-x25519 v1.0.0
|
github.com/fumiama/go-x25519 v1.0.0
|
||||||
github.com/fumiama/gofastTEA v0.0.6
|
github.com/fumiama/gofastTEA v0.0.6
|
||||||
github.com/fumiama/water v0.0.0-20211230051437-3d685121087a
|
github.com/fumiama/water v0.0.0-20211230160439-38601da6d162
|
||||||
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1
|
github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1
|
||||||
github.com/sirupsen/logrus v1.8.1
|
github.com/sirupsen/logrus v1.8.1
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
|
||||||
|
|||||||
2
go.sum
2
go.sum
@@ -12,6 +12,8 @@ github.com/fumiama/gofastTEA v0.0.6 h1:Yni3MXDbJVa/c4CecgdZDgCJK+fLdvGph+OBqY2mt
|
|||||||
github.com/fumiama/gofastTEA v0.0.6/go.mod h1:+sBZ05nCA2skZkursHNvyr8kULlEetrYTM2y5kA4rQc=
|
github.com/fumiama/gofastTEA v0.0.6/go.mod h1:+sBZ05nCA2skZkursHNvyr8kULlEetrYTM2y5kA4rQc=
|
||||||
github.com/fumiama/water v0.0.0-20211230051437-3d685121087a h1:jVm9uuodbGiBqJzPEHSpYjdFZQ+B9SwBrpXCffr90GY=
|
github.com/fumiama/water v0.0.0-20211230051437-3d685121087a h1:jVm9uuodbGiBqJzPEHSpYjdFZQ+B9SwBrpXCffr90GY=
|
||||||
github.com/fumiama/water v0.0.0-20211230051437-3d685121087a/go.mod h1:BBnNY9PwK+UUn4trAU+H0qsMEypm7+3Bj1bVFuJItlo=
|
github.com/fumiama/water v0.0.0-20211230051437-3d685121087a/go.mod h1:BBnNY9PwK+UUn4trAU+H0qsMEypm7+3Bj1bVFuJItlo=
|
||||||
|
github.com/fumiama/water v0.0.0-20211230160439-38601da6d162 h1:4thbCXSKhrmks1cnH8TEWTXBjnp0dwKuUSPgpghSG+M=
|
||||||
|
github.com/fumiama/water v0.0.0-20211230160439-38601da6d162/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=
|
||||||
github.com/fumiama/wintun v0.0.0-20211229152851-8bc97c8034c0/go.mod h1:dPOG7Af/ArO62RgBz2JJTNFByBn/IXWLo/1kZKcLSe8=
|
github.com/fumiama/wintun v0.0.0-20211229152851-8bc97c8034c0/go.mod h1:dPOG7Af/ArO62RgBz2JJTNFByBn/IXWLo/1kZKcLSe8=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
|
|||||||
@@ -75,20 +75,20 @@ func (l *Link) Read() *head.Packet {
|
|||||||
|
|
||||||
// Write 向 peer 发包
|
// Write 向 peer 发包
|
||||||
func (l *Link) Write(p *head.Packet, istransfer bool) (n int, err error) {
|
func (l *Link) Write(p *head.Packet, istransfer bool) (n int, err error) {
|
||||||
if len(p.Data) <= int(l.me.mtu) {
|
if len(p.Data) <= 32768 {
|
||||||
return l.write(p, istransfer)
|
return l.write(p, istransfer)
|
||||||
}
|
}
|
||||||
data := p.Data
|
data := p.Data
|
||||||
offset := 0
|
offset := 0
|
||||||
for len(data) > int(l.me.mtu) {
|
for len(data) > 32768 {
|
||||||
packet := *p
|
packet := *p
|
||||||
packet.Data = data[offset*int(l.me.mtu) : (offset+1)*int(l.me.mtu)]
|
packet.Data = data[offset*32768 : (offset+1)*32768]
|
||||||
i, err := l.write(&packet, istransfer)
|
i, err := l.write(&packet, istransfer)
|
||||||
n += i
|
n += i
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return n, err
|
return n, err
|
||||||
}
|
}
|
||||||
data = data[(offset+1)*int(l.me.mtu):]
|
data = data[(offset+1)*32768:]
|
||||||
}
|
}
|
||||||
return n, nil
|
return n, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,9 +32,6 @@ type Me struct {
|
|||||||
pipe chan *head.Packet
|
pipe chan *head.Packet
|
||||||
// 本机路由表
|
// 本机路由表
|
||||||
router *Router
|
router *Router
|
||||||
// 虚拟链路网卡 MTU
|
|
||||||
// 默认 30000
|
|
||||||
mtu uint16
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewMe 设置本机参数
|
// NewMe 设置本机参数
|
||||||
@@ -65,10 +62,5 @@ func NewMe(privateKey *[32]byte, myipwithmask string, myEndpoint string, nopipei
|
|||||||
}
|
}
|
||||||
m.router.SetDefault(nil)
|
m.router.SetDefault(nil)
|
||||||
m.loop = m.AddPeer(m.me.String(), nil, "127.0.0.1:56789", []string{myipwithmask}, 0, false, nopipeinlink)
|
m.loop = m.AddPeer(m.me.String(), nil, "127.0.0.1:56789", []string{myipwithmask}, 0, false, nopipeinlink)
|
||||||
m.mtu = 30000
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Me) SetMTU(mtu uint16) {
|
|
||||||
m.mtu = mtu
|
|
||||||
}
|
|
||||||
|
|||||||
53
lower/nic.go
53
lower/nic.go
@@ -1,6 +1,7 @@
|
|||||||
package lower
|
package lower
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/binary"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -57,7 +58,7 @@ func (nc *NIC) Start(m *link.Me) {
|
|||||||
logrus.Infoln("[lower] recv write", n, "bytes packet to nic")
|
logrus.Infoln("[lower] recv write", n, "bytes packet to nic")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
buf := make([]byte, 32768) // Ring capacity
|
buf := make([]byte, 32704) // 头部 52 + TEA 加密补足 16倍数
|
||||||
for nc.hasstart { // 从 NIC 发送
|
for nc.hasstart { // 从 NIC 发送
|
||||||
packet := buf
|
packet := buf
|
||||||
n, err := nc.ifce.Read(packet)
|
n, err := nc.ifce.Read(packet)
|
||||||
@@ -69,22 +70,9 @@ func (nc *NIC) Start(m *link.Me) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
packet = packet[:n]
|
packet = packet[:n]
|
||||||
if !waterutil.IsIPv4(packet) {
|
_, rem := send(m, packet)
|
||||||
logrus.Warnln("[lower] skip to send", len(packet), "bytes non-ipv4 packet")
|
for len(rem) > 0 {
|
||||||
continue
|
_, rem = send(m, rem)
|
||||||
}
|
|
||||||
dst := waterutil.IPv4Destination(packet)
|
|
||||||
srcport := waterutil.IPv4SourcePort(packet)
|
|
||||||
dstport := waterutil.IPv4DestinationPort(packet)
|
|
||||||
logrus.Infoln("[lower] sending", n, "bytes packet from :"+strconv.Itoa(int(srcport)), "to", dst.String()+":"+strconv.Itoa(int(dstport)))
|
|
||||||
lnk, err := m.Connect(dst.String())
|
|
||||||
if err != nil {
|
|
||||||
logrus.Warnln("[lower] connect to peer", dst.String(), "err:", err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
_, err = lnk.Write(head.NewPacket(head.ProtoData, srcport, dst, dstport, packet), false)
|
|
||||||
if err != nil {
|
|
||||||
logrus.Warnln("[lower] write to peer", dst.String(), "err:", err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -110,3 +98,34 @@ func execute(c string, args ...string) {
|
|||||||
logrus.Panicln("[lower] failed to exec cmd:", err)
|
logrus.Panicln("[lower] failed to exec cmd:", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func send(m *link.Me, packet []byte) (n int, rem []byte) {
|
||||||
|
if !waterutil.IsIPv4(packet) {
|
||||||
|
if waterutil.IsIPv6(packet) {
|
||||||
|
n = int(binary.BigEndian.Uint16(packet[4:6])) + 20
|
||||||
|
rem = packet[n:]
|
||||||
|
logrus.Warnln("[lower] skip to send", n, "bytes ipv6 packet")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
logrus.Warnln("[lower] skip to send", len(packet), "bytes non-ipv4/v6 packet")
|
||||||
|
return len(packet), nil
|
||||||
|
}
|
||||||
|
totl := waterutil.IPv4TotalLength(packet)
|
||||||
|
rem = packet[totl:]
|
||||||
|
packet = packet[:totl]
|
||||||
|
n = int(totl)
|
||||||
|
dst := waterutil.IPv4Destination(packet)
|
||||||
|
srcport := waterutil.IPv4SourcePort(packet)
|
||||||
|
dstport := waterutil.IPv4DestinationPort(packet)
|
||||||
|
logrus.Infoln("[lower] sending", len(packet), "bytes packet from :"+strconv.Itoa(int(srcport)), "to", dst.String()+":"+strconv.Itoa(int(dstport)))
|
||||||
|
lnk, err := m.Connect(dst.String())
|
||||||
|
if err != nil {
|
||||||
|
logrus.Warnln("[lower] connect to peer", dst.String(), "err:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err = lnk.Write(head.NewPacket(head.ProtoData, srcport, dst, dstport, packet), false)
|
||||||
|
if err != nil {
|
||||||
|
logrus.Warnln("[lower] write to peer", dst.String(), "err:", err)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user