package com.netifera.platform.net.internal.sniffing;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.osgi.service.component.ComponentContext;
import com.netifera.platform.api.log.ILogManager;
import com.netifera.platform.api.log.ILogger;
import com.netifera.platform.net.packets.IPacketHeader;
import com.netifera.platform.net.packets.link.ARP;
import com.netifera.platform.net.packets.tcpip.IPv4;
import com.netifera.platform.net.packets.tcpip.IPv6;
import com.netifera.platform.net.pcap.ICaptureInterface;
import com.netifera.platform.net.pcap.IPacketCaptureFactoryService;
import com.netifera.platform.net.pcap.ex.ICaptureInterfaceEx;
import com.netifera.platform.net.sniffing.ICaptureFileInterface;
import com.netifera.platform.net.sniffing.IPacketFilter;
import com.netifera.platform.net.sniffing.IPacketSniffer;
import com.netifera.platform.net.sniffing.IPacketSnifferHandle;
import com.netifera.platform.net.sniffing.stream.IBlockSniffer;
import com.netifera.platform.net.sniffing.stream.IBlockSnifferHandle;
import com.netifera.platform.net.sniffing.stream.IStreamSniffer;
import com.netifera.platform.net.sniffing.stream.IStreamSnifferHandle;
import com.netifera.platform.net.sniffing.util.CaptureFileInterface;
import com.netifera.platform.net.sniffing.util.IBasicInterfaceManager;
import com.netifera.platform.net.sniffing.util.IPacketSource;
import com.netifera.platform.net.sniffing.util.ISniffingEngineEx;
import com.netifera.platform.net.sniffing.util.InterfaceManager;
public class SniffingEngineService implements ISniffingEngineEx {
private final static int DEFAULT_SNAPLEN = 65535;
private final static int DEFAULT_TIMEOUT = 500;
private final int snaplen = DEFAULT_SNAPLEN;
private final int timeout = DEFAULT_TIMEOUT;
private final boolean promiscuous = true;
private IPacketCaptureFactoryService pcapFactory;
private ILogger logger;
private final Map<ICaptureInterface, InterfaceManager> physicalInterfaces = new HashMap<ICaptureInterface, InterfaceManager>();
private final Map<CaptureFileInterface, InterfaceManager> captureFileInterfaces =
new HashMap<CaptureFileInterface, InterfaceManager>();
public Collection<ICaptureInterface> getInterfaces() {
return pcapFactory.getCurrentInterfaces();
}
public ICaptureInterfaceEx getInterfaceByName(String name) {
for(ICaptureInterface iface : getInterfaces()) {
if(iface.getName().equals(name) && iface instanceof ICaptureInterfaceEx)
return (ICaptureInterfaceEx) iface;
}
return null;
}
public IPacketSnifferHandle<IPacketHeader> createRawHandle(ICaptureInterface iface,
IPacketFilter filter, IPacketSniffer<IPacketHeader> sniffer) {
return getManagerForInterface(iface).createRawHandle(filter, sniffer);
}
public IPacketSnifferHandle<ARP> createArpHandle(ICaptureInterface iface,
IPacketFilter filter, IPacketSniffer<ARP> sniffer) {
return getManagerForInterface(iface).createArpHandle(filter, sniffer);
}
public IPacketSnifferHandle<IPv4> createIPv4Handle(ICaptureInterface iface,
IPacketFilter filter, IPacketSniffer<IPv4> sniffer) {
return getManagerForInterface(iface).createIPv4Handle(filter, sniffer);
}
public IPacketSnifferHandle<IPv6> createIPv6Handle(ICaptureInterface iface,
IPacketFilter filter, IPacketSniffer<IPv6> sniffer) {
return getManagerForInterface(iface).createIPv6Handle(filter, sniffer);
}
public IStreamSnifferHandle createTcpStreamHandle(ICaptureInterface iface,
IPacketFilter filter, IStreamSniffer sniffer) {
return getManagerForInterface(iface).createTCPStreamHandle(filter, sniffer);
}
public IBlockSnifferHandle createTcpBlockHandle(ICaptureInterface iface,
IPacketFilter filter, IBlockSniffer sniffer) {
return getManagerForInterface(iface).createTCPBlockHandle(filter, sniffer);
}
public ICaptureFileInterface createCaptureFileInterface(String path) {
final CaptureFileInterface iface = new CaptureFileInterface(path, this);
if(iface.isValid()) {
// XXX Should use weak hash map?
captureFileInterfaces.put(iface, InterfaceManager.createCaptureFileManager(this, iface));
}
return iface;
}
public void removeCaptureFileInterface(CaptureFileInterface iface) {
captureFileInterfaces.remove(iface);
}
private InterfaceManager getManagerForInterface(ICaptureInterface iface) {
if (iface == null) {
throw new IllegalArgumentException("capture interface is null");
}
if(!iface.captureAvailable()) {
throw new IllegalArgumentException("Attempt to register handle on unavailable interface: " + iface.getName());
}
if (physicalInterfaces.containsKey(iface)) {
return physicalInterfaces.get(iface);
} else if(captureFileInterfaces.containsKey(iface)) {
return captureFileInterfaces.get(iface);
} else {
throw new IllegalArgumentException("No interface found for specified handle: " + iface);
}
}
private void initializeInterfaces() {
physicalInterfaces.clear();
for(ICaptureInterface iface : pcapFactory.getInterfaces()) {
if(!iface.captureAvailable() || !(iface instanceof ICaptureInterfaceEx))
continue;
physicalInterfaces.put(iface, InterfaceManager.createRawManager(this, (ICaptureInterfaceEx)iface));
}
}
public int getSnaplen() {
return snaplen;
}
public int getTimeout() {
return timeout;
}
public boolean getPromiscuous() {
return promiscuous;
}
public ILogger getLogger() {
return logger;
}
protected void setPcapFactory(IPacketCaptureFactoryService factory) {
pcapFactory = factory;
}
protected void unsetPcapFactory(IPacketCaptureFactoryService factory) {
pcapFactory = null;
}
protected void setLogManager(ILogManager logManager) {
logger = logManager.getLogger("Sniffing Engine");
}
protected void unsetLogManager(ILogManager logManager) {
}
protected void activate(ComponentContext ctx) {
initializeInterfaces();
}
protected void deactivate(ComponentContext cxt) {
physicalInterfaces.clear();
}
public IBasicInterfaceManager createInterfaceManager(
IPacketSource packetManager) {
return InterfaceManager.createBasic(packetManager);
}
}