From 2fbc5de03bb49dda84d3f121f6b217cfddbdf1a3 Mon Sep 17 00:00:00 2001
From: cyBerta <cyberta@riseup.net>
Date: Fri, 16 Aug 2024 16:07:09 +0200
Subject: [PATCH] create new openvpn connection to openvpn client when an error
in the readTCPWriteUDP loop occurs
---
client/client.go | 26 ++++++++++++++++++++++----
1 file changed, 22 insertions(+), 4 deletions(-)
diff --git a/client/client.go b/client/client.go
index 43c77a0..6eb01c8 100644
--- a/client/client.go
+++ b/client/client.go
@@ -437,20 +437,38 @@ func (c *Client) readTCPWriteUDP() {
for {
tcpBytes := <-fromTCP
-
c.openvpnAddrLock.RLock()
_, err := c.openvpnConn.WriteToUDP(tcpBytes, c.openvpnAddr)
c.openvpnAddrLock.RUnlock()
if err != nil {
c.error("Write err from %v to %v: %v", c.openvpnConn.LocalAddr(), c.openvpnConn.RemoteAddr(), err)
- time.Sleep(time.Duration(3) * time.Second)
- c.reconnect(c.obfs4Endpoints[0], 20)
- return
+ c.openvpnAddrLock.Lock()
+ c.openvpnConn.Close()
+ c.openvpnConn, err = c.createOpenvpnConnection()
+ c.openvpnAddrLock.Unlock()
+ if err != nil {
+ c.openvpnAddrLock.RLock()
+ _, err := c.openvpnConn.WriteToUDP(tcpBytes, c.openvpnAddr)
+ c.openvpnAddrLock.RUnlock()
+ if err != nil {
+ c.error("Failed to resend. %v", err)
+ }
+ }
}
}
}
}
+func (c *Client) createOpenvpnConnection() (*net.UDPConn, error) {
+ proxyAddr, err := net.ResolveUDPAddr("udp", c.ProxyAddr)
+ if err != nil {
+ c.error("cannot resolve UDP addr: %v", err)
+ return nil, err
+ }
+
+ return net.ListenUDP("udp", proxyAddr)
+}
+
func (c *Client) Stop() (bool, error) {
c.mux.Lock()
defer c.mux.Unlock()
--
GitLab