package com.netifera.platform.net.internal.sniffing.reassembly;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ConcurrentMap;
import com.netifera.platform.net.packets.tcpip.IP;
public class IPReassembler {
final private ConcurrentMap<IPReassemblyKey, IPReassemblyQueue> reassemblyQueues = new ConcurrentHashMap<IPReassemblyKey, IPReassemblyQueue>();
final private ConcurrentLinkedQueue<IP> outputQueue = new ConcurrentLinkedQueue<IP>();
public void addPacket(IP packet) {
if (packet.isFragment()) {
addFragment(packet);
} else {
outputQueue.offer(packet);
}
}
private void addFragment(IP packet) {
IPReassemblyKey key = new IPReassemblyKey(packet);
IPReassemblyQueue queue = reassemblyQueues.get(key);
if (queue == null) {
queue = new IPReassemblyQueue();
reassemblyQueues.put(key,queue);
}
queue.addFragment(packet.fragment());
if (queue.isComplete()) {
reassemblyQueues.remove(key);
outputQueue.offer(queue.getReassembled());
}
}
public int count() {
return outputQueue.size();
}
public IP getNextPacket() {
return outputQueue.poll(); // XXX not blocking?
}
}