/* * 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 java.math.BigInteger; import net.decix.util.HeaderBytesException; import net.decix.util.HeaderParseException; import net.decix.util.Utility; public class GenericInterfaceCounterHeader { // enterprise = 0, format = 1 private long ifIndex; private long ifType; private BigInteger ifSpeed; private long ifDirection; // 0 = unknown, 1 = full-duplex, 2 = half-duplex, 3 = in, 4 = out private long ifStatus; // bit 0 => ifAdminStatus 0=down|1=up, bit 1 => ifOperStatus 0=down|1=up private BigInteger ifInOctets; private long ifInUcastPkts; private long ifInMulticastPkts; private long ifInBroadcastPkts; private long ifInDiscards; private long ifInErrors; private long ifInUnknownProtos; private BigInteger ifOutOctets; private long ifOutUcastPkts; private long ifOutMulticastPkts; private long ifOutBroadcastPkts; private long ifOutDiscards; private long ifOutErrors; private long ifPromiscuousMode; private CounterData counterData; public long getIfIndex() { return ifIndex; } public long getIfType() { return ifType; } public BigInteger getIfSpeed(){ return ifSpeed; } public long getIfDirection() { return ifDirection; } public long getIfStatus() { return ifStatus; } public BigInteger getIfInOctets(){ return ifInOctets; } public long getIfInUcastPkts() { return ifInUcastPkts; } public long getIfInMulticastPkts() { return ifInMulticastPkts; } public long getIfInBroadcastPkts() { return ifInBroadcastPkts; } public long getIfInDiscards() { return ifInDiscards; } public long getIfInErrors() { return ifInErrors; } public long getIfInUnknownProtos() { return ifInUnknownProtos; } public BigInteger getIfOutOctets(){ return ifOutOctets; } public long getIfOutUcastPkts() { return ifOutUcastPkts; } public long getIfOutMulticastPkts() { return ifOutMulticastPkts; } public long getIfOutBroadcastPkts() { return ifOutBroadcastPkts; } public long getIfOutDiscards() { return ifOutDiscards; } public long getIfOutErrors() { return ifOutErrors; } public long getIfPromiscuousMode() { return ifPromiscuousMode; } public void setIfIndex(long ifIndex) { this.ifIndex = ifIndex; } public void setIfType(long ifType) { this.ifType = ifType; } public void setIfSpeed(BigInteger ifSpeed){ this.ifSpeed = ifSpeed; } public void setIfDirection(long ifDirection) { this.ifDirection = ifDirection; } public void setIfStatus(long ifStatus) { this.ifStatus = ifStatus; } public void setIfInOctets(BigInteger ifInOctets){ this.ifInOctets = ifInOctets; } public void setIfInUcastPkts(long ifInUcastPkts) { this.ifInUcastPkts = ifInUcastPkts; } public void setIfInMulticastPkts(long ifInMulticastPkts) { this.ifInMulticastPkts = ifInMulticastPkts; } public void setIfInBroadcastPkts(long ifInBroadcastPkts) { this.ifInBroadcastPkts = ifInBroadcastPkts; } public void setIfInDiscards(long ifInDiscards) { this.ifInDiscards = ifInDiscards; } public void setIfInErrors(long ifInErrors) { this.ifInErrors = ifInErrors; } public void setIfInUnknownProtos(long ifInUnknownProtos) { this.ifInUnknownProtos = ifInUnknownProtos; } public void setIfOutOctets(BigInteger ifOutOctets){ this.ifOutOctets = ifOutOctets; } public void setIfOutUcastPkts(long ifOutUcastPkts) { this.ifOutUcastPkts = ifOutUcastPkts; } public void setIfOutMulticastPkts(long ifOutMulticastPkts) { this.ifOutMulticastPkts = ifOutMulticastPkts; } public void setIfOutBroadcastPkts(long ifOutBroadcastPkts) { this.ifOutBroadcastPkts = ifOutBroadcastPkts; } public void setIfOutDiscards(long ifOutDiscards) { this.ifOutDiscards = ifOutDiscards; } public void setIfOutErrors(long ifOutErrors) { this.ifOutErrors = ifOutErrors; } public void setIfPromiscuousMode(long ifPromiscuousMode) { this.ifPromiscuousMode = ifPromiscuousMode; } public void setCounterData(CounterData counterData) { this.counterData = counterData; } public CounterData getCounterData() { return counterData; } public static GenericInterfaceCounterHeader parse(byte[] data) throws HeaderParseException { try { if (data.length < 88) throw new HeaderParseException("Data array too short."); GenericInterfaceCounterHeader gic = new GenericInterfaceCounterHeader(); // interface index byte[] ifIndex = new byte[4]; System.arraycopy(data, 0, ifIndex, 0, 4); gic.setIfIndex(Utility.fourBytesToLong(ifIndex)); // interface type byte[] ifType = new byte[4]; System.arraycopy(data, 4, ifType, 0, 4); gic.setIfType(Utility.fourBytesToLong(ifType)); // interface speed byte[] ifSpeed = new byte[8]; System.arraycopy(data, 8, ifSpeed, 0, 8); gic.setIfSpeed(Utility.eightBytesToBigInteger(ifSpeed)); // interface direction byte[] ifDirection = new byte[4]; System.arraycopy(data, 16, ifDirection, 0, 4); gic.setIfDirection(Utility.fourBytesToLong(ifDirection)); // interface status byte[] ifStatus = new byte[4]; System.arraycopy(data, 20, ifStatus, 0, 4); gic.setIfStatus(Utility.fourBytesToLong(ifStatus)); // interface input octets - byte[] ifInOctets = new byte[8]; System.arraycopy(data, 24, ifInOctets, 0, 8); gic.setIfInOctets(Utility.eightBytesToBigInteger(ifInOctets)); // interface input unicast packets byte[] ifInUcastPkts = new byte[4]; System.arraycopy(data, 32, ifInUcastPkts, 0, 4); gic.setIfInUcastPkts(Utility.fourBytesToLong(ifInUcastPkts)); // interface input multicast packets byte[] ifInMulticastPkts = new byte[4]; System.arraycopy(data, 36, ifInMulticastPkts, 0, 4); gic.setIfInMulticastPkts(Utility.fourBytesToLong(ifInMulticastPkts)); // interface input broadcast packets byte[] ifInBroadcastPkts = new byte[4]; System.arraycopy(data, 40, ifInBroadcastPkts, 0, 4); gic.setIfInBroadcastPkts(Utility.fourBytesToLong(ifInBroadcastPkts)); // interface input discards byte[] ifInDiscards = new byte[4]; System.arraycopy(data, 44, ifInDiscards, 0, 4); gic.setIfInDiscards(Utility.fourBytesToLong(ifInDiscards)); // interface input errors byte[] ifInErrors = new byte[4]; System.arraycopy(data, 48, ifInErrors, 0, 4); gic.setIfInErrors(Utility.fourBytesToLong(ifInErrors)); // interface input unknown protocols byte[] ifInUnknownProtos = new byte[4]; System.arraycopy(data, 52, ifInUnknownProtos, 0, 4); gic.setIfInUnknownProtos(Utility.fourBytesToLong(ifInUnknownProtos)); // interface output octets byte[] ifOutOctets = new byte[8]; System.arraycopy(data, 56, ifOutOctets, 0, 8); gic.setIfOutOctets(Utility.eightBytesToBigInteger(ifOutOctets)); // interface output unicast packets byte[] ifOutUcastPkts = new byte[4]; System.arraycopy(data, 64, ifOutUcastPkts, 0, 4); gic.setIfOutUcastPkts(Utility.fourBytesToLong(ifOutUcastPkts)); // interface output multicast packets byte[] ifOutMulticastPkts = new byte[4]; System.arraycopy(data, 68, ifOutMulticastPkts, 0, 4); gic.setIfOutMulticastPkts(Utility.fourBytesToLong(ifOutMulticastPkts)); // interface output broadcast packets byte[] ifOutBroadcastPkts = new byte[4]; System.arraycopy(data, 72, ifOutBroadcastPkts, 0, 4); gic.setIfOutBroadcastPkts(Utility.fourBytesToLong(ifOutBroadcastPkts)); // interface output discards byte[] ifOutDiscards = new byte[4]; System.arraycopy(data, 76, ifOutDiscards, 0, 4); gic.setIfOutDiscards(Utility.fourBytesToLong(ifOutDiscards)); // interface output errors byte[] ifOutErrors = new byte[4]; System.arraycopy(data, 80, ifOutErrors, 0, 4); gic.setIfOutErrors(Utility.fourBytesToLong(ifOutErrors)); // interface promiscuous mode byte[] ifPromiscuousMode = new byte[4]; System.arraycopy(data, 84, ifPromiscuousMode, 0, 4); gic.setIfPromiscuousMode(Utility.fourBytesToLong(ifPromiscuousMode)); // counter data byte[] subData = new byte[data.length - 88]; System.arraycopy(data, 88, subData, 0, data.length - 88); CounterData cd = CounterData.parse(subData); gic.setCounterData(cd); return gic; } catch (Exception e) { throw new HeaderParseException("Parse error: " + e.getMessage()); } } public byte[] getBytes() throws HeaderBytesException { try { byte[] counterDataBytes = counterData.getBytes(); byte[] data = new byte[88 + counterDataBytes.length]; // interface index System.arraycopy(Utility.longToFourBytes(ifIndex), 0, data, 0, 4); // interface type System.arraycopy(Utility.longToFourBytes(ifType), 0, data, 4, 4); // interface speed System.arraycopy(Utility.BigIntegerToEightBytes(ifSpeed), 0, data, 8, 8); // interface direction System.arraycopy(Utility.longToFourBytes(ifDirection), 0, data, 16, 4); // interface status System.arraycopy(Utility.longToFourBytes(ifStatus), 0, data, 20, 4); // interface input octets System.arraycopy(Utility.BigIntegerToEightBytes(ifInOctets), 0, data, 24, 8); // interface input unicast packets System.arraycopy(Utility.longToFourBytes(ifInUcastPkts), 0, data, 32, 4); // interface input multicast packets System.arraycopy(Utility.longToFourBytes(ifInMulticastPkts), 0, data, 36, 4); // interface input broadcast packets System.arraycopy(Utility.longToFourBytes(ifInBroadcastPkts), 0, data, 40, 4); // interface input discards System.arraycopy(Utility.longToFourBytes(ifInDiscards), 0, data, 44, 4); // interface input errors System.arraycopy(Utility.longToFourBytes(ifInErrors), 0, data, 48, 4); // interface input unknown protocols System.arraycopy(Utility.longToFourBytes(ifInUnknownProtos), 0, data, 52, 4); // interface output octets System.arraycopy(Utility.BigIntegerToEightBytes(ifOutOctets), 0, data, 56, 8); // interface output unicast packets System.arraycopy(Utility.longToFourBytes(ifOutUcastPkts), 0, data, 64, 4); // interface output multicast packets System.arraycopy(Utility.longToFourBytes(ifOutMulticastPkts), 0, data, 68, 4); // interface output broadcast packets System.arraycopy(Utility.longToFourBytes(ifOutBroadcastPkts), 0, data, 72, 4); // interface output discards System.arraycopy(Utility.longToFourBytes(ifOutDiscards), 0, data, 76, 4); // interface output errors System.arraycopy(Utility.longToFourBytes(ifOutErrors), 0, data, 80, 4); // interface promiscuous mode System.arraycopy(Utility.longToFourBytes(ifPromiscuousMode), 0, data, 84, 4); // counter data System.arraycopy(counterDataBytes, 0, data, 88, counterDataBytes.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("[GenericInterfaceCounterHeader]: "); sb.append("Index: "); sb.append(getIfIndex()); sb.append(", Type: "); sb.append(getIfType()); sb.append(", Speed: "); sb.append(getIfSpeed()); sb.append(", Direction: "); sb.append(getIfDirection()); sb.append(", Status: "); sb.append(getIfStatus()); sb.append(", Octets(IN): "); sb.append(getIfInOctets()); sb.append(", Unicast(IN): "); sb.append(getIfInUcastPkts()); sb.append(", Multicast(IN): "); sb.append(getIfInMulticastPkts()); sb.append(", Broadcast(IN): "); sb.append(getIfInBroadcastPkts()); sb.append(", Discards(IN): "); sb.append(getIfInDiscards()); sb.append(", Errors(IN): "); sb.append(getIfInErrors()); sb.append(", tUnknownProtocol(IN): "); sb.append(getIfInUnknownProtos()); sb.append(", Octets(OUT): "); sb.append(getIfOutOctets()); sb.append(", Unicast(OUT): "); sb.append(getIfOutUcastPkts()); sb.append(", Multicast(OUT): "); sb.append(getIfOutMulticastPkts()); sb.append(", Broadcast(OUT): "); sb.append(getIfOutBroadcastPkts()); sb.append(", Discards(OUT): "); sb.append(getIfOutDiscards()); sb.append(", Errors(OUT): "); sb.append(getIfOutErrors()); sb.append(", PromiscuousMode: "); sb.append(getIfPromiscuousMode()); return sb.toString(); } }