package com.netifera.platform.net.wifi.tools;
import com.netifera.platform.net.daemon.sniffing.IPacketModuleContext;
import com.netifera.platform.net.packets.tcpip.IP;
import com.netifera.platform.net.wifi.model.ExtendedServiceSetEntity;
import com.netifera.platform.net.wifi.model.WirelessStationEntity;
import com.netifera.platform.net.wifi.packets.DataFrame;
public class DataFrameProcessor {
private final WirelessScanner scanner;
DataFrameProcessor(WirelessScanner scanner) {
this.scanner = scanner;
}
void processFrame(DataFrame frame, IPacketModuleContext ctx) {
final boolean toDS = frame.isToDistribution();
final boolean fromDS = frame.isFromDistribution();
ExtendedServiceSetEntity ess = findESS(frame);
if(ess == null) {
ctx.abortProcessing();
return;
} else {
System.out.println("[" + ess.getName() + "] " + frame.print());
ctx.setRealm(ess.getId());
}
WirelessStationEntity station;
if(toDS && !fromDS) {
station = scanner.discoverStation(frame.source(), frame.destination(), ctx);
IP ip = (IP) frame.findHeader(IP.class);
if(station == null || ip == null) return;
scanner.discoverIP(ip.getSourceAddress(), station, ctx);
} else if(fromDS && !toDS) {
station = scanner.discoverStation(frame.destination(), frame.source(), ctx);
IP ip = (IP) frame.findHeader(IP.class);
if(station == null || ip == null) return;
scanner.discoverIP(ip.getDestinationAddress(), station, ctx);
}
}
private ExtendedServiceSetEntity findESS(DataFrame frame) {
if(frame.isFromDistribution()) {
return scanner.lookupESS(frame.source());
} else if(frame.isToDistribution()) {
return scanner.lookupESS(frame.destination());
} else {
return null;
}
}
}