}
/** @return a Flow object corresponding to the next packet in the trace file */
public Flow next() {
Flow flow;
Device sourceDevice;
Device destinationDevice;
IpAddressPrimitive source = null;
IpAddressPrimitive destination = null;
MacAddressPrimitive src = null;
MacAddressPrimitive dst = null;
int etherProtocol = -1;
int ipProtocol = -1;
int srcPort = -1;
int dstPort = -1;
try {
/* Aligns the position of the stream at beginning of packet */
in.nextPacket();
/* Returns the name of the first header */
String linkType = in.getLinkType();
int length = (int)in.getPacketLength();
long timestamp = in.getCaptureTimestamp().getTime();
if (linkType.equals("Ethernet") == true) {
dst = new MacAddressPrimitive();
dst.setValue(in);
src = new MacAddressPrimitive();
src.setValue(in);
etherProtocol = in.readUnsignedShort();
// Now check if its IP protocol
if (etherProtocol == 0x800) {
int version = in.readBits(4);
int hlen = in.readBits(4);
int precedence = in.readBits(3);
//int delay = in.readBits(1);
//int throughtput = in.readBits(1);
//int reliability = in.readBits(1);
//in.readBits(2); // Reserved 2 bits
//int ipLength = in.readUnsignedShort();
//int id = in.readUnsignedShort();
//in.readBits(1); // Reserved 1 flag bit
//int doNotFragment = in.readBits(1);
//int moreFragments = in.readBits(1);
in.readBits(32);
in.readBits(8);
int offset = in.readBits(13);
int timeToLive = in.readUnsignedByte();
ipProtocol = in.readUnsignedByte();
int checksum = in.readUnsignedShort();
source = new IpAddressPrimitive();
source.setValue(in);
destination = new IpAddressPrimitive();
destination.setValue(in);
// Skip all the options
if ( hlen > 5 )
in.readBits((hlen - 5) * 32);
//logger.debug("Ethernet " + src + " -> " + dst);
//logger.debug("IP " + source + " -> " + destination);
if (ipProtocol == 6) {
srcPort = in.readUnsignedShort();
dstPort = in.readUnsignedShort();
long seqNumber = in.readUnsignedInt();
long ackNumber = in.readUnsignedInt();
//int ipOffset = in.readBits(4);
// reserved
//in.readBits(6);
//int flags = in.readBits(6);
//int window = in.readUnsignedShort();
in.readBits(32);
if ( offset > 5 )
in.readBits((offset - 5) * 32);
logger.debug("TCP: " + source + "(" + srcPort + ") -> "
+ destination + "(" + dstPort + ")");
} else if (ipProtocol == 17) {
srcPort = in.readUnsignedShort();
dstPort = in.readUnsignedShort();
//int udpLength = in.readUnsignedShort();
//int udpChecksum = in.readUnsignedShort();
in.readBits(32);
logger.debug("UDP: " + source + "(" + srcPort + ") -> "
+ destination + "(" + dstPort + ")");
} else { // For all other IP protocols display number
logger.debug(
"IP: " + source + " -> " + destination + " protocol=0x"
+ Integer.toHexString(ipProtocol) );
}
sourceDevice = new Device(InetAddress.getByName(source.toString()), new EthernetAddress(src.toString()));
destinationDevice = new Device(InetAddress.getByName(destination.toString()), new EthernetAddress(dst.toString()));
return new Flow(timestamp, sourceDevice, destinationDevice, etherProtocol, ipProtocol, srcPort, dstPort, length);
} else {
logger.debug("Ethernet " + src + " -> " + dst
+ " Ethertype=0x"
+ Integer.toHexString(etherProtocol) );
sourceDevice = new Device(new EthernetAddress(src.toString()));
destinationDevice = new Device(new EthernetAddress(dst.toString()));
return new Flow(timestamp, sourceDevice, destinationDevice, etherProtocol, length);
}
} else {
logger.debug("Unsupported packet type: " + linkType);
return next();