Chore: upgrade gVisor
This commit is contained in:
parent
f750bc96cb
commit
f700f4b6a3
2
go.mod
2
go.mod
@ -28,7 +28,7 @@ require (
|
|||||||
golang.zx2c4.com/wireguard/windows v0.5.4-0.20220328111914-004c22c5647e
|
golang.zx2c4.com/wireguard/windows v0.5.4-0.20220328111914-004c22c5647e
|
||||||
google.golang.org/protobuf v1.28.0
|
google.golang.org/protobuf v1.28.0
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
gvisor.dev/gvisor v0.0.0-20220601233344-46e478629075
|
gvisor.dev/gvisor v0.0.0-20220614011939-d89c08b0f364
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
|
4
go.sum
4
go.sum
@ -158,5 +158,5 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33
|
|||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gvisor.dev/gvisor v0.0.0-20220601233344-46e478629075 h1:ucwwit0X39HmMQ1iSeNCIXw4g/B8bi+O6TSxxDbPs9E=
|
gvisor.dev/gvisor v0.0.0-20220614011939-d89c08b0f364 h1:D+X2kUQINrsyxdwX71CUWxxQCGRU4tS6gni5WRYLCjs=
|
||||||
gvisor.dev/gvisor v0.0.0-20220601233344-46e478629075/go.mod h1:TIvkJD0sxe8pIob3p6T8IzxXunlp6yfgktvTNp+DGNM=
|
gvisor.dev/gvisor v0.0.0-20220614011939-d89c08b0f364/go.mod h1:TIvkJD0sxe8pIob3p6T8IzxXunlp6yfgktvTNp+DGNM=
|
||||||
|
@ -8,8 +8,10 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
"github.com/Dreamacro/clash/common/pool"
|
||||||
|
|
||||||
|
"gvisor.dev/gvisor/pkg/buffer"
|
||||||
"gvisor.dev/gvisor/pkg/tcpip"
|
"gvisor.dev/gvisor/pkg/tcpip"
|
||||||
"gvisor.dev/gvisor/pkg/tcpip/buffer"
|
|
||||||
"gvisor.dev/gvisor/pkg/tcpip/header"
|
"gvisor.dev/gvisor/pkg/tcpip/header"
|
||||||
"gvisor.dev/gvisor/pkg/tcpip/link/channel"
|
"gvisor.dev/gvisor/pkg/tcpip/link/channel"
|
||||||
"gvisor.dev/gvisor/pkg/tcpip/stack"
|
"gvisor.dev/gvisor/pkg/tcpip/stack"
|
||||||
@ -93,23 +95,29 @@ func (e *Endpoint) dispatchLoop(cancel context.CancelFunc) {
|
|||||||
|
|
||||||
mtu := int(e.mtu)
|
mtu := int(e.mtu)
|
||||||
for {
|
for {
|
||||||
data := make([]byte, mtu)
|
data := pool.Get(mtu)
|
||||||
|
|
||||||
n, err := e.rw.Read(data)
|
n, err := e.rw.Read(data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
_ = pool.Put(data)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
if n == 0 || n > mtu {
|
if n == 0 || n > mtu {
|
||||||
|
_ = pool.Put(data)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if !e.IsAttached() {
|
if !e.IsAttached() {
|
||||||
|
_ = pool.Put(data)
|
||||||
continue /* unattached, drop packet */
|
continue /* unattached, drop packet */
|
||||||
}
|
}
|
||||||
|
|
||||||
pkt := stack.NewPacketBuffer(stack.PacketBufferOptions{
|
pkt := stack.NewPacketBuffer(stack.PacketBufferOptions{
|
||||||
Data: buffer.View(data[:n]).ToVectorisedView(),
|
Payload: buffer.NewWithData(data[:n]),
|
||||||
|
OnRelease: func() {
|
||||||
|
_ = pool.Put(data)
|
||||||
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
switch header.IPVersion(data) {
|
switch header.IPVersion(data) {
|
||||||
@ -117,6 +125,8 @@ func (e *Endpoint) dispatchLoop(cancel context.CancelFunc) {
|
|||||||
e.InjectInbound(header.IPv4ProtocolNumber, pkt)
|
e.InjectInbound(header.IPv4ProtocolNumber, pkt)
|
||||||
case header.IPv6Version:
|
case header.IPv6Version:
|
||||||
e.InjectInbound(header.IPv6ProtocolNumber, pkt)
|
e.InjectInbound(header.IPv6ProtocolNumber, pkt)
|
||||||
|
default:
|
||||||
|
_ = pool.Put(data)
|
||||||
}
|
}
|
||||||
pkt.DecRef()
|
pkt.DecRef()
|
||||||
}
|
}
|
||||||
@ -138,11 +148,8 @@ func (e *Endpoint) outboundLoop(ctx context.Context) {
|
|||||||
func (e *Endpoint) writePacket(pkt *stack.PacketBuffer) tcpip.Error {
|
func (e *Endpoint) writePacket(pkt *stack.PacketBuffer) tcpip.Error {
|
||||||
defer pkt.DecRef()
|
defer pkt.DecRef()
|
||||||
|
|
||||||
size := pkt.Size()
|
buf := pkt.Buffer()
|
||||||
views := pkt.Views()
|
if _, err := e.rw.Write(buf.Flatten()); err != nil {
|
||||||
|
|
||||||
vView := buffer.NewVectorisedView(size, views)
|
|
||||||
if _, err := e.rw.Write(vView.ToView()); err != nil {
|
|
||||||
return &tcpip.ErrInvalidEndpointState{}
|
return &tcpip.ErrInvalidEndpointState{}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -87,7 +87,11 @@ func (t *TUN) Write(packet []byte) (int, error) {
|
|||||||
|
|
||||||
packet = append(t.cache[:t.offset], packet...)
|
packet = append(t.cache[:t.offset], packet...)
|
||||||
|
|
||||||
return t.nt.Write(packet, t.offset)
|
n, err := t.nt.Write(packet, t.offset)
|
||||||
|
if n < t.offset {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return n - t.offset, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *TUN) Close() error {
|
func (t *TUN) Close() error {
|
||||||
|
Reference in New Issue
Block a user