mirror of
https://github.com/fosrl/olm.git
synced 2026-03-01 16:26:43 +00:00
63
olm/olm.go
63
olm/olm.go
@@ -273,41 +273,37 @@ func StartTunnel(config TunnelConfig) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create shared UDP socket for both holepunch and WireGuard
|
// Create shared UDP socket for both holepunch and WireGuard
|
||||||
if sharedBind == nil {
|
sourcePort, err := util.FindAvailableUDPPort(49152, 65535)
|
||||||
sourcePort, err := util.FindAvailableUDPPort(49152, 65535)
|
if err != nil {
|
||||||
if err != nil {
|
logger.Error("Error finding available port: %v", err)
|
||||||
logger.Error("Error finding available port: %v", err)
|
return
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
localAddr := &net.UDPAddr{
|
|
||||||
Port: int(sourcePort),
|
|
||||||
IP: net.IPv4zero,
|
|
||||||
}
|
|
||||||
|
|
||||||
udpConn, err := net.ListenUDP("udp", localAddr)
|
|
||||||
if err != nil {
|
|
||||||
logger.Error("Failed to create shared UDP socket: %v", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
sharedBind, err = bind.New(udpConn)
|
|
||||||
if err != nil {
|
|
||||||
logger.Error("Failed to create shared bind: %v", err)
|
|
||||||
udpConn.Close()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add a reference for the hole punch senders (creator already has one reference for WireGuard)
|
|
||||||
sharedBind.AddRef()
|
|
||||||
|
|
||||||
logger.Info("Created shared UDP socket on port %d (refcount: %d)", sourcePort, sharedBind.GetRefCount())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
localAddr := &net.UDPAddr{
|
||||||
|
Port: int(sourcePort),
|
||||||
|
IP: net.IPv4zero,
|
||||||
|
}
|
||||||
|
|
||||||
|
udpConn, err := net.ListenUDP("udp", localAddr)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("Failed to create shared UDP socket: %v", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
sharedBind, err = bind.New(udpConn)
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("Failed to create shared bind: %v", err)
|
||||||
|
udpConn.Close()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add a reference for the hole punch senders (creator already has one reference for WireGuard)
|
||||||
|
sharedBind.AddRef()
|
||||||
|
|
||||||
|
logger.Info("Created shared UDP socket on port %d (refcount: %d)", sourcePort, sharedBind.GetRefCount())
|
||||||
|
|
||||||
// Create the holepunch manager
|
// Create the holepunch manager
|
||||||
if holePunchManager == nil {
|
holePunchManager = holepunch.NewManager(sharedBind, id, "olm")
|
||||||
holePunchManager = holepunch.NewManager(sharedBind, id, "olm")
|
|
||||||
}
|
|
||||||
|
|
||||||
olm.RegisterHandler("olm/wg/holepunch/all", func(msg websocket.WSMessage) {
|
olm.RegisterHandler("olm/wg/holepunch/all", func(msg websocket.WSMessage) {
|
||||||
logger.Debug("Received message: %v", msg.Data)
|
logger.Debug("Received message: %v", msg.Data)
|
||||||
@@ -828,6 +824,7 @@ func Close() {
|
|||||||
// Stop hole punch manager
|
// Stop hole punch manager
|
||||||
if holePunchManager != nil {
|
if holePunchManager != nil {
|
||||||
holePunchManager.Stop()
|
holePunchManager.Stop()
|
||||||
|
holePunchManager = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if stopPing != nil {
|
if stopPing != nil {
|
||||||
@@ -853,10 +850,12 @@ func Close() {
|
|||||||
uapiListener.Close()
|
uapiListener.Close()
|
||||||
uapiListener = nil
|
uapiListener = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if dev != nil {
|
if dev != nil {
|
||||||
dev.Close() // This will call sharedBind.Close() which releases WireGuard's reference
|
dev.Close() // This will call sharedBind.Close() which releases WireGuard's reference
|
||||||
dev = nil
|
dev = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close TUN device
|
// Close TUN device
|
||||||
if tdev != nil {
|
if tdev != nil {
|
||||||
tdev.Close()
|
tdev.Close()
|
||||||
|
|||||||
Reference in New Issue
Block a user