package com.netifera.platform.net.daemon.sniffing.modules.arp;
import com.netifera.platform.net.daemon.sniffing.IArpSniffer;
import com.netifera.platform.net.daemon.sniffing.IPacketModuleContext;
import com.netifera.platform.net.internal.daemon.sniffing.modules.Activator;
import com.netifera.platform.net.model.INetworkEntityFactory;
import com.netifera.platform.net.packets.link.ARP;
import com.netifera.platform.net.sniffing.IPacketFilter;
import com.netifera.platform.util.addresses.IHardwareAddress;
import com.netifera.platform.util.addresses.INetworkAddress;
import com.netifera.platform.util.addresses.inet.InternetAddress;
public class ArpSniffer implements IArpSniffer {
public IPacketFilter getFilter() {
return null;
}
public String getName() {
return "ARP Information Gathering";
}
public void handleArpPacket(ARP arp, IPacketModuleContext ctx) {
if(arp.isRequest()) {
handleRequest(arp, ctx.getRealm(), ctx.getSpaceId());
} else if(arp.isReply()) {
handleReply(arp, ctx.getRealm(), ctx.getSpaceId());
}
}
private void handleRequest(ARP request, long realm, long view) {
INetworkAddress address = request.getSenderProtocolAddress();
IHardwareAddress mac = request.getSenderHardwareAddress();
if(address instanceof InternetAddress) {
handleInternetAddress((InternetAddress)address, mac, realm, view);
}
}
private void handleReply(ARP reply, long realm, long view) {
INetworkAddress address = reply.getSenderProtocolAddress();
IHardwareAddress mac = reply.getSenderHardwareAddress();
if(address instanceof InternetAddress) {
handleInternetAddress((InternetAddress)address, mac, realm, view);
}
address = reply.getTargetProtocolAddress();
mac = reply.getTargetHardwareAddress();
if(address instanceof InternetAddress) {
handleInternetAddress((InternetAddress)address, mac, realm, view);
}
}
private void handleInternetAddress(InternetAddress addr, IHardwareAddress macAddr, long realm, long view) {
if (addr.isUnspecified()) {
return;
}
// FIXME add multicast?
INetworkEntityFactory factory = Activator.getInstance().getNetworkEntityFactory();
factory.createAddress(realm, view, addr);
// TODO add MAC to model (InternetAddressEntity.setMacAddress()?)
}
}