Skip to content

Commit

Permalink
refactor: never panic in rvpn_conn
Browse files Browse the repository at this point in the history
  • Loading branch information
cxz66666 committed Nov 12, 2023
1 parent 5a3edf2 commit 4887d49
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 23 deletions.
18 changes: 8 additions & 10 deletions client/rvpn_conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ type RvpnConn struct {
recvErrCount int
}

// always success or panic
// try best to read, if return err!=nil, please panic
func (r *RvpnConn) Read(p []byte) (n int, err error) {
r.recvLock.Lock()
defer r.recvLock.Unlock()
Expand All @@ -30,18 +30,17 @@ func (r *RvpnConn) Read(p []byte) (n int, err error) {
_ = r.recvConn.Close()
r.recvConn, err = r.easyConnectClient.RecvConn()
if err != nil {
// TODO graceful shutdown
panic(err)
return 0, err
}
r.recvErrCount++
if r.recvErrCount >= 5 {
panic("recv retry limit exceeded.")
return 0, err
}
}
return
}

// always success or panic
// try best to write, if return err!=nil, please panic
func (r *RvpnConn) Write(p []byte) (n int, err error) {
r.sendLock.Lock()
defer r.sendLock.Unlock()
Expand All @@ -52,12 +51,11 @@ func (r *RvpnConn) Write(p []byte) (n int, err error) {
_ = r.sendConn.Close()
r.sendConn, err = r.easyConnectClient.SendConn()
if err != nil {
// TODO graceful shutdown
panic(err)
return 0, err
}
r.sendErrCount++
if r.sendErrCount >= 5 {
panic("send retry limit exceeded.")
return 0, err
}
}
return
Expand All @@ -84,13 +82,13 @@ func NewRvpnConn(ec *EasyConnectClient) (*RvpnConn, error) {
c.sendConn, err = ec.SendConn()
if err != nil {
log.Printf("Error occurred while creating sendConn: %v", err)
panic(err)
return nil, err
}

c.recvConn, err = ec.RecvConn()
if err != nil {
log.Printf("Error occurred while creating recvConn: %v", err)
panic(err)
return nil, err
}
return c, nil
}
22 changes: 14 additions & 8 deletions stack/gvisor/stack.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,10 @@ func (ep *Endpoint) WritePackets(list stack.PacketBufferList) (int, tcpip.Error)
}

if ep.rvpnConn != nil {
n, _ := ep.rvpnConn.Write(buf)

n, err := ep.rvpnConn.Write(buf)
if err != nil {
panic(err)
}
log.DebugPrintf("Send: wrote %d bytes", n)
log.DebugDumpHex(buf[:n])
}
Expand Down Expand Up @@ -139,14 +141,18 @@ func (s *Stack) SetupResolve(r zcdns.LocalServer) {
}

func (s *Stack) Run() {

s.endpoint.rvpnConn, _ = client.NewRvpnConn(s.endpoint.easyConnectClient)

var connErr error
s.endpoint.rvpnConn, connErr = client.NewRvpnConn(s.endpoint.easyConnectClient)
if connErr != nil {
panic(connErr)
}
// Read from VPN server and send to gVisor stack
for {
buf := make([]byte, 1500)
n, _ := s.endpoint.rvpnConn.Read(buf)

buf := make([]byte, MTU)
n, err := s.endpoint.rvpnConn.Read(buf)
if err != nil {
panic(err)
}
log.DebugPrintf("Recv: read %d bytes", n)
log.DebugDumpHex(buf[:n])

Expand Down
21 changes: 16 additions & 5 deletions stack/tun/stack.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,18 +26,23 @@ func (s *Stack) SetupResolve(r zcdns.LocalServer) {
}

func (s *Stack) Run() {
s.rvpnConn, _ = client.NewRvpnConn(s.endpoint.easyConnectClient)

var connErr error
s.rvpnConn, connErr = client.NewRvpnConn(s.endpoint.easyConnectClient)
if connErr != nil {
panic(connErr)
}
// Read from VPN server and send to TUN stack
go func() {
for {
buf := make([]byte, MTU+tun.PacketOffset)
n, _ := s.rvpnConn.Read(buf)

n, err := s.rvpnConn.Read(buf)
if err != nil {
panic(err)
}
log.DebugPrintf("Recv: read %d bytes", n)
log.DebugDumpHex(buf[:n])

err := s.endpoint.Write(buf[:n])
err = s.endpoint.Write(buf[:n])
if err != nil {
log.Printf("Error occurred while writing to TUN stack: %v", err)
panic(err)
Expand Down Expand Up @@ -95,6 +100,9 @@ func (s *Stack) processIPV4TCP(packet zctcpip.IPv4Packet, tcpPacket zctcpip.TCPP
return s.endpoint.Write(packet)
}
n, err := s.rvpnConn.Write(packet)
if err != nil {
panic(err)
}
log.DebugPrintf("Send: wrote %d bytes", n)
log.DebugDumpHex(packet[:n])

Expand All @@ -118,6 +126,9 @@ func (s *Stack) processIPV4UDP(packet zctcpip.IPv4Packet, udpPacket zctcpip.UDPP
}

n, err := s.rvpnConn.Write(packet)
if err != nil {
panic(err)
}
log.DebugPrintf("Send: wrote %d bytes", n)
log.DebugDumpHex(packet[:n])

Expand Down

0 comments on commit 4887d49

Please sign in to comment.