diff --git a/tools/cooja/java/se/sics/cooja/plugins/RadioLogger.java b/tools/cooja/java/se/sics/cooja/plugins/RadioLogger.java index 2031875ec..d34655c9f 100644 --- a/tools/cooja/java/se/sics/cooja/plugins/RadioLogger.java +++ b/tools/cooja/java/se/sics/cooja/plugins/RadioLogger.java @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: RadioLogger.java,v 1.39 2010/10/13 11:31:10 fros4943 Exp $ + * $Id: RadioLogger.java,v 1.40 2010/11/15 12:00:54 joxe Exp $ */ package se.sics.cooja.plugins; @@ -140,9 +140,14 @@ public class RadioLogger extends VisPlugin { radioMedium = simulation.getRadioMedium(); ArrayList lowpanAnalyzers = new ArrayList(); - lowpanAnalyzers.add(new IEEE802154Analyzer()); + lowpanAnalyzers.add(new IEEE802154Analyzer(false)); lowpanAnalyzers.add(new IPHCPacketAnalyzer()); lowpanAnalyzers.add(new ICMPv6Analyzer()); + + ArrayList lowpanAnalyzersPcap = new ArrayList(); + lowpanAnalyzersPcap.add(new IEEE802154Analyzer(true)); + lowpanAnalyzersPcap.add(new IPHCPacketAnalyzer()); + lowpanAnalyzersPcap.add(new ICMPv6Analyzer()); model = new AbstractTableModel() { private static final long serialVersionUID = 1692207305977527004L; @@ -333,6 +338,12 @@ public class RadioLogger extends VisPlugin { group.add(rbMenuItem); popupMenu.add(rbMenuItem); + rbMenuItem = new JRadioButtonMenuItem(createAnalyzerAction( + "6LoWPAN Analyzer with PCAP", "6lowpan-pcap", lowpanAnalyzersPcap, false)); + group.add(rbMenuItem); + popupMenu.add(rbMenuItem); + + /* Load additional analyzers specified by projects (cooja.config) */ String[] projectAnalyzerSuites = gui.getProjectConfig().getStringArrayValue(RadioLogger.class, "ANALYZERS"); diff --git a/tools/cooja/java/se/sics/cooja/plugins/analyzers/ICMPv6Analyzer.java b/tools/cooja/java/se/sics/cooja/plugins/analyzers/ICMPv6Analyzer.java index 1260d8c1d..ec06d12ab 100644 --- a/tools/cooja/java/se/sics/cooja/plugins/analyzers/ICMPv6Analyzer.java +++ b/tools/cooja/java/se/sics/cooja/plugins/analyzers/ICMPv6Analyzer.java @@ -14,9 +14,10 @@ public class ICMPv6Analyzer extends PacketAnalyzer { public static final int NEIGHBOR_SOLICITATION = 135; public static final int NEIGHBOR_ADVERTISEMENT = 136; - public static final int RPL_CODE_DIS = 1; /* DIS message */ - public static final int RPL_CODE_DIO = 2; /* DIO message */ - public static final int RPL_CODE_DAO = 4;/* DAO message */ + public static final int RPL_CODE_DIS = 0; /* DIS message */ + public static final int RPL_CODE_DIO = 1; /* DIO message */ + public static final int RPL_CODE_DAO = 2;/* DAO message */ + public static final int RPL_CODE_DAO_ACK = 3;/* DAO ACK message */ public static final int FLAG_ROUTER = 0x80; public static final int FLAG_SOLICITED = 0x40; @@ -66,6 +67,10 @@ public class ICMPv6Analyzer extends PacketAnalyzer { brief.append("DAO"); verbose.append("DAO"); break; + case RPL_CODE_DAO_ACK: + brief.append("DAO ACK"); + verbose.append("DAO ACK"); + break; default: brief.append(code); verbose.append(code); @@ -81,5 +86,4 @@ public class ICMPv6Analyzer extends PacketAnalyzer { public boolean matchPacket(Packet packet) { return packet.level == NETWORK_LEVEL && packet.lastDispatch == ICMPv6_DISPATCH; } - } diff --git a/tools/cooja/java/se/sics/cooja/plugins/analyzers/IEEE802154Analyzer.java b/tools/cooja/java/se/sics/cooja/plugins/analyzers/IEEE802154Analyzer.java index 119dc9cd9..5ba78c539 100644 --- a/tools/cooja/java/se/sics/cooja/plugins/analyzers/IEEE802154Analyzer.java +++ b/tools/cooja/java/se/sics/cooja/plugins/analyzers/IEEE802154Analyzer.java @@ -1,5 +1,7 @@ package se.sics.cooja.plugins.analyzers; +import java.io.IOException; + import se.sics.cooja.util.StringUtils; public class IEEE802154Analyzer extends PacketAnalyzer { @@ -19,22 +21,25 @@ public class IEEE802154Analyzer extends PacketAnalyzer { private static final String[] typeS = {"-", "D", "A"}; private static final String[] typeVerbose = {"BEACON", "DATA", "ACK"}; + private PcapExporter pcapExporter; // private int defaultAddressMode = LONG_ADDRESS; // private byte seqNo = 0; // private int myPanID = 0xabcd; + public IEEE802154Analyzer(boolean pcap) { + if (pcap) try { + pcapExporter = new PcapExporter(); + } catch (IOException e) { + e.printStackTrace(); + } + } public boolean matchPacket(Packet packet) { return packet.level == MAC_LEVEL; } - /* we need better model of this later... */ - public boolean matchPacket(byte[] packet, int level) { - return false; - } - /* this protocol always have network level packets as payload */ public int nextLevel(byte[] packet, int level) { return NETWORK_LEVEL; @@ -43,6 +48,11 @@ public class IEEE802154Analyzer extends PacketAnalyzer { * next handler */ public int analyzePacket(Packet packet, StringBuffer brief, StringBuffer verbose) { + + if (pcapExporter != null) { + pcapExporter.exportPacketData(packet.getPayload()); + } + int pos = packet.pos; int type = packet.data[pos + 0] & 7; // int security = (packet.data[pos + 0] >> 3) & 1; @@ -102,14 +112,15 @@ public class IEEE802154Analyzer extends PacketAnalyzer { brief.append("15.4 "); brief.append(type < typeS.length ? typeS[type] : "?").append(' '); - printAddress(brief, srcAddrMode, sourceAddress); - brief.append(' '); - printAddress(brief, destAddrMode, destAddress); 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); + verbose.append("
From "); if (srcPanID != 0) { verbose.append(StringUtils.toHex((byte)(srcPanID >> 8))) @@ -124,6 +135,9 @@ public class IEEE802154Analyzer extends PacketAnalyzer { .append('/'); } printAddress(verbose, destAddrMode, destAddress); + } else { + /* got ack - no more to do ... */ + return ANALYSIS_OK_FINAL; } /* update packet */ diff --git a/tools/cooja/java/se/sics/cooja/plugins/analyzers/PcapExporter.java b/tools/cooja/java/se/sics/cooja/plugins/analyzers/PcapExporter.java new file mode 100755 index 000000000..ef2623264 --- /dev/null +++ b/tools/cooja/java/se/sics/cooja/plugins/analyzers/PcapExporter.java @@ -0,0 +1,58 @@ +package se.sics.cooja.plugins.analyzers; + +import java.io.DataOutputStream; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; + +public class PcapExporter { + + private static final byte[] ETH_DATA = {(byte)0xaf, (byte)0xab, (byte)0xac, (byte)0xad, + (byte)0xae, (byte)0xaf, 0x42, (byte)0xfb, (byte)0x9f, (byte)0x81, 0x5a, + (byte)0x81, (byte)0x80, (byte)0x9a}; + + DataOutputStream out; + + public PcapExporter() throws IOException { + } + + public void openPcap() throws IOException { + out = new DataOutputStream(new FileOutputStream("radiolog-" + System.currentTimeMillis() + ".pcap")); + /* pcap header */ + out.writeInt(0xa1b2c3d4); + out.writeShort(0x0002); + out.writeShort(0x0004); + out.writeInt(0); + out.writeInt(0); + out.writeInt(4096); + out.writeInt(1); /* 1 for ethernet ? */ + out.flush(); + System.out.println("Opened pcap file!"); + } + public void closePcap() throws IOException { + out.close(); + } + + public void exportPacketData(byte[] data) throws IOException { + if (out == null) { + openPcap(); + } + try { + /* pcap packet header */ + out.writeInt((int) System.currentTimeMillis() / 1000); + out.writeInt((int) ((System.currentTimeMillis() % 1000) * 1000)); + out.writeInt(data.length + 14); + out.writeInt(data.length + 14); + out.write(ETH_DATA); + /* and the data */ + out.write(data); + out.flush(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + + +}