package com.netifera.platform.net.wifi.internal.pcap;
import java.util.List;
import com.netifera.platform.net.packets.IPacketDecoder;
import com.netifera.platform.net.pcap.Datalink;
import com.netifera.platform.net.pcap.IPacketCapture;
import com.netifera.platform.net.wifi.decoders.PrismDecoder;
import com.netifera.platform.net.wifi.decoders.RadioTapDecoder;
import com.netifera.platform.net.wifi.decoders.WiFiDecoder;
import com.netifera.platform.net.wifi.pcap.IWifiPacketCapture;
public class WifiPacketCapture implements IWifiPacketCapture {
private final static IPacketDecoder wifiDecoder = new WiFiDecoder();
private final static IPacketDecoder prismDecoder = new PrismDecoder();
private final static IPacketDecoder radiotapDecoder = new RadioTapDecoder();
private final IPacketCapture packetCapture;
private final IWifiNative wifiNative;
WifiPacketCapture(IPacketCapture pcap, IWifiNative wifiNative) {
packetCapture = pcap;
this.wifiNative = wifiNative;
}
public boolean enableMonitorMode(boolean enable) {
return wifiNative.enableMonitorMode(enable);
}
public boolean setChannel(int channel) {
return wifiNative.setChannel(channel);
}
public void close() {
packetCapture.close();
}
public String getLastError() {
return packetCapture.getLastError();
}
public Datalink getLinkType() {
return packetCapture.getLinkType();
}
public boolean open() {
if(!packetCapture.open()) {
return false;
}
if(!wifiNative.enableMonitorMode(true)) {
packetCapture.close();
return false;
}
return true;
}
public boolean read() {
return packetCapture.read();
}
public int getFileDescriptor() {
return packetCapture.getFileDescriptor();
}
public List<Datalink> getDltList() {
return packetCapture.getDltList();
}
public boolean setDataLink(Datalink dlt) {
return packetCapture.setDataLink(dlt);
}
public void setError(String error) {
packetCapture.setError(error);
}
public IPacketDecoder getDecoder() {
System.out.println("DLT = " + packetCapture.getLinkType());
switch(packetCapture.getLinkType()) {
case DLT_IEEE802:
case DLT_IEEE802_11:
return wifiDecoder;
case DLT_IEEE802_11_RADIO_AVS:
return prismDecoder;
case DLT_IEEE802_11_RADIO:
return radiotapDecoder;
}
return packetCapture.getDecoder();
}
}