diff --git a/tools/cooja/java/org/contikios/cooja/plugins/analyzers/IEEE802154Analyzer.java b/tools/cooja/java/org/contikios/cooja/plugins/analyzers/IEEE802154Analyzer.java index 68049c367..74408b363 100644 --- a/tools/cooja/java/org/contikios/cooja/plugins/analyzers/IEEE802154Analyzer.java +++ b/tools/cooja/java/org/contikios/cooja/plugins/analyzers/IEEE802154Analyzer.java @@ -7,20 +7,22 @@ import org.contikios.cooja.util.StringUtils; public class IEEE802154Analyzer extends PacketAnalyzer { - /* TODO: fix this to be correct */ + // Addressing modes public static final int NO_ADDRESS = 0; public static final int RSV_ADDRESS = 1; public static final int SHORT_ADDRESS = 2; public static final int LONG_ADDRESS = 3; + // Frame types public static final int BEACONFRAME = 0x00; public static final int DATAFRAME = 0x01; public static final int ACKFRAME = 0x02; public static final int CMDFRAME = 0x03; // private static final byte[] BROADCAST_ADDR = {(byte)0xff, (byte)0xff}; - private static final String[] typeS = {"-", "D", "A"}; - private static final String[] typeVerbose = {"BEACON", "DATA", "ACK"}; + private static final String[] typeS = {"-", "D", "A", "C"}; + private static final String[] typeVerbose = {"BEACON", "DATA", "ACK", "CMD"}; + private static final String[] addrModeNames = {"None", "Reserved", "Short", "Long"}; private PcapExporter pcapExporter; // private int defaultAddressMode = LONG_ADDRESS; @@ -73,15 +75,18 @@ public class IEEE802154Analyzer extends PacketAnalyzer { } int pos = packet.pos; - int type = packet.data[pos + 0] & 7; -// int security = (packet.data[pos + 0] >> 3) & 1; -// int pending = (packet.data[pos + 0] >> 4) & 1; -// int ackRequired = (packet.data[pos + 0] >> 5) & 1; - int panCompression = (packet.data[pos + 0] >> 6) & 1; - int destAddrMode = (packet.data[pos + 1] >> 2) & 3; -// int frameVersion = (packet.data[pos + 1] >> 4) & 3; - int srcAddrMode = (packet.data[pos + 1] >> 6) & 3; + // FCF field + int fcfType = packet.data[pos + 0] & 0x07; + boolean fcfSecurity = ((packet.data[pos + 0] >> 3) & 0x01) != 0; + boolean fcfPending = ((packet.data[pos + 0] >> 4) & 0x01) != 0; + boolean fcfAckRequested = ((packet.data[pos + 0] >> 5) & 0x01) != 0; + boolean fcfIntraPAN = ((packet.data[pos + 0] >> 6) & 0x01) != 0; + int fcfDestAddrMode = (packet.data[pos + 1] >> 2) & 0x03; + int fcfFrameVersion = (packet.data[pos + 1] >> 4) & 0x03; + int fcfSrcAddrMode = (packet.data[pos + 1] >> 6) & 0x03; + // Sequence number int seqNumber = packet.data[pos + 2] & 0xff; + // Addressing Fields int destPanID = 0; int srcPanID = 0; byte[] sourceAddress = null; @@ -89,15 +94,15 @@ public class IEEE802154Analyzer extends PacketAnalyzer { pos += 3; - if (destAddrMode > 0) { + if (fcfDestAddrMode > 0) { destPanID = (packet.data[pos] & 0xff) + ((packet.data[pos + 1] & 0xff) << 8); pos += 2; - if (destAddrMode == SHORT_ADDRESS) { + if (fcfDestAddrMode == SHORT_ADDRESS) { destAddress = new byte[2]; destAddress[1] = packet.data[pos]; destAddress[0] = packet.data[pos + 1]; pos += 2; - } else if (destAddrMode == LONG_ADDRESS) { + } else if (fcfDestAddrMode == LONG_ADDRESS) { destAddress = new byte[8]; for (int i = 0; i < 8; i++) { destAddress[i] = packet.data[pos + 7 - i]; @@ -106,19 +111,19 @@ public class IEEE802154Analyzer extends PacketAnalyzer { } } - if (srcAddrMode > 0) { - if (panCompression == 0) { + if (fcfSrcAddrMode > 0) { + if (fcfIntraPAN) { + srcPanID = destPanID; + } else { srcPanID = (packet.data[pos] & 0xff) + ((packet.data[pos + 1] & 0xff) << 8); pos += 2; - } else { - srcPanID = destPanID; } - if (srcAddrMode == SHORT_ADDRESS) { + if (fcfSrcAddrMode == SHORT_ADDRESS) { sourceAddress = new byte[2]; sourceAddress[1] = packet.data[pos]; sourceAddress[0] = packet.data[pos + 1]; pos += 2; - } else if (srcAddrMode == LONG_ADDRESS) { + } else if (fcfSrcAddrMode == LONG_ADDRESS) { sourceAddress = new byte[8]; for (int i = 0; i < 8; i++) { sourceAddress[i] = packet.data[pos + 7 - i]; @@ -129,24 +134,25 @@ public class IEEE802154Analyzer extends PacketAnalyzer { // int payloadLen = packet.data.length - pos; brief.append("15.4 "); - brief.append(type < typeS.length ? typeS[type] : "?").append(' '); + brief.append(fcfType < typeS.length ? typeS[fcfType] : "?").append(' '); verbose.append("IEEE 802.15.4 ") - .append(type < typeVerbose.length ? typeVerbose[type] : "?") - .append(' ').append(seqNumber); - if (type != ACKFRAME) { - printAddress(brief, srcAddrMode, sourceAddress); - brief.append(' '); - printAddress(brief, destAddrMode, destAddress); + .append(fcfType < typeVerbose.length ? typeVerbose[fcfType] : "?") + .append(" #").append(seqNumber); - verbose.append("
From "); + if (fcfType != ACKFRAME) { + printAddress(brief, fcfSrcAddrMode, sourceAddress); + brief.append(' '); + printAddress(brief, fcfDestAddrMode, destAddress); + + verbose.append("
From "); if (srcPanID != 0) { verbose.append("0x") .append(StringUtils.toHex((byte) (srcPanID >> 8))) .append(StringUtils.toHex((byte) (srcPanID & 0xff))) .append('/'); } - printAddress(verbose, srcAddrMode, sourceAddress); + printAddress(verbose, fcfSrcAddrMode, sourceAddress); verbose.append(" to "); if (destPanID != 0) { verbose.append("0x") @@ -154,18 +160,28 @@ public class IEEE802154Analyzer extends PacketAnalyzer { .append(StringUtils.toHex((byte) (destPanID & 0xff))) .append('/'); } - printAddress(verbose, destAddrMode, destAddress); - } else { + printAddress(verbose, fcfDestAddrMode, destAddress); + } + + verbose.append("
Sec = ").append(fcfSecurity) + .append(", Pend = ").append(fcfPending) + .append(", ACK = ").append(fcfAckRequested) + .append(", iPAN = ").append(fcfIntraPAN) + .append(", DestAddr = ").append(addrModeNames[fcfDestAddrMode]) + .append(", Vers. = ").append(fcfFrameVersion) + .append(", SrcAddr = ").append(addrModeNames[fcfSrcAddrMode]); + + /* update packet */ + packet.pos = pos; + /* remove CRC from the packet */ + packet.consumeBytesEnd(2); + + if (fcfType == ACKFRAME) { /* got ack - no more to do ... */ return ANALYSIS_OK_FINAL; } - /* update packet */ - packet.pos = pos; packet.level = NETWORK_LEVEL; - /* remove CRC from the packet */ - packet.consumeBytesEnd(2); - packet.llsender = sourceAddress; packet.llreceiver = destAddress; return ANALYSIS_OK_CONTINUE;