mirror of
https://github.com/oliverschmidt/contiki.git
synced 2024-09-09 23:54:32 +00:00
added initial pcap exporter for 6lowpan analyzer
This commit is contained in:
parent
f4c1953563
commit
c9a109dbc8
@ -26,7 +26,7 @@
|
|||||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
* SUCH DAMAGE.
|
* 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;
|
package se.sics.cooja.plugins;
|
||||||
@ -140,9 +140,14 @@ public class RadioLogger extends VisPlugin {
|
|||||||
radioMedium = simulation.getRadioMedium();
|
radioMedium = simulation.getRadioMedium();
|
||||||
|
|
||||||
ArrayList<PacketAnalyzer> lowpanAnalyzers = new ArrayList<PacketAnalyzer>();
|
ArrayList<PacketAnalyzer> lowpanAnalyzers = new ArrayList<PacketAnalyzer>();
|
||||||
lowpanAnalyzers.add(new IEEE802154Analyzer());
|
lowpanAnalyzers.add(new IEEE802154Analyzer(false));
|
||||||
lowpanAnalyzers.add(new IPHCPacketAnalyzer());
|
lowpanAnalyzers.add(new IPHCPacketAnalyzer());
|
||||||
lowpanAnalyzers.add(new ICMPv6Analyzer());
|
lowpanAnalyzers.add(new ICMPv6Analyzer());
|
||||||
|
|
||||||
|
ArrayList<PacketAnalyzer> lowpanAnalyzersPcap = new ArrayList<PacketAnalyzer>();
|
||||||
|
lowpanAnalyzersPcap.add(new IEEE802154Analyzer(true));
|
||||||
|
lowpanAnalyzersPcap.add(new IPHCPacketAnalyzer());
|
||||||
|
lowpanAnalyzersPcap.add(new ICMPv6Analyzer());
|
||||||
model = new AbstractTableModel() {
|
model = new AbstractTableModel() {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1692207305977527004L;
|
private static final long serialVersionUID = 1692207305977527004L;
|
||||||
@ -333,6 +338,12 @@ public class RadioLogger extends VisPlugin {
|
|||||||
group.add(rbMenuItem);
|
group.add(rbMenuItem);
|
||||||
popupMenu.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) */
|
/* Load additional analyzers specified by projects (cooja.config) */
|
||||||
String[] projectAnalyzerSuites =
|
String[] projectAnalyzerSuites =
|
||||||
gui.getProjectConfig().getStringArrayValue(RadioLogger.class, "ANALYZERS");
|
gui.getProjectConfig().getStringArrayValue(RadioLogger.class, "ANALYZERS");
|
||||||
|
@ -14,9 +14,10 @@ public class ICMPv6Analyzer extends PacketAnalyzer {
|
|||||||
public static final int NEIGHBOR_SOLICITATION = 135;
|
public static final int NEIGHBOR_SOLICITATION = 135;
|
||||||
public static final int NEIGHBOR_ADVERTISEMENT = 136;
|
public static final int NEIGHBOR_ADVERTISEMENT = 136;
|
||||||
|
|
||||||
public static final int RPL_CODE_DIS = 1; /* DIS message */
|
public static final int RPL_CODE_DIS = 0; /* DIS message */
|
||||||
public static final int RPL_CODE_DIO = 2; /* DIO message */
|
public static final int RPL_CODE_DIO = 1; /* DIO message */
|
||||||
public static final int RPL_CODE_DAO = 4;/* DAO 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_ROUTER = 0x80;
|
||||||
public static final int FLAG_SOLICITED = 0x40;
|
public static final int FLAG_SOLICITED = 0x40;
|
||||||
@ -66,6 +67,10 @@ public class ICMPv6Analyzer extends PacketAnalyzer {
|
|||||||
brief.append("DAO");
|
brief.append("DAO");
|
||||||
verbose.append("DAO");
|
verbose.append("DAO");
|
||||||
break;
|
break;
|
||||||
|
case RPL_CODE_DAO_ACK:
|
||||||
|
brief.append("DAO ACK");
|
||||||
|
verbose.append("DAO ACK");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
brief.append(code);
|
brief.append(code);
|
||||||
verbose.append(code);
|
verbose.append(code);
|
||||||
@ -81,5 +86,4 @@ public class ICMPv6Analyzer extends PacketAnalyzer {
|
|||||||
public boolean matchPacket(Packet packet) {
|
public boolean matchPacket(Packet packet) {
|
||||||
return packet.level == NETWORK_LEVEL && packet.lastDispatch == ICMPv6_DISPATCH;
|
return packet.level == NETWORK_LEVEL && packet.lastDispatch == ICMPv6_DISPATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
package se.sics.cooja.plugins.analyzers;
|
package se.sics.cooja.plugins.analyzers;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import se.sics.cooja.util.StringUtils;
|
import se.sics.cooja.util.StringUtils;
|
||||||
|
|
||||||
public class IEEE802154Analyzer extends PacketAnalyzer {
|
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[] typeS = {"-", "D", "A"};
|
||||||
private static final String[] typeVerbose = {"BEACON", "DATA", "ACK"};
|
private static final String[] typeVerbose = {"BEACON", "DATA", "ACK"};
|
||||||
|
private PcapExporter pcapExporter;
|
||||||
|
|
||||||
// private int defaultAddressMode = LONG_ADDRESS;
|
// private int defaultAddressMode = LONG_ADDRESS;
|
||||||
// private byte seqNo = 0;
|
// private byte seqNo = 0;
|
||||||
|
|
||||||
// private int myPanID = 0xabcd;
|
// private int myPanID = 0xabcd;
|
||||||
|
|
||||||
|
public IEEE802154Analyzer(boolean pcap) {
|
||||||
|
if (pcap) try {
|
||||||
|
pcapExporter = new PcapExporter();
|
||||||
|
} catch (IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean matchPacket(Packet packet) {
|
public boolean matchPacket(Packet packet) {
|
||||||
return packet.level == MAC_LEVEL;
|
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 */
|
/* this protocol always have network level packets as payload */
|
||||||
public int nextLevel(byte[] packet, int level) {
|
public int nextLevel(byte[] packet, int level) {
|
||||||
return NETWORK_LEVEL;
|
return NETWORK_LEVEL;
|
||||||
@ -43,6 +48,11 @@ public class IEEE802154Analyzer extends PacketAnalyzer {
|
|||||||
* next handler
|
* next handler
|
||||||
*/
|
*/
|
||||||
public int analyzePacket(Packet packet, StringBuffer brief, StringBuffer verbose) {
|
public int analyzePacket(Packet packet, StringBuffer brief, StringBuffer verbose) {
|
||||||
|
|
||||||
|
if (pcapExporter != null) {
|
||||||
|
pcapExporter.exportPacketData(packet.getPayload());
|
||||||
|
}
|
||||||
|
|
||||||
int pos = packet.pos;
|
int pos = packet.pos;
|
||||||
int type = packet.data[pos + 0] & 7;
|
int type = packet.data[pos + 0] & 7;
|
||||||
// int security = (packet.data[pos + 0] >> 3) & 1;
|
// int security = (packet.data[pos + 0] >> 3) & 1;
|
||||||
@ -102,14 +112,15 @@ public class IEEE802154Analyzer extends PacketAnalyzer {
|
|||||||
|
|
||||||
brief.append("15.4 ");
|
brief.append("15.4 ");
|
||||||
brief.append(type < typeS.length ? typeS[type] : "?").append(' ');
|
brief.append(type < typeS.length ? typeS[type] : "?").append(' ');
|
||||||
printAddress(brief, srcAddrMode, sourceAddress);
|
|
||||||
brief.append(' ');
|
|
||||||
printAddress(brief, destAddrMode, destAddress);
|
|
||||||
|
|
||||||
verbose.append("<html><b>IEEE 802.15.4 ")
|
verbose.append("<html><b>IEEE 802.15.4 ")
|
||||||
.append(type < typeVerbose.length ? typeVerbose[type] : "?")
|
.append(type < typeVerbose.length ? typeVerbose[type] : "?")
|
||||||
.append(' ').append(seqNumber);
|
.append(' ').append(seqNumber);
|
||||||
if (type != ACKFRAME) {
|
if (type != ACKFRAME) {
|
||||||
|
printAddress(brief, srcAddrMode, sourceAddress);
|
||||||
|
brief.append(' ');
|
||||||
|
printAddress(brief, destAddrMode, destAddress);
|
||||||
|
|
||||||
verbose.append("</b><br>From ");
|
verbose.append("</b><br>From ");
|
||||||
if (srcPanID != 0) {
|
if (srcPanID != 0) {
|
||||||
verbose.append(StringUtils.toHex((byte)(srcPanID >> 8)))
|
verbose.append(StringUtils.toHex((byte)(srcPanID >> 8)))
|
||||||
@ -124,6 +135,9 @@ public class IEEE802154Analyzer extends PacketAnalyzer {
|
|||||||
.append('/');
|
.append('/');
|
||||||
}
|
}
|
||||||
printAddress(verbose, destAddrMode, destAddress);
|
printAddress(verbose, destAddrMode, destAddress);
|
||||||
|
} else {
|
||||||
|
/* got ack - no more to do ... */
|
||||||
|
return ANALYSIS_OK_FINAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* update packet */
|
/* update packet */
|
||||||
|
58
tools/cooja/java/se/sics/cooja/plugins/analyzers/PcapExporter.java
Executable file
58
tools/cooja/java/se/sics/cooja/plugins/analyzers/PcapExporter.java
Executable file
@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user