package com.netifera.platform.net.wifi.internal.sniffing.daemon; import java.util.Collection; import java.util.HashSet; import java.util.Set; import com.netifera.platform.api.log.ILogger; import com.netifera.platform.net.sniffing.IPacketContext; import com.netifera.platform.net.sniffing.IPacketSniffer; import com.netifera.platform.net.sniffing.ISnifferHandle; import com.netifera.platform.net.wifi.packets.WiFiFrame; import com.netifera.platform.net.wifi.pcap.IWirelessCaptureInterface; import com.netifera.platform.net.wifi.sniffing.IWifiSniffer; import com.netifera.platform.net.wifi.sniffing.IWifiSniffingEngine; public class EnabledWifiModule { private final IWifiSniffingEngine sniffingEngine; private final IWifiSniffer moduleInstance; private final Set<ISnifferHandle> activeHandles = new HashSet<ISnifferHandle>(); private final ILogger logger; private boolean running; public EnabledWifiModule(IWifiSniffingEngine engine, IWifiSniffer module, ILogger logger) { this.sniffingEngine = engine; this.moduleInstance = module; this.logger = logger; } public IWifiSniffer getModule() { return moduleInstance; } @Override public boolean equals(Object obj) { if (this == obj){ return true; } if (!(obj instanceof EnabledWifiModule)){ return false; } return moduleInstance.getName().equals( ((EnabledWifiModule)obj).moduleInstance.getName()); } @Override public int hashCode() { return moduleInstance.getName().hashCode(); } @Override public String toString() { return moduleInstance == null ? "" : moduleInstance.getName(); } private void startInterface(IWirelessCaptureInterface iface, long realm, final long spaceId) { final ISnifferHandle handle = sniffingEngine.createWifiHandle(iface, null, new IPacketSniffer<WiFiFrame>() { public void handlePacket(WiFiFrame packet, final IPacketContext ctx) { try { moduleInstance.handleWifiFrame(packet, new PacketModuleContext(ctx, spaceId)); } catch (Exception e) { logger.warning("Exception processing wifi frame", e); } } }); handle.setHighPriority(); handle.setDefaultTag(new Long(realm)); handle.register(); activeHandles.add(handle); } public synchronized void start(Collection<WifiDaemonInterface> interfaces, long spaceId) { assert(activeHandles.isEmpty()); assert(!running); for(WifiDaemonInterface iface : interfaces) { startInterface(iface.getInterface(), iface.getRealm(), spaceId); } running = true; } public synchronized void stop() { if(!running) return; for(ISnifferHandle handle : activeHandles) handle.unregister(); activeHandles.clear(); running = false; } }