diff --git a/management/internals/controllers/network_map/controller/controller.go b/management/internals/controllers/network_map/controller/controller.go index 022ea774c..2483fc191 100644 --- a/management/internals/controllers/network_map/controller/controller.go +++ b/management/internals/controllers/network_map/controller/controller.go @@ -36,6 +36,10 @@ import ( "github.com/netbirdio/netbird/util" ) +const ( + compactNetworkMapMinVersion = "v0.61.0" // TODO change to real version +) + type Controller struct { repo Repository metrics *metrics @@ -478,6 +482,12 @@ func (c *Controller) getPeerNetworkMapExp( Network: &types.Network{}, } } + + peer := account.GetPeer(peerId) + if peer != nil && supportsCompactNetworkMap(peer) { + return account.GetPeerNetworkMapCompactExp(ctx, peerId, customZone, validatedPeers, metrics) + } + return account.GetPeerNetworkMapExp(ctx, peerId, customZone, validatedPeers, metrics) } @@ -618,6 +628,19 @@ func (c *Controller) StartWarmup(ctx context.Context) { } +func supportsCompactNetworkMap(peer *nbpeer.Peer) bool { + if peer.Meta.WtVersion == "development" || peer.Meta.WtVersion == "dev" { + return true + } + + peerVersion := semver.Canonical("v" + peer.Meta.WtVersion) + if peerVersion == "" { + return false + } + + return semver.Compare(peerVersion, compactNetworkMapMinVersion) >= 0 +} + // computeForwarderPort checks if all peers in the account have updated to a specific version or newer. // If all peers have the required version, it returns the new well-known port (22054), otherwise returns 0. func computeForwarderPort(peers []*nbpeer.Peer, requiredVersion string) int64 { diff --git a/management/server/types/networkmap.go b/management/server/types/networkmap.go index c1099726f..c6551dcbb 100644 --- a/management/server/types/networkmap.go +++ b/management/server/types/networkmap.go @@ -32,6 +32,17 @@ func (a *Account) GetPeerNetworkMapExp( return a.NetworkMapCache.GetPeerNetworkMap(ctx, peerID, peersCustomZone, validatedPeers, metrics) } +func (a *Account) GetPeerNetworkMapCompactExp( + ctx context.Context, + peerID string, + peersCustomZone nbdns.CustomZone, + validatedPeers map[string]struct{}, + metrics *telemetry.AccountManagerMetrics, +) *NetworkMap { + a.initNetworkMapBuilder(validatedPeers) + return a.NetworkMapCache.GetPeerNetworkMapCompact(ctx, peerID, peersCustomZone, validatedPeers, metrics) +} + func (a *Account) OnPeerAddedUpdNetworkMapCache(peerId string) error { if a.NetworkMapCache == nil { return nil