mirror of
https://github.com/fumiama/WireGold.git
synced 2026-06-22 19:40:35 +08:00
fix mtu error
This commit is contained in:
@@ -1,73 +1,11 @@
|
|||||||
package link
|
package link
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"net"
|
|
||||||
"sync"
|
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
tea "github.com/fumiama/gofastTEA"
|
tea "github.com/fumiama/gofastTEA"
|
||||||
|
|
||||||
"github.com/fumiama/WireGold/gold/head"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Me 是本机的抽象
|
|
||||||
type Me struct {
|
|
||||||
// 本机私钥
|
|
||||||
// 利用 Curve25519 生成
|
|
||||||
// https://pkg.go.dev/golang.org/x/crypto/curve25519
|
|
||||||
// https://www.zhihu.com/question/266758647
|
|
||||||
privKey [32]byte
|
|
||||||
// 本机虚拟 ip
|
|
||||||
me net.IP
|
|
||||||
// 本机子网
|
|
||||||
subnet net.IPNet
|
|
||||||
// 本机 endpoint
|
|
||||||
myend *net.UDPAddr
|
|
||||||
// 本机环回 link
|
|
||||||
loop *Link
|
|
||||||
// 本机活跃的所有连接
|
|
||||||
connections map[string]*Link
|
|
||||||
// 读写同步锁
|
|
||||||
connmapmu sync.RWMutex
|
|
||||||
// 本机监听的 endpoint
|
|
||||||
myconn *net.UDPConn
|
|
||||||
// 不分目的 link 的接收队列
|
|
||||||
pipe chan *head.Packet
|
|
||||||
// 本机路由表
|
|
||||||
router *Router
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewMe 设置本机参数
|
|
||||||
func NewMe(privateKey *[32]byte, myipwithmask string, myEndpoint string, nopipeinlink bool) (m Me) {
|
|
||||||
m.privKey = *privateKey
|
|
||||||
var err error
|
|
||||||
m.myend, err = net.ResolveUDPAddr("udp", myEndpoint)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
ip, cidr, err := net.ParseCIDR(myipwithmask)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
m.me = ip
|
|
||||||
m.subnet = *cidr
|
|
||||||
m.myconn, err = m.listen()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
m.connections = make(map[string]*Link)
|
|
||||||
if nopipeinlink {
|
|
||||||
m.pipe = make(chan *head.Packet, 32)
|
|
||||||
}
|
|
||||||
m.router = &Router{
|
|
||||||
list: make([]*net.IPNet, 1, 16),
|
|
||||||
table: make(map[string]*Link, 16),
|
|
||||||
}
|
|
||||||
m.router.SetDefault(nil)
|
|
||||||
m.loop = m.AddPeer(m.me.String(), nil, "127.0.0.1:56789", []string{myipwithmask}, 0, false, nopipeinlink)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Encode 使用 TEA 加密
|
// Encode 使用 TEA 加密
|
||||||
func (l *Link) Encode(b []byte) (eb []byte) {
|
func (l *Link) Encode(b []byte) (eb []byte) {
|
||||||
if b == nil {
|
if b == nil {
|
||||||
|
|||||||
@@ -75,6 +75,39 @@ 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) {
|
||||||
|
return l.write(p, istransfer)
|
||||||
|
}
|
||||||
|
data := p.Data
|
||||||
|
offset := 0
|
||||||
|
for len(data) > int(l.me.mtu) {
|
||||||
|
packet := *p
|
||||||
|
packet.Data = data[offset*int(l.me.mtu) : (offset+1)*int(l.me.mtu)]
|
||||||
|
i, err := l.write(&packet, istransfer)
|
||||||
|
n += i
|
||||||
|
if err != nil {
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
data = data[(offset+1)*int(l.me.mtu):]
|
||||||
|
}
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (l *Link) String() (n string) {
|
||||||
|
n = "default"
|
||||||
|
if l.pubk != nil {
|
||||||
|
b, err := base14.UTF16be2utf8(base14.Encode(l.pubk[:10]))
|
||||||
|
if err == nil {
|
||||||
|
n = helper.BytesToString(b)
|
||||||
|
} else {
|
||||||
|
n = err.Error()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// write 向 peer 发一个包
|
||||||
|
func (l *Link) write(p *head.Packet, istransfer bool) (n int, err error) {
|
||||||
var d []byte
|
var d []byte
|
||||||
if istransfer {
|
if istransfer {
|
||||||
d = p.Marshal(nil)
|
d = p.Marshal(nil)
|
||||||
@@ -102,16 +135,3 @@ func (l *Link) Write(p *head.Packet, istransfer bool) (n int, err error) {
|
|||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *Link) String() (n string) {
|
|
||||||
n = "default"
|
|
||||||
if l.pubk != nil {
|
|
||||||
b, err := base14.UTF16be2utf8(base14.Encode(l.pubk[:10]))
|
|
||||||
if err == nil {
|
|
||||||
n = helper.BytesToString(b)
|
|
||||||
} else {
|
|
||||||
n = err.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|||||||
74
gold/link/me.go
Normal file
74
gold/link/me.go
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
package link
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"github.com/fumiama/WireGold/gold/head"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Me 是本机的抽象
|
||||||
|
type Me struct {
|
||||||
|
// 本机私钥
|
||||||
|
// 利用 Curve25519 生成
|
||||||
|
// https://pkg.go.dev/golang.org/x/crypto/curve25519
|
||||||
|
// https://www.zhihu.com/question/266758647
|
||||||
|
privKey [32]byte
|
||||||
|
// 本机虚拟 ip
|
||||||
|
me net.IP
|
||||||
|
// 本机子网
|
||||||
|
subnet net.IPNet
|
||||||
|
// 本机 endpoint
|
||||||
|
myend *net.UDPAddr
|
||||||
|
// 本机环回 link
|
||||||
|
loop *Link
|
||||||
|
// 本机活跃的所有连接
|
||||||
|
connections map[string]*Link
|
||||||
|
// 读写同步锁
|
||||||
|
connmapmu sync.RWMutex
|
||||||
|
// 本机监听的 endpoint
|
||||||
|
myconn *net.UDPConn
|
||||||
|
// 不分目的 link 的接收队列
|
||||||
|
pipe chan *head.Packet
|
||||||
|
// 本机路由表
|
||||||
|
router *Router
|
||||||
|
// 虚拟链路网卡 MTU
|
||||||
|
// 默认 30000
|
||||||
|
mtu uint16
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMe 设置本机参数
|
||||||
|
func NewMe(privateKey *[32]byte, myipwithmask string, myEndpoint string, nopipeinlink bool) (m Me) {
|
||||||
|
m.privKey = *privateKey
|
||||||
|
var err error
|
||||||
|
m.myend, err = net.ResolveUDPAddr("udp", myEndpoint)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
ip, cidr, err := net.ParseCIDR(myipwithmask)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
m.me = ip
|
||||||
|
m.subnet = *cidr
|
||||||
|
m.myconn, err = m.listen()
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
m.connections = make(map[string]*Link)
|
||||||
|
if nopipeinlink {
|
||||||
|
m.pipe = make(chan *head.Packet, 32)
|
||||||
|
}
|
||||||
|
m.router = &Router{
|
||||||
|
list: make([]*net.IPNet, 1, 16),
|
||||||
|
table: make(map[string]*Link, 16),
|
||||||
|
}
|
||||||
|
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
|
||||||
|
}
|
||||||
@@ -57,8 +57,8 @@ 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, 4096)
|
buf := make([]byte, 32768) // Ring capacity
|
||||||
for nc.hasstart { // 从 NIC 发送
|
for nc.hasstart { // 从 NIC 发送
|
||||||
packet := buf
|
packet := buf
|
||||||
n, err := nc.ifce.Read(packet)
|
n, err := nc.ifce.Read(packet)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user