package com.netifera.platform.net.wifi.internal.pcap.osx;
import java.nio.ByteBuffer;
import com.netifera.platform.net.pcap.Datalink;
import com.netifera.platform.net.pcap.ICaptureHeader;
import com.netifera.platform.net.pcap.ICaptureInterface;
import com.netifera.platform.net.pcap.IPacketCapture;
import com.netifera.platform.net.pcap.IPacketCaptureFactoryService;
import com.netifera.platform.net.pcap.IPacketHandler;
import com.netifera.platform.net.wifi.internal.pcap.IWifiInterfaceTester;
public class OsxWifiInterfaceTester implements IWifiInterfaceTester{
private final IPacketCaptureFactoryService pcapFactory;
public OsxWifiInterfaceTester(IPacketCaptureFactoryService pcapFactory) {
this.pcapFactory = pcapFactory;
}
private final static IPacketHandler nullHandler = new IPacketHandler() {
public void handlePacket(ByteBuffer packetData, ICaptureHeader header) {}
};
public boolean isWifiDevice(ICaptureInterface iface) {
/* Some arbitrary argument values because we just want to temporarily
* open the packet capture device so we can query which types
* of datalink are supported.
*/
final IPacketCapture pcap = pcapFactory.create(iface, 1000, false, 1000, nullHandler);
if(!pcap.open()) {
return false;
}
for(Datalink dlt : pcap.getDltList()) {
if(isMonitorDatalink(dlt)) {
pcap.close();
return true;
}
}
pcap.close();
return false;
}
private boolean isMonitorDatalink(Datalink dlt) {
switch(dlt) {
case DLT_IEEE802_11:
case DLT_IEEE802_11_RADIO:
case DLT_IEEE802_11_RADIO_AVS:
return true;
default:
return false;
}
}
}