diff --git a/modules/wifi_recon.go b/modules/wifi_recon.go index 239da8b3..ed326142 100644 --- a/modules/wifi_recon.go +++ b/modules/wifi_recon.go @@ -29,11 +29,21 @@ func (w *WiFiModule) stationPruner() { log.Debug("WiFi stations pruner started.") for w.Running() { - for _, s := range w.Session.WiFi.List() { - sinceLastSeen := time.Since(s.LastSeen) + // loop every AP + for _, ap := range w.Session.WiFi.List() { + sinceLastSeen := time.Since(ap.LastSeen) if sinceLastSeen > maxStationTTL { - log.Debug("Station %s not seen in %s, removing.", s.BSSID(), sinceLastSeen) - w.Session.WiFi.Remove(s.BSSID()) + log.Debug("Station %s not seen in %s, removing.", ap.BSSID(), sinceLastSeen) + w.Session.WiFi.Remove(ap.BSSID()) + continue + } + // loop every AP client + for _, c := range ap.Clients() { + sinceLastSeen := time.Since(c.LastSeen) + if sinceLastSeen > maxStationTTL { + log.Debug("Client %s of station %s not seen in %s, removing.", c.String(), ap.BSSID(), sinceLastSeen) + ap.RemoveClient(c.BSSID()) + } } } time.Sleep(1 * time.Second) diff --git a/network/wifi_ap.go b/network/wifi_ap.go index 8900c207..7486359d 100644 --- a/network/wifi_ap.go +++ b/network/wifi_ap.go @@ -49,6 +49,16 @@ func (ap *AccessPoint) Get(bssid string) (*Station, bool) { return nil, false } +func (ap *AccessPoint) RemoveClient(mac string) { + ap.Lock() + defer ap.Unlock() + + bssid := NormalizeMac(mac) + if _, found := ap.clients[bssid]; found { + delete(ap.clients, bssid) + } +} + func (ap *AccessPoint) AddClient(bssid string, frequency int, rssi int8) *Station { ap.Lock() defer ap.Unlock()