/*
* This file is part of jsFlow.
*
* Copyright (c) 2009 DE-CIX Management GmbH <http://www.de-cix.net> - All rights
* reserved.
*
* Author: Thomas King <thomas.king@de-cix.net>
*
* This software is licensed under the Apache License, version 2.0. A copy of
* the license agreement is included in this distribution.
*/
package net.decix.jsflow.header;
import net.decix.util.HeaderBytesException;
import net.decix.util.HeaderParseException;
import net.decix.util.Utility;
public class FlowRecordHeader {
private long flowDataFormat; // 20 bit enterprise & 12 bit format; standard enterprise 0, format 1, 2, 3, 4, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012
private long flowDataLength; // in byte
private RawPacketHeader rawPacket;
public FlowRecordHeader() {
}
public long getFlowDataFormat() {
return flowDataFormat;
}
public long getFlowDataLength() {
return flowDataLength;
}
public void setFlowDataFormat(long flowDataFormat) {
this.flowDataFormat = flowDataFormat;
}
public void setFlowDataLength(long flowDataLength) {
this.flowDataLength = flowDataLength;
}
public void setRawPacketHeader(RawPacketHeader rawPacket) {
this.rawPacket = rawPacket;
}
public RawPacketHeader getRawPacketHeader() {
return rawPacket;
}
public static FlowRecordHeader parse(byte[] data) throws HeaderParseException {
try {
if (data.length < 8) throw new HeaderParseException("Data array too short.");
FlowRecordHeader frd = new FlowRecordHeader();
// format
byte[] format = new byte[4];
System.arraycopy(data, 0, format, 0, 4);
frd.setFlowDataFormat(Utility.fourBytesToLong(format));
// length
byte[] length = new byte[4];
System.arraycopy(data, 4, length, 0, 4);
frd.setFlowDataLength(Utility.fourBytesToLong(length));
// raw packet header
byte[] subData = new byte[(int) frd.getFlowDataLength()];
System.arraycopy(data, 8, subData, 0, (int) frd.getFlowDataLength());
RawPacketHeader rp = RawPacketHeader.parse(subData);
frd.setRawPacketHeader(rp);
return frd;
} catch (Exception e) {
throw new HeaderParseException("Parse error: " + e.getMessage());
}
}
public byte[] getBytes() throws HeaderBytesException {
try {
byte[] rawPacketBytes = rawPacket.getBytes();
byte[] data = new byte[8 + rawPacketBytes.length];
// format
System.arraycopy(Utility.longToFourBytes(flowDataFormat), 0, data, 0, 4);
// length
System.arraycopy(Utility.longToFourBytes(flowDataLength), 0, data, 4, 4);
// raw packet header
System.arraycopy(rawPacketBytes, 0, data, 8, rawPacketBytes.length);
return data;
} catch (Exception e) {
throw new HeaderBytesException("Error while generating the bytes: " + e.getMessage());
}
}
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[FlowRecordHeader]:");
sb.append("Format: ");
sb.append(getFlowDataFormat());
sb.append(", Length: ");
sb.append(getFlowDataLength());
sb.append(", ");
sb.append(getRawPacketHeader());
return sb.toString();
}
}