diff --git a/client/internal/peer/status.go b/client/internal/peer/status.go index 0f5470db2..26f0bb757 100644 --- a/client/internal/peer/status.go +++ b/client/internal/peer/status.go @@ -109,7 +109,7 @@ type LocalPeerState struct { PubKey string KernelInterface bool FQDN string - Routes map[string]struct{} + Routes map[RouteWithResourceId]struct{} } // Clone returns a copy of the LocalPeerState @@ -372,7 +372,7 @@ func (d *Status) CheckRoutes(src, dst netip.Addr) (srcMatchedPeerIP string, dstM // check local peer routes. if d.localPeer.Routes != nil { for route := range d.localPeer.Routes { - prefix, err := netip.ParsePrefix(route) + prefix, err := netip.ParsePrefix(route.Route) if err != nil { log.Debugf("failed to parse route %s: %v", route, err) continue diff --git a/client/internal/routemanager/server_nonandroid.go b/client/internal/routemanager/server_nonandroid.go index 5b6a788f8..92505e227 100644 --- a/client/internal/routemanager/server_nonandroid.go +++ b/client/internal/routemanager/server_nonandroid.go @@ -104,7 +104,10 @@ func (m *serverRouter) removeFromServerNetwork(route *route.Route) error { delete(m.routes, route.ID) state := m.statusRecorder.GetLocalPeerState() - delete(state.Routes, route.Network.String()) + delete(state.Routes, peer.RouteWithResourceId{ + Route: route.Network.String(), + ResourceId: route.GetResourceID(), + }) m.statusRecorder.UpdateLocalPeerState(state) return nil @@ -133,14 +136,17 @@ func (m *serverRouter) addToServerNetwork(route *route.Route) error { state := m.statusRecorder.GetLocalPeerState() if state.Routes == nil { - state.Routes = map[string]struct{}{} + state.Routes = map[peer.RouteWithResourceId]struct{}{} } routeStr := route.Network.String() if route.IsDynamic() { routeStr = route.Domains.SafeString() } - state.Routes[routeStr] = struct{}{} + state.Routes[peer.RouteWithResourceId{ + Route: routeStr, + ResourceId: route.GetResourceID(), + }] = struct{}{} m.statusRecorder.UpdateLocalPeerState(state) diff --git a/client/server/debug.go b/client/server/debug.go index d5b0002f3..b5c10c2c8 100644 --- a/client/server/debug.go +++ b/client/server/debug.go @@ -619,7 +619,7 @@ func seedFromStatus(a *anonymize.Anonymizer, status *peer.FullStatus) { } for route := range status.LocalPeerState.Routes { - a.AnonymizeRoute(route) + a.AnonymizeRoute(route.Route) } for _, nsGroup := range status.NSGroupStates { diff --git a/client/server/server.go b/client/server/server.go index d3610e553..8d3ca2627 100644 --- a/client/server/server.go +++ b/client/server/server.go @@ -11,7 +11,6 @@ import ( "time" "github.com/cenkalti/backoff/v4" - "golang.org/x/exp/maps" "google.golang.org/protobuf/types/known/durationpb" log "github.com/sirupsen/logrus" @@ -803,13 +802,19 @@ func toProtoFullStatus(fullStatus peer.FullStatus) *proto.FullStatus { pbFullStatus.SignalState.Error = err.Error() } + localState := fullStatus.LocalPeerState.Clone() + var routesSlice []string + for route := range localState.Routes { + routesSlice = append(routesSlice, route.Route) + } + pbFullStatus.LocalPeerState.IP = fullStatus.LocalPeerState.IP pbFullStatus.LocalPeerState.PubKey = fullStatus.LocalPeerState.PubKey pbFullStatus.LocalPeerState.KernelInterface = fullStatus.LocalPeerState.KernelInterface pbFullStatus.LocalPeerState.Fqdn = fullStatus.LocalPeerState.FQDN pbFullStatus.LocalPeerState.RosenpassPermissive = fullStatus.RosenpassState.Permissive pbFullStatus.LocalPeerState.RosenpassEnabled = fullStatus.RosenpassState.Enabled - pbFullStatus.LocalPeerState.Networks = maps.Keys(fullStatus.LocalPeerState.Routes) + pbFullStatus.LocalPeerState.Networks = routesSlice pbFullStatus.NumberOfForwardingRules = int32(fullStatus.NumOfForwardingRules) for _, peerState := range fullStatus.Peers {