mirror of
https://github.com/netbirdio/netbird.git
synced 2024-12-12 18:00:49 +01:00
Avoid ebpf lib usage on non Linux
This commit is contained in:
parent
56879517f1
commit
1c84d6b3b6
@ -30,7 +30,7 @@ type serviceViaListener struct {
|
|||||||
listenPort int
|
listenPort int
|
||||||
listenerIsRunning bool
|
listenerIsRunning bool
|
||||||
listenerFlagLock sync.Mutex
|
listenerFlagLock sync.Mutex
|
||||||
ebpfService *ebpf.Manager
|
ebpfService ebpf.Manager
|
||||||
}
|
}
|
||||||
|
|
||||||
func newServiceViaListener(wgIface WGIface, customAddr *netip.AddrPort) *serviceViaListener {
|
func newServiceViaListener(wgIface WGIface, customAddr *netip.AddrPort) *serviceViaListener {
|
||||||
@ -59,7 +59,7 @@ func (s *serviceViaListener) Listen() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
s.listenIP, s.listenPort, err = s.evalRuntimeAddress()
|
s.listenIP, s.listenPort, err = s.evalListenAddress()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Errorf("failed to eval runtime address: %s", err)
|
log.Errorf("failed to eval runtime address: %s", err)
|
||||||
return err
|
return err
|
||||||
@ -163,7 +163,7 @@ func (s *serviceViaListener) getFirstListenerAvailable() (string, int, error) {
|
|||||||
return "", 0, fmt.Errorf("unable to find an unused ip and port combination. IPs tested: %v and ports %v", ips, ports)
|
return "", 0, fmt.Errorf("unable to find an unused ip and port combination. IPs tested: %v and ports %v", ips, ports)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *serviceViaListener) evalRuntimeAddress() (string, int, error) {
|
func (s *serviceViaListener) evalListenAddress() (string, int, error) {
|
||||||
if s.customAddr != nil {
|
if s.customAddr != nil {
|
||||||
return s.customAddr.Addr().String(), int(s.customAddr.Port()), nil
|
return s.customAddr.Addr().String(), int(s.customAddr.Port()), nil
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
//go:build !android
|
||||||
|
|
||||||
package ebpf
|
package ebpf
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -12,7 +14,7 @@ const (
|
|||||||
mapKeyDNSPort uint32 = 1
|
mapKeyDNSPort uint32 = 1
|
||||||
)
|
)
|
||||||
|
|
||||||
func (tf *Manager) LoadDNSFwd(ip string, dnsPort int) error {
|
func (tf *GeneralManager) LoadDNSFwd(ip string, dnsPort int) error {
|
||||||
log.Debugf("load ebpf DNS forwarder: address: %s:%d", ip, dnsPort)
|
log.Debugf("load ebpf DNS forwarder: address: %s:%d", ip, dnsPort)
|
||||||
tf.lock.Lock()
|
tf.lock.Lock()
|
||||||
defer tf.lock.Unlock()
|
defer tf.lock.Unlock()
|
||||||
@ -40,7 +42,7 @@ func (tf *Manager) LoadDNSFwd(ip string, dnsPort int) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tf *Manager) FreeDNSFwd() error {
|
func (tf *GeneralManager) FreeDNSFwd() error {
|
||||||
log.Debugf("free ebpf DNS forwarder")
|
log.Debugf("free ebpf DNS forwarder")
|
||||||
return tf.unsetFeatureFlag(featureFlagDnsForwarder)
|
return tf.unsetFeatureFlag(featureFlagDnsForwarder)
|
||||||
}
|
}
|
8
client/internal/ebpf/manager.go
Normal file
8
client/internal/ebpf/manager.go
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
package ebpf
|
||||||
|
|
||||||
|
type Manager interface {
|
||||||
|
LoadDNSFwd(ip string, dnsPort int) error
|
||||||
|
FreeDNSFwd() error
|
||||||
|
LoadWgProxy(proxyPort, wgPort int) error
|
||||||
|
FreeWGProxy() error
|
||||||
|
}
|
@ -1,3 +1,5 @@
|
|||||||
|
//go:build !android
|
||||||
|
|
||||||
package ebpf
|
package ebpf
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -18,14 +20,14 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
singleton *Manager
|
singleton Manager
|
||||||
singletonLock = &sync.Mutex{}
|
singletonLock = &sync.Mutex{}
|
||||||
)
|
)
|
||||||
|
|
||||||
// libbpf-dev, libc6-dev-i386-amd64-cross
|
// required packages libbpf-dev, libc6-dev-i386-amd64-cross
|
||||||
|
|
||||||
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go -cc clang-14 bpf src/prog.c -- -I /usr/x86_64-linux-gnu/include
|
//go:generate go run github.com/cilium/ebpf/cmd/bpf2go -cc clang-14 bpf src/prog.c -- -I /usr/x86_64-linux-gnu/include
|
||||||
type Manager struct {
|
type GeneralManager struct {
|
||||||
lock sync.Mutex
|
lock sync.Mutex
|
||||||
link link.Link
|
link link.Link
|
||||||
featureFlags uint16
|
featureFlags uint16
|
||||||
@ -33,21 +35,21 @@ type Manager struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// GetEbpfManagerInstance return a static eBpf Manager instance
|
// GetEbpfManagerInstance return a static eBpf Manager instance
|
||||||
func GetEbpfManagerInstance() *Manager {
|
func GetEbpfManagerInstance() Manager {
|
||||||
singletonLock.Lock()
|
singletonLock.Lock()
|
||||||
defer singletonLock.Unlock()
|
defer singletonLock.Unlock()
|
||||||
if singleton != nil {
|
if singleton != nil {
|
||||||
return singleton
|
return singleton
|
||||||
}
|
}
|
||||||
singleton = &Manager{}
|
singleton = &GeneralManager{}
|
||||||
return singleton
|
return singleton
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tf *Manager) setFeatureFlag(feature uint16) {
|
func (tf *GeneralManager) setFeatureFlag(feature uint16) {
|
||||||
tf.featureFlags = tf.featureFlags | feature
|
tf.featureFlags = tf.featureFlags | feature
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tf *Manager) loadXdp() error {
|
func (tf *GeneralManager) loadXdp() error {
|
||||||
if tf.link != nil {
|
if tf.link != nil {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -75,7 +77,7 @@ func (tf *Manager) loadXdp() error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tf *Manager) unsetFeatureFlag(feature uint16) error {
|
func (tf *GeneralManager) unsetFeatureFlag(feature uint16) error {
|
||||||
tf.lock.Lock()
|
tf.lock.Lock()
|
||||||
defer tf.lock.Unlock()
|
defer tf.lock.Unlock()
|
||||||
tf.featureFlags &^= feature
|
tf.featureFlags &^= feature
|
||||||
@ -91,7 +93,7 @@ func (tf *Manager) unsetFeatureFlag(feature uint16) error {
|
|||||||
return tf.bpfObjs.NbFeatures.Put(mapKeyFeatures, tf.featureFlags)
|
return tf.bpfObjs.NbFeatures.Put(mapKeyFeatures, tf.featureFlags)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tf *Manager) close() error {
|
func (tf *GeneralManager) close() error {
|
||||||
log.Debugf("detach ebpf program ")
|
log.Debugf("detach ebpf program ")
|
||||||
err := tf.bpfObjs.Close()
|
err := tf.bpfObjs.Close()
|
||||||
if err != nil {
|
if err != nil {
|
@ -5,7 +5,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestManager_setFeatureFlag(t *testing.T) {
|
func TestManager_setFeatureFlag(t *testing.T) {
|
||||||
mgr := Manager{}
|
mgr := GeneralManager{}
|
||||||
mgr.setFeatureFlag(featureFlagWGProxy)
|
mgr.setFeatureFlag(featureFlagWGProxy)
|
||||||
if mgr.featureFlags != 1 {
|
if mgr.featureFlags != 1 {
|
||||||
t.Errorf("invalid faeture state")
|
t.Errorf("invalid faeture state")
|
||||||
@ -18,7 +18,7 @@ func TestManager_setFeatureFlag(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestManager_unsetFeatureFlag(t *testing.T) {
|
func TestManager_unsetFeatureFlag(t *testing.T) {
|
||||||
mgr := Manager{}
|
mgr := GeneralManager{}
|
||||||
mgr.setFeatureFlag(featureFlagWGProxy)
|
mgr.setFeatureFlag(featureFlagWGProxy)
|
||||||
mgr.setFeatureFlag(featureFlagDnsForwarder)
|
mgr.setFeatureFlag(featureFlagDnsForwarder)
|
||||||
|
|
8
client/internal/ebpf/manager_nonlinux.go
Normal file
8
client/internal/ebpf/manager_nonlinux.go
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
//go:build !linux || android
|
||||||
|
|
||||||
|
package ebpf
|
||||||
|
|
||||||
|
// GetEbpfManagerInstance return error because ebpf is not supported on all os
|
||||||
|
func GetEbpfManagerInstance() Manager {
|
||||||
|
panic("unsupported os")
|
||||||
|
}
|
@ -1,3 +1,5 @@
|
|||||||
|
//go:build !android
|
||||||
|
|
||||||
package ebpf
|
package ebpf
|
||||||
|
|
||||||
import log "github.com/sirupsen/logrus"
|
import log "github.com/sirupsen/logrus"
|
||||||
@ -7,7 +9,7 @@ const (
|
|||||||
mapKeyWgPort uint32 = 1
|
mapKeyWgPort uint32 = 1
|
||||||
)
|
)
|
||||||
|
|
||||||
func (tf *Manager) LoadWgProxy(proxyPort, wgPort int) error {
|
func (tf *GeneralManager) LoadWgProxy(proxyPort, wgPort int) error {
|
||||||
log.Debugf("load ebpf WG proxy")
|
log.Debugf("load ebpf WG proxy")
|
||||||
tf.lock.Lock()
|
tf.lock.Lock()
|
||||||
defer tf.lock.Unlock()
|
defer tf.lock.Unlock()
|
||||||
@ -35,7 +37,7 @@ func (tf *Manager) LoadWgProxy(proxyPort, wgPort int) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tf *Manager) FreeWGProxy() error {
|
func (tf *GeneralManager) FreeWGProxy() error {
|
||||||
log.Debugf("free ebpf WG proxy")
|
log.Debugf("free ebpf WG proxy")
|
||||||
return tf.unsetFeatureFlag(featureFlagWGProxy)
|
return tf.unsetFeatureFlag(featureFlagWGProxy)
|
||||||
}
|
}
|
@ -19,7 +19,7 @@ import (
|
|||||||
|
|
||||||
// WGEBPFProxy definition for proxy with EBPF support
|
// WGEBPFProxy definition for proxy with EBPF support
|
||||||
type WGEBPFProxy struct {
|
type WGEBPFProxy struct {
|
||||||
ebpfManager *ebpf.Manager
|
ebpfManager ebpf.Manager
|
||||||
lastUsedPort uint16
|
lastUsedPort uint16
|
||||||
localWGListenPort int
|
localWGListenPort int
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user