mirror of
https://github.com/netbirdio/netbird.git
synced 2024-12-27 00:58:52 +01:00
68 lines
1.7 KiB
Go
68 lines
1.7 KiB
Go
|
package routemanager
|
||
|
|
||
|
import (
|
||
|
"github.com/netbirdio/netbird/route"
|
||
|
log "github.com/sirupsen/logrus"
|
||
|
"net/netip"
|
||
|
"sync"
|
||
|
)
|
||
|
|
||
|
type serverRouter struct {
|
||
|
routes map[string]*route.Route
|
||
|
// best effort to keep net forward configuration as it was
|
||
|
netForwardHistoryEnabled bool
|
||
|
mux sync.Mutex
|
||
|
firewall firewallManager
|
||
|
}
|
||
|
|
||
|
type routerPair struct {
|
||
|
ID string
|
||
|
source string
|
||
|
destination string
|
||
|
masquerade bool
|
||
|
}
|
||
|
|
||
|
func routeToRouterPair(source string, route *route.Route) routerPair {
|
||
|
parsed := netip.MustParsePrefix(source).Masked()
|
||
|
return routerPair{
|
||
|
ID: route.ID,
|
||
|
source: parsed.String(),
|
||
|
destination: route.Network.Masked().String(),
|
||
|
masquerade: route.Masquerade,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (m *DefaultManager) removeFromServerNetwork(route *route.Route) error {
|
||
|
select {
|
||
|
case <-m.ctx.Done():
|
||
|
log.Infof("not removing from server network because context is done")
|
||
|
return m.ctx.Err()
|
||
|
default:
|
||
|
m.serverRouter.mux.Lock()
|
||
|
defer m.serverRouter.mux.Unlock()
|
||
|
err := m.serverRouter.firewall.RemoveRoutingRules(routeToRouterPair(m.wgInterface.Address.String(), route))
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
delete(m.serverRouter.routes, route.ID)
|
||
|
return nil
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (m *DefaultManager) addToServerNetwork(route *route.Route) error {
|
||
|
select {
|
||
|
case <-m.ctx.Done():
|
||
|
log.Infof("not adding to server network because context is done")
|
||
|
return m.ctx.Err()
|
||
|
default:
|
||
|
m.serverRouter.mux.Lock()
|
||
|
defer m.serverRouter.mux.Unlock()
|
||
|
err := m.serverRouter.firewall.InsertRoutingRules(routeToRouterPair(m.wgInterface.Address.String(), route))
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
m.serverRouter.routes[route.ID] = route
|
||
|
return nil
|
||
|
}
|
||
|
}
|