diff --git a/go.mod b/go.mod index a37d7ef..a585310 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/fumiama/go-base16384 v1.2.1 github.com/fumiama/go-x25519 v1.0.0 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/sirupsen/logrus v1.8.1 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b diff --git a/go.sum b/go.sum index 408f1f8..f54b2d6 100644 --- a/go.sum +++ b/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/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-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/go.mod h1:dPOG7Af/ArO62RgBz2JJTNFByBn/IXWLo/1kZKcLSe8= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= diff --git a/gold/link/link.go b/gold/link/link.go index 53e180b..a8ce8b9 100644 --- a/gold/link/link.go +++ b/gold/link/link.go @@ -75,20 +75,20 @@ func (l *Link) Read() *head.Packet { // Write 向 peer 发包 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) } data := p.Data offset := 0 - for len(data) > int(l.me.mtu) { + for len(data) > 32768 { 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) n += i if err != nil { return n, err } - data = data[(offset+1)*int(l.me.mtu):] + data = data[(offset+1)*32768:] } return n, nil } diff --git a/gold/link/me.go b/gold/link/me.go index 9a5fdc3..bba8f60 100644 --- a/gold/link/me.go +++ b/gold/link/me.go @@ -32,9 +32,6 @@ type Me struct { pipe chan *head.Packet // 本机路由表 router *Router - // 虚拟链路网卡 MTU - // 默认 30000 - mtu uint16 } // NewMe 设置本机参数 @@ -65,10 +62,5 @@ func NewMe(privateKey *[32]byte, myipwithmask string, myEndpoint string, nopipei } m.router.SetDefault(nil) m.loop = m.AddPeer(m.me.String(), nil, "127.0.0.1:56789", []string{myipwithmask}, 0, false, nopipeinlink) - m.mtu = 30000 return } - -func (m *Me) SetMTU(mtu uint16) { - m.mtu = mtu -} diff --git a/lower/nic.go b/lower/nic.go index ce97cc8..17ca98f 100644 --- a/lower/nic.go +++ b/lower/nic.go @@ -1,6 +1,7 @@ package lower import ( + "encoding/binary" "os" "os/exec" "strconv" @@ -57,7 +58,7 @@ func (nc *NIC) Start(m *link.Me) { 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 发送 packet := buf n, err := nc.ifce.Read(packet) @@ -69,22 +70,9 @@ func (nc *NIC) Start(m *link.Me) { continue } packet = packet[:n] - if !waterutil.IsIPv4(packet) { - logrus.Warnln("[lower] skip to send", len(packet), "bytes non-ipv4 packet") - continue - } - 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) + _, rem := send(m, packet) + for len(rem) > 0 { + _, rem = send(m, rem) } } } @@ -110,3 +98,34 @@ func execute(c string, args ...string) { 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 +}