1
0
mirror of https://github.com/fumiama/WireGold.git synced 2026-06-23 03:50:32 +08:00

fix 分片

This commit is contained in:
fumiama
2021-12-31 00:51:12 +08:00
parent 652d1ec3d2
commit 28c56adbe4
5 changed files with 43 additions and 30 deletions

2
go.mod
View File

@@ -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
View File

@@ -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=

View File

@@ -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
} }

View File

@@ -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
}

View File

@@ -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
}