package com.netifera.platform.net.wifi.tools; import java.util.HashMap; import java.util.Map; import com.netifera.platform.net.daemon.sniffing.IPacketModuleContext; import com.netifera.platform.net.model.INetworkEntityFactory; import com.netifera.platform.net.model.InternetAddressEntity; import com.netifera.platform.net.sniffing.IPacketFilter; import com.netifera.platform.net.wifi.model.AccessPointEntity; import com.netifera.platform.net.wifi.model.ExtendedServiceSetEntity; import com.netifera.platform.net.wifi.model.IWirelessEntityFactory; import com.netifera.platform.net.wifi.model.WirelessStationEntity; import com.netifera.platform.net.wifi.packets.DataFrame; import com.netifera.platform.net.wifi.packets.ManagementFrame; import com.netifera.platform.net.wifi.packets.WiFiFrame; import com.netifera.platform.net.wifi.sniffing.IWifiSniffer; import com.netifera.platform.util.addresses.MACAddress; import com.netifera.platform.util.addresses.inet.InternetAddress; public class WirelessScanner implements IWifiSniffer { private final DataFrameProcessor dataProcessor; private final ManagementFrameProcessor managementProcessor; private IWirelessEntityFactory wirelessEntityFactory; private INetworkEntityFactory networkEntityFactory; private Map<String, ExtendedServiceSetEntity> essCache = new HashMap<String, ExtendedServiceSetEntity>(); private Map<MACAddress, AccessPointEntity> apCache = new HashMap<MACAddress, AccessPointEntity>(); private Map<MACAddress, WirelessStationEntity> stationCache = new HashMap<MACAddress, WirelessStationEntity>(); private Map<MACAddress, ExtendedServiceSetEntity> bssToEss = new HashMap<MACAddress, ExtendedServiceSetEntity>(); private Map<InternetAddress, WirelessStationEntity> ipToStation = new HashMap<InternetAddress, WirelessStationEntity>(); public WirelessScanner() { dataProcessor = new DataFrameProcessor(this); managementProcessor = new ManagementFrameProcessor(this); } public void handleWifiFrame(WiFiFrame frame, IPacketModuleContext ctx) { if(frame instanceof ManagementFrame) { managementProcessor.processFrame((ManagementFrame) frame, ctx); } if(frame instanceof DataFrame) { dataProcessor.processFrame((DataFrame) frame, ctx); } } void discoverAP(MACAddress bssid, IPacketModuleContext ctx) { cacheAP(bssid, ctx); } WirelessStationEntity discoverStation(MACAddress address, MACAddress bssid, IPacketModuleContext ctx) { if(address.isBroadcast() || bssid.isBroadcast()) return null; return cacheStation(address, bssid, ctx); } void discoverESS(MACAddress bss, String name, boolean encrypted, IPacketModuleContext ctx) { final ExtendedServiceSetEntity ess = cacheESS(name, ctx); if(encrypted) { ess.setEncrypted(true); ess.save(); } cacheBSStoESS(bss, ess); cacheAP(bss, ctx); } void discoverIP(InternetAddress address, WirelessStationEntity station, IPacketModuleContext ctx) { if(ipToStation.containsKey(address)) return; InternetAddressEntity addressEntity = networkEntityFactory.createAddress(ctx.getRealm(), ctx.getSpaceId(), address); ipToStation.put(address, station); station.setNetworkAddress(addressEntity); station.save(); } private ExtendedServiceSetEntity cacheESS(String name, IPacketModuleContext ctx) { if(essCache.containsKey(name)) { return essCache.get(name); } final ExtendedServiceSetEntity ess = wirelessEntityFactory.createExtendedServiceSet(ctx.getRealm(), ctx.getSpaceId(), name); essCache.put(name, ess); return ess; } private AccessPointEntity cacheAP(MACAddress bssid, IPacketModuleContext ctx) { if(apCache.containsKey(bssid)) return apCache.get(bssid); final AccessPointEntity ap = wirelessEntityFactory.createAccessPoint(ctx.getRealm(), ctx.getSpaceId(), bssid, lookupESS(bssid)); apCache.put(bssid, ap); return ap; } private WirelessStationEntity cacheStation(MACAddress address, MACAddress bssid, IPacketModuleContext ctx) { if(stationCache.containsKey(address)) return stationCache.get(address); final WirelessStationEntity station = wirelessEntityFactory.createStation(ctx.getRealm(), ctx.getSpaceId(), address, lookupESS(bssid)); stationCache.put(address, station); return station; } private void cacheBSStoESS(MACAddress bss, ExtendedServiceSetEntity ess) { if(bssToEss.containsKey(bss)) return; System.out.println("adding " + bss + " --> " + ess.getName()); bssToEss.put(bss, ess); } public ExtendedServiceSetEntity lookupESS(MACAddress bss) { if(!bssToEss.containsKey(bss)) return null; return bssToEss.get(bss); } public IPacketFilter getFilter() { return null; } public String getName() { return "Wireless Network Discovery"; } protected void setWirelessEntityFactory(IWirelessEntityFactory factory) { wirelessEntityFactory = factory; } protected void unsetWirelessEntityFactory(IWirelessEntityFactory factory) { } protected void setNetworkEntityFactory(INetworkEntityFactory factory) { networkEntityFactory = factory; } protected void unsetNetworkEntityFactory(INetworkEntityFactory factory) { } }