From 80dc21d5d5b52df187bfe88cc1af630681829d2e Mon Sep 17 00:00:00 2001 From: Enrico Joerns Date: Sat, 3 May 2014 01:38:59 +0200 Subject: [PATCH] [cooja] plugins/analyzers: Added PacketAnalyzer for 6lowpan fragmentation header --- .../contikios/cooja/plugins/RadioLogger.java | 3 + .../analyzers/FragHeadPacketAnalyzer.java | 76 +++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 tools/cooja/java/org/contikios/cooja/plugins/analyzers/FragHeadPacketAnalyzer.java diff --git a/tools/cooja/java/org/contikios/cooja/plugins/RadioLogger.java b/tools/cooja/java/org/contikios/cooja/plugins/RadioLogger.java index f73a4af8c..720958537 100644 --- a/tools/cooja/java/org/contikios/cooja/plugins/RadioLogger.java +++ b/tools/cooja/java/org/contikios/cooja/plugins/RadioLogger.java @@ -94,6 +94,7 @@ import org.contikios.cooja.Simulation; import org.contikios.cooja.VisPlugin; import org.contikios.cooja.dialogs.TableColumnAdjuster; import org.contikios.cooja.interfaces.Radio; +import org.contikios.cooja.plugins.analyzers.FragHeadPacketAnalyzer; import org.contikios.cooja.plugins.analyzers.ICMPv6Analyzer; import org.contikios.cooja.plugins.analyzers.IEEE802154Analyzer; import org.contikios.cooja.plugins.analyzers.IPHCPacketAnalyzer; @@ -172,6 +173,7 @@ public class RadioLogger extends VisPlugin { ArrayList lowpanAnalyzers = new ArrayList(); lowpanAnalyzers.add(new IEEE802154Analyzer(false)); + lowpanAnalyzers.add(new FragHeadPacketAnalyzer()); lowpanAnalyzers.add(new IPHCPacketAnalyzer()); lowpanAnalyzers.add(new IPv6PacketAnalyzer()); lowpanAnalyzers.add(new ICMPv6Analyzer()); @@ -179,6 +181,7 @@ public class RadioLogger extends VisPlugin { analyzerWithPcap = new IEEE802154Analyzer(true); ArrayList lowpanAnalyzersPcap = new ArrayList(); lowpanAnalyzersPcap.add(analyzerWithPcap); + lowpanAnalyzersPcap.add(new FragHeadPacketAnalyzer()); lowpanAnalyzersPcap.add(new IPHCPacketAnalyzer()); lowpanAnalyzersPcap.add(new IPv6PacketAnalyzer()); lowpanAnalyzersPcap.add(new ICMPv6Analyzer()); diff --git a/tools/cooja/java/org/contikios/cooja/plugins/analyzers/FragHeadPacketAnalyzer.java b/tools/cooja/java/org/contikios/cooja/plugins/analyzers/FragHeadPacketAnalyzer.java new file mode 100644 index 000000000..6961306d5 --- /dev/null +++ b/tools/cooja/java/org/contikios/cooja/plugins/analyzers/FragHeadPacketAnalyzer.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2014, TU Braunschweig + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +package org.contikios.cooja.plugins.analyzers; + +/** + * Analyzes the fragmentation header if present. + * + * @author Enrico Jorns + */ +public class FragHeadPacketAnalyzer extends PacketAnalyzer { + + public final static int SICSLOWPAN_DISPATCH_FRAG1 = 0xc0; /* 1100 0xxx */ + + public final static int SICSLOWPAN_DISPATCH_FRAGN = 0xe0; /* 1110 0xxx */ + + @Override + public boolean matchPacket(Packet packet) { + return packet.level == NETWORK_LEVEL && (packet.get(0) & 0xD8) == SICSLOWPAN_DISPATCH_FRAG1; + } + + @Override + public int analyzePacket(Packet packet, StringBuilder brief, StringBuilder verbose) { + int hdr_size = 0; + + if ((packet.get(0) & 0xF8) == SICSLOWPAN_DISPATCH_FRAG1) { + hdr_size = 4; + brief.append("FRAG1"); + } else if ((packet.get(0) & 0xF8) == SICSLOWPAN_DISPATCH_FRAGN) { + hdr_size = 5; + brief.append("FRAGN"); + } + + int datagram_size = ((packet.get(0) & 0x07) << 8) + packet.get(1); + int datagram_tag = packet.getInt(2, 2); + + verbose.append("Frag Header
"); + verbose.append("size = ").append(datagram_size) + .append(", tag = ").append(String.format("0x%04x", datagram_tag)); + + if (hdr_size == 5) { + verbose.append(", offset = ").append(packet.get(4) * 8); + } + + packet.pos += hdr_size; + + return ANALYSIS_OK_CONTINUE; + } + +}