mirror of
https://github.com/netbirdio/netbird.git
synced 2024-11-29 11:33:48 +01:00
4ebf6e1c4c
Port the conn close call to eBPF proxy
45 lines
1023 B
Go
45 lines
1023 B
Go
//go:build linux && !android
|
|
|
|
package ebpf
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net"
|
|
)
|
|
|
|
// ProxyWrapper help to keep the remoteConn instance for net.Conn.Close function call
|
|
type ProxyWrapper struct {
|
|
WgeBPFProxy *WGEBPFProxy
|
|
|
|
remoteConn net.Conn
|
|
cancel context.CancelFunc // with thic cancel function, we stop remoteToLocal thread
|
|
}
|
|
|
|
func (e *ProxyWrapper) AddTurnConn(ctx context.Context, remoteConn net.Conn) (net.Addr, error) {
|
|
ctxConn, cancel := context.WithCancel(ctx)
|
|
addr, err := e.WgeBPFProxy.AddTurnConn(ctxConn, remoteConn)
|
|
|
|
if err != nil {
|
|
cancel()
|
|
return nil, fmt.Errorf("add turn conn: %w", err)
|
|
}
|
|
e.remoteConn = remoteConn
|
|
e.cancel = cancel
|
|
return addr, err
|
|
}
|
|
|
|
// CloseConn close the remoteConn and automatically remove the conn instance from the map
|
|
func (e *ProxyWrapper) CloseConn() error {
|
|
if e.cancel == nil {
|
|
return fmt.Errorf("proxy not started")
|
|
}
|
|
|
|
e.cancel()
|
|
|
|
if err := e.remoteConn.Close(); err != nil {
|
|
return fmt.Errorf("failed to close remote conn: %w", err)
|
|
}
|
|
return nil
|
|
}
|