fixed bug in analyzers that caused looping analyzers and exceptions
This commit is contained in:
parent
f7a3a8476f
commit
fef1e9b686
4 changed files with 27 additions and 27 deletions
|
@ -95,6 +95,6 @@ public class ICMPv6Analyzer extends PacketAnalyzer {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean matchPacket(Packet packet) {
|
public boolean matchPacket(Packet packet) {
|
||||||
return packet.level == NETWORK_LEVEL && packet.lastDispatch == ICMPv6_DISPATCH;
|
return packet.level == APPLICATION_LEVEL && packet.lastDispatch == ICMPv6_DISPATCH;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,8 +61,9 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
|
|
||||||
private static final int IPHC_DISPATCH = 0x60;
|
private static final int IPHC_DISPATCH = 0x60;
|
||||||
|
|
||||||
|
/* packet must be on network level && have a IPHC dispatch */
|
||||||
public boolean matchPacket(Packet packet) {
|
public boolean matchPacket(Packet packet) {
|
||||||
return (packet.get(0) & 0xe0) == IPHC_DISPATCH;
|
return packet.level == NETWORK_LEVEL && (packet.get(0) & 0xe0) == IPHC_DISPATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int analyzePacket(Packet packet, StringBuffer brief,
|
public int analyzePacket(Packet packet, StringBuffer brief,
|
||||||
|
@ -83,6 +84,8 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
int sci = 0;
|
int sci = 0;
|
||||||
int dci = 0;
|
int dci = 0;
|
||||||
|
|
||||||
|
String error = null;
|
||||||
|
|
||||||
brief.append("IPHC");
|
brief.append("IPHC");
|
||||||
|
|
||||||
/* need to decompress while analyzing - add that later... */
|
/* need to decompress while analyzing - add that later... */
|
||||||
|
@ -106,12 +109,14 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
int len = 0;
|
int len = 0;
|
||||||
int proto = 0;
|
int proto = 0;
|
||||||
int ttl = 0;
|
int ttl = 0;
|
||||||
byte[] srcAddress = null;
|
byte[] srcAddress = new byte[16];
|
||||||
byte[] destAddress = null;
|
byte[] destAddress = new byte[16];
|
||||||
|
|
||||||
int srcPort = 0;
|
int srcPort = 0;
|
||||||
int destPort = 0;
|
int destPort = 0;
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
/* Traffic class and flow label */
|
/* Traffic class and flow label */
|
||||||
if((packet.get(0) & SICSLOWPAN_IPHC_FL_C) == 0) {
|
if((packet.get(0) & SICSLOWPAN_IPHC_FL_C) == 0) {
|
||||||
/* Flow label are carried inline */
|
/* Flow label are carried inline */
|
||||||
|
@ -180,7 +185,6 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
break;
|
break;
|
||||||
case SICSLOWPAN_IPHC_SAM_01: /* 64 bits */
|
case SICSLOWPAN_IPHC_SAM_01: /* 64 bits */
|
||||||
/* copy prefix from context */
|
/* copy prefix from context */
|
||||||
srcAddress = new byte[16];
|
|
||||||
System.arraycopy(context, 0, srcAddress, 0, 8);
|
System.arraycopy(context, 0, srcAddress, 0, 8);
|
||||||
/* copy IID from packet */
|
/* copy IID from packet */
|
||||||
packet.copy(hc06_ptr, srcAddress, 8, 8);
|
packet.copy(hc06_ptr, srcAddress, 8, 8);
|
||||||
|
@ -188,7 +192,6 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
break;
|
break;
|
||||||
case SICSLOWPAN_IPHC_SAM_10: /* 16 bits */
|
case SICSLOWPAN_IPHC_SAM_10: /* 16 bits */
|
||||||
/* unicast address */
|
/* unicast address */
|
||||||
srcAddress = new byte[16];
|
|
||||||
System.arraycopy(context, 0, srcAddress, 0, 8);
|
System.arraycopy(context, 0, srcAddress, 0, 8);
|
||||||
/* copy 6 NULL bytes then 2 last bytes of IID */
|
/* copy 6 NULL bytes then 2 last bytes of IID */
|
||||||
packet.copy(hc06_ptr, srcAddress, 14, 2);
|
packet.copy(hc06_ptr, srcAddress, 14, 2);
|
||||||
|
@ -196,7 +199,6 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
break;
|
break;
|
||||||
case SICSLOWPAN_IPHC_SAM_11: /* 0-bits */
|
case SICSLOWPAN_IPHC_SAM_11: /* 0-bits */
|
||||||
/* copy prefix from context */
|
/* copy prefix from context */
|
||||||
srcAddress = new byte[16];
|
|
||||||
System.arraycopy(context, 0, srcAddress, 0, 8);
|
System.arraycopy(context, 0, srcAddress, 0, 8);
|
||||||
/* infer IID from L2 address */
|
/* infer IID from L2 address */
|
||||||
System.arraycopy(packet.llsender, 0, srcAddress,
|
System.arraycopy(packet.llsender, 0, srcAddress,
|
||||||
|
@ -209,12 +211,10 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
switch(packet.get(1) & SICSLOWPAN_IPHC_SAM_11) {
|
switch(packet.get(1) & SICSLOWPAN_IPHC_SAM_11) {
|
||||||
case SICSLOWPAN_IPHC_SAM_00: /* 128 bits */
|
case SICSLOWPAN_IPHC_SAM_00: /* 128 bits */
|
||||||
/* copy whole address from packet */
|
/* copy whole address from packet */
|
||||||
srcAddress = new byte[16];
|
|
||||||
packet.copy(hc06_ptr, srcAddress, 0, 16);
|
packet.copy(hc06_ptr, srcAddress, 0, 16);
|
||||||
hc06_ptr += 16;
|
hc06_ptr += 16;
|
||||||
break;
|
break;
|
||||||
case SICSLOWPAN_IPHC_SAM_01: /* 64 bits */
|
case SICSLOWPAN_IPHC_SAM_01: /* 64 bits */
|
||||||
srcAddress = new byte[16];
|
|
||||||
srcAddress[0] = (byte) 0xfe;
|
srcAddress[0] = (byte) 0xfe;
|
||||||
srcAddress[1] = (byte) 0x80;
|
srcAddress[1] = (byte) 0x80;
|
||||||
/* copy IID from packet */
|
/* copy IID from packet */
|
||||||
|
@ -222,7 +222,6 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
hc06_ptr += 8;
|
hc06_ptr += 8;
|
||||||
break;
|
break;
|
||||||
case SICSLOWPAN_IPHC_SAM_10: /* 16 bits */
|
case SICSLOWPAN_IPHC_SAM_10: /* 16 bits */
|
||||||
srcAddress = new byte[16];
|
|
||||||
srcAddress[0] = (byte) 0xfe;
|
srcAddress[0] = (byte) 0xfe;
|
||||||
srcAddress[1] = (byte) 0x80;
|
srcAddress[1] = (byte) 0x80;
|
||||||
packet.copy(hc06_ptr, srcAddress, 14, 2);
|
packet.copy(hc06_ptr, srcAddress, 14, 2);
|
||||||
|
@ -230,7 +229,6 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
break;
|
break;
|
||||||
case SICSLOWPAN_IPHC_SAM_11: /* 0 bits */
|
case SICSLOWPAN_IPHC_SAM_11: /* 0 bits */
|
||||||
/* setup link-local address */
|
/* setup link-local address */
|
||||||
srcAddress = new byte[16];
|
|
||||||
srcAddress[0] = (byte) 0xfe;
|
srcAddress[0] = (byte) 0xfe;
|
||||||
srcAddress[1] = (byte) 0x80;
|
srcAddress[1] = (byte) 0x80;
|
||||||
/* infer IID from L2 address */
|
/* infer IID from L2 address */
|
||||||
|
@ -252,26 +250,22 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
switch (packet.get(1) & SICSLOWPAN_IPHC_DAM_11) {
|
switch (packet.get(1) & SICSLOWPAN_IPHC_DAM_11) {
|
||||||
case SICSLOWPAN_IPHC_DAM_00: /* 128 bits */
|
case SICSLOWPAN_IPHC_DAM_00: /* 128 bits */
|
||||||
/* copy whole address from packet */
|
/* copy whole address from packet */
|
||||||
destAddress = new byte[16];
|
|
||||||
packet.copy(hc06_ptr, destAddress, 0, 16);
|
packet.copy(hc06_ptr, destAddress, 0, 16);
|
||||||
hc06_ptr += 16;
|
hc06_ptr += 16;
|
||||||
break;
|
break;
|
||||||
case SICSLOWPAN_IPHC_DAM_01: /* 48 bits FFXX::00XX:XXXX:XXXX */
|
case SICSLOWPAN_IPHC_DAM_01: /* 48 bits FFXX::00XX:XXXX:XXXX */
|
||||||
destAddress = new byte[16];
|
|
||||||
destAddress[0] = (byte) 0xff;
|
destAddress[0] = (byte) 0xff;
|
||||||
destAddress[1] = packet.get(hc06_ptr);
|
destAddress[1] = packet.get(hc06_ptr);
|
||||||
packet.copy(hc06_ptr + 1, destAddress, 11, 5);
|
packet.copy(hc06_ptr + 1, destAddress, 11, 5);
|
||||||
hc06_ptr += 6;
|
hc06_ptr += 6;
|
||||||
break;
|
break;
|
||||||
case SICSLOWPAN_IPHC_DAM_10: /* 32 bits FFXX::00XX:XXXX */
|
case SICSLOWPAN_IPHC_DAM_10: /* 32 bits FFXX::00XX:XXXX */
|
||||||
destAddress = new byte[16];
|
|
||||||
destAddress[0] = (byte) 0xff;
|
destAddress[0] = (byte) 0xff;
|
||||||
destAddress[1] = packet.get(hc06_ptr);
|
destAddress[1] = packet.get(hc06_ptr);
|
||||||
packet.copy(hc06_ptr + 1, destAddress, 13, 3);
|
packet.copy(hc06_ptr + 1, destAddress, 13, 3);
|
||||||
hc06_ptr += 4;
|
hc06_ptr += 4;
|
||||||
break;
|
break;
|
||||||
case SICSLOWPAN_IPHC_DAM_11: /* 8 bits FF02::00XX */
|
case SICSLOWPAN_IPHC_DAM_11: /* 8 bits FF02::00XX */
|
||||||
destAddress = new byte[16];
|
|
||||||
destAddress[0] = (byte) 0xff;
|
destAddress[0] = (byte) 0xff;
|
||||||
destAddress[1] = (byte) 0x02;
|
destAddress[1] = (byte) 0x02;
|
||||||
destAddress[15] = packet.get(hc06_ptr);
|
destAddress[15] = packet.get(hc06_ptr);
|
||||||
|
@ -287,7 +281,6 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
|
|
||||||
switch (packet.get(1) & SICSLOWPAN_IPHC_DAM_11) {
|
switch (packet.get(1) & SICSLOWPAN_IPHC_DAM_11) {
|
||||||
case SICSLOWPAN_IPHC_DAM_01: /* 64 bits */
|
case SICSLOWPAN_IPHC_DAM_01: /* 64 bits */
|
||||||
destAddress = new byte[16];
|
|
||||||
System.arraycopy(context, 0, destAddress, 0, 8);
|
System.arraycopy(context, 0, destAddress, 0, 8);
|
||||||
/* copy IID from packet */
|
/* copy IID from packet */
|
||||||
packet.copy(hc06_ptr, destAddress, 8, 8);
|
packet.copy(hc06_ptr, destAddress, 8, 8);
|
||||||
|
@ -295,7 +288,6 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
break;
|
break;
|
||||||
case SICSLOWPAN_IPHC_DAM_10: /* 16 bits */
|
case SICSLOWPAN_IPHC_DAM_10: /* 16 bits */
|
||||||
/* unicast address */
|
/* unicast address */
|
||||||
destAddress = new byte[16];
|
|
||||||
System.arraycopy(context, 0, destAddress, 0, 8);
|
System.arraycopy(context, 0, destAddress, 0, 8);
|
||||||
/* copy IID from packet */
|
/* copy IID from packet */
|
||||||
packet.copy(hc06_ptr, destAddress, 14, 2);
|
packet.copy(hc06_ptr, destAddress, 14, 2);
|
||||||
|
@ -303,7 +295,6 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
break;
|
break;
|
||||||
case SICSLOWPAN_IPHC_DAM_11: /* 0 bits */
|
case SICSLOWPAN_IPHC_DAM_11: /* 0 bits */
|
||||||
/* unicast address */
|
/* unicast address */
|
||||||
destAddress = new byte[16];
|
|
||||||
System.arraycopy(context, 0, destAddress, 0, 8);
|
System.arraycopy(context, 0, destAddress, 0, 8);
|
||||||
/* infer IID from L2 address */
|
/* infer IID from L2 address */
|
||||||
System.arraycopy(packet.llreceiver, 0, destAddress,
|
System.arraycopy(packet.llreceiver, 0, destAddress,
|
||||||
|
@ -314,26 +305,22 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
/* not context based => link local M = 0, DAC = 0 - same as SAC */
|
/* not context based => link local M = 0, DAC = 0 - same as SAC */
|
||||||
switch (packet.get(1) & SICSLOWPAN_IPHC_DAM_11) {
|
switch (packet.get(1) & SICSLOWPAN_IPHC_DAM_11) {
|
||||||
case SICSLOWPAN_IPHC_DAM_00: /* 128 bits */
|
case SICSLOWPAN_IPHC_DAM_00: /* 128 bits */
|
||||||
destAddress = new byte[16];
|
|
||||||
packet.copy(hc06_ptr, destAddress, 0, 16);
|
packet.copy(hc06_ptr, destAddress, 0, 16);
|
||||||
hc06_ptr += 16;
|
hc06_ptr += 16;
|
||||||
break;
|
break;
|
||||||
case SICSLOWPAN_IPHC_DAM_01: /* 64 bits */
|
case SICSLOWPAN_IPHC_DAM_01: /* 64 bits */
|
||||||
destAddress = new byte[16];
|
|
||||||
destAddress[0] = (byte) 0xfe;
|
destAddress[0] = (byte) 0xfe;
|
||||||
destAddress[1] = (byte) 0x80;
|
destAddress[1] = (byte) 0x80;
|
||||||
packet.copy(hc06_ptr, destAddress, 8, 8);
|
packet.copy(hc06_ptr, destAddress, 8, 8);
|
||||||
hc06_ptr += 8;
|
hc06_ptr += 8;
|
||||||
break;
|
break;
|
||||||
case SICSLOWPAN_IPHC_DAM_10: /* 16 bits */
|
case SICSLOWPAN_IPHC_DAM_10: /* 16 bits */
|
||||||
destAddress = new byte[16];
|
|
||||||
destAddress[0] = (byte) 0xfe;
|
destAddress[0] = (byte) 0xfe;
|
||||||
destAddress[1] = (byte) 0x80;
|
destAddress[1] = (byte) 0x80;
|
||||||
packet.copy(hc06_ptr, destAddress, 14, 2);
|
packet.copy(hc06_ptr, destAddress, 14, 2);
|
||||||
hc06_ptr += 2;
|
hc06_ptr += 2;
|
||||||
break;
|
break;
|
||||||
case SICSLOWPAN_IPHC_DAM_11: /* 0 bits */
|
case SICSLOWPAN_IPHC_DAM_11: /* 0 bits */
|
||||||
destAddress = new byte[16];
|
|
||||||
destAddress[0] = (byte) 0xfe;
|
destAddress[0] = (byte) 0xfe;
|
||||||
destAddress[1] = (byte) 0x80;
|
destAddress[1] = (byte) 0x80;
|
||||||
System.arraycopy(packet.llreceiver, 0, destAddress,
|
System.arraycopy(packet.llreceiver, 0, destAddress,
|
||||||
|
@ -376,7 +363,6 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
packet.pos += hc06_ptr;
|
|
||||||
|
|
||||||
// /* IP length field. */
|
// /* IP length field. */
|
||||||
// if(ip_len == 0) {
|
// if(ip_len == 0) {
|
||||||
|
@ -396,6 +382,12 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
|
|
||||||
/*--------------------------------------------- */
|
/*--------------------------------------------- */
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
// some kind of unexpected error...
|
||||||
|
error = " error during IPHC parsing: " + e.getMessage();
|
||||||
|
}
|
||||||
|
packet.pos += hc06_ptr;
|
||||||
|
|
||||||
String protoStr = "" + proto;
|
String protoStr = "" + proto;
|
||||||
if (proto == PROTO_ICMP) {
|
if (proto == PROTO_ICMP) {
|
||||||
protoStr = "ICMPv6";
|
protoStr = "ICMPv6";
|
||||||
|
@ -408,11 +400,18 @@ public class IPHCPacketAnalyzer extends PacketAnalyzer {
|
||||||
printAddress(verbose, srcAddress);
|
printAddress(verbose, srcAddress);
|
||||||
verbose.append(" to ");
|
verbose.append(" to ");
|
||||||
printAddress(verbose, destAddress);
|
printAddress(verbose, destAddress);
|
||||||
|
if (error != null) verbose.append(" " + error);
|
||||||
|
|
||||||
packet.lastDispatch = (byte) (proto & 0xff);
|
packet.lastDispatch = (byte) (proto & 0xff);
|
||||||
|
if (proto == PROTO_UDP || proto == PROTO_ICMP ||
|
||||||
|
proto == PROTO_TCP) {
|
||||||
|
packet.level = APPLICATION_LEVEL;
|
||||||
|
return ANALYSIS_OK_CONTINUE;
|
||||||
|
} else {
|
||||||
packet.level = NETWORK_LEVEL;
|
packet.level = NETWORK_LEVEL;
|
||||||
return ANALYSIS_OK_CONTINUE;
|
return ANALYSIS_OK_CONTINUE;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void printAddress(StringBuffer out, byte[] address) {
|
public static void printAddress(StringBuffer out, byte[] address) {
|
||||||
for (int i = 0; i < 16; i+=2) {
|
for (int i = 0; i < 16; i+=2) {
|
||||||
|
|
|
@ -16,7 +16,7 @@ public class IPv6PacketAnalyzer extends PacketAnalyzer {
|
||||||
private static final int IPV6_DISPATCH = 0x41;
|
private static final int IPV6_DISPATCH = 0x41;
|
||||||
|
|
||||||
public boolean matchPacket(Packet packet) {
|
public boolean matchPacket(Packet packet) {
|
||||||
return packet.get(0) == IPV6_DISPATCH;
|
return packet.level == NETWORK_LEVEL && packet.get(0) == IPV6_DISPATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int analyzePacket(Packet packet, StringBuffer brief,
|
public int analyzePacket(Packet packet, StringBuffer brief,
|
||||||
|
@ -63,7 +63,7 @@ public class IPv6PacketAnalyzer extends PacketAnalyzer {
|
||||||
printAddress(verbose, destAddress);
|
printAddress(verbose, destAddress);
|
||||||
|
|
||||||
packet.lastDispatch = (byte) (proto & 0xff);
|
packet.lastDispatch = (byte) (proto & 0xff);
|
||||||
packet.level = NETWORK_LEVEL;
|
packet.level = APPLICATION_LEVEL;
|
||||||
return ANALYSIS_OK_CONTINUE;
|
return ANALYSIS_OK_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ public abstract class PacketAnalyzer {
|
||||||
public static final int RADIO_LEVEL = 0;
|
public static final int RADIO_LEVEL = 0;
|
||||||
public static final int MAC_LEVEL = 1;
|
public static final int MAC_LEVEL = 1;
|
||||||
public static final int NETWORK_LEVEL = 2;
|
public static final int NETWORK_LEVEL = 2;
|
||||||
|
public static final int APPLICATION_LEVEL = 3;
|
||||||
|
|
||||||
public static class Packet {
|
public static class Packet {
|
||||||
byte[] data;
|
byte[] data;
|
||||||
|
|
Loading…
Reference in a new issue