Improve error processing

This commit is contained in:
世界 2022-07-30 09:51:11 +08:00
parent b4bded886e
commit 3b4e77c4c1
No known key found for this signature in database
GPG key ID: CD109927C34A63C4
5 changed files with 80 additions and 12 deletions

69
gvisor_err.go Normal file
View file

@ -0,0 +1,69 @@
package tun
import (
"net"
"gvisor.dev/gvisor/pkg/tcpip"
"gvisor.dev/gvisor/pkg/tcpip/adapters/gonet"
)
type gTCPConn struct {
*gonet.TCPConn
}
func (c *gTCPConn) Upstream() any {
return c.TCPConn
}
func (c *gTCPConn) Write(b []byte) (n int, err error) {
n, err = c.TCPConn.Write(b)
if err == nil {
return
}
err = wrapError(err)
return
}
type gUDPConn struct {
*gonet.UDPConn
}
func (c *gUDPConn) Read(b []byte) (n int, err error) {
n, err = c.UDPConn.Read(b)
if err == nil {
return
}
err = wrapError(err)
return
}
func (c *gUDPConn) Write(b []byte) (n int, err error) {
n, err = c.UDPConn.Write(b)
if err == nil {
return
}
err = wrapError(err)
return
}
func wrapStackError(err tcpip.Error) error {
switch err.(type) {
case *tcpip.ErrClosedForSend:
return net.ErrClosed
case *tcpip.ErrClosedForReceive:
return net.ErrClosed
}
return wrapStackError(err)
}
func wrapError(err error) error {
if opErr, isOpErr := err.(*net.OpError); isOpErr {
switch opErr.Err.Error() {
case "endpoint is closed for send":
return net.ErrClosed
case "endpoint is closed for receive":
return net.ErrClosed
}
}
return err
}