You can subscribe to this list here.
2007 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(21) |
Nov
(12) |
Dec
(41) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2008 |
Jan
(25) |
Feb
(54) |
Mar
(63) |
Apr
(52) |
May
(17) |
Jun
(3) |
Jul
(3) |
Aug
(5) |
Sep
(49) |
Oct
(50) |
Nov
(34) |
Dec
(14) |
2009 |
Jan
(9) |
Feb
(15) |
Mar
(38) |
Apr
(12) |
May
(35) |
Jun
(20) |
Jul
(2) |
Aug
(7) |
Sep
(36) |
Oct
(24) |
Nov
(2) |
Dec
(2) |
2010 |
Jan
(14) |
Feb
(1) |
Mar
(36) |
Apr
(2) |
May
(4) |
Jun
(6) |
Jul
(35) |
Aug
(11) |
Sep
(8) |
Oct
(3) |
Nov
|
Dec
(1) |
2011 |
Jan
(11) |
Feb
(12) |
Mar
(3) |
Apr
(7) |
May
(12) |
Jun
(8) |
Jul
|
Aug
(3) |
Sep
(4) |
Oct
|
Nov
(2) |
Dec
(4) |
2012 |
Jan
(2) |
Feb
(1) |
Mar
(14) |
Apr
(5) |
May
(28) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(21) |
Nov
(4) |
Dec
(1) |
2013 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
(2) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: <jo...@us...> - 2009-05-24 22:11:14
|
Revision: 537 http://mspsim.svn.sourceforge.net/mspsim/?rev=537&view=rev Author: joxe Date: 2009-05-24 22:11:04 +0000 (Sun, 24 May 2009) Log Message: ----------- improved TSP tunnel client, added tunnel CLI command - improved RA to work better Modified Paths: -------------- mspsim/se/sics/mspsim/cli/MiscCommands.java mspsim/se/sics/mspsim/net/HC01Packeter.java mspsim/se/sics/mspsim/net/ICMP6Packet.java mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java mspsim/se/sics/mspsim/net/IPStack.java mspsim/se/sics/mspsim/net/IPv6Packet.java mspsim/se/sics/mspsim/net/LoWPANHandler.java mspsim/se/sics/mspsim/net/Packet.java mspsim/se/sics/mspsim/net/TSPClient.java mspsim/se/sics/mspsim/platform/GenericNode.java Added Paths: ----------- mspsim/se/sics/mspsim/cli/NetCommands.java mspsim/se/sics/mspsim/net/BytePayload.java mspsim/se/sics/mspsim/net/NetworkInterface.java Modified: mspsim/se/sics/mspsim/cli/MiscCommands.java =================================================================== --- mspsim/se/sics/mspsim/cli/MiscCommands.java 2009-05-23 21:43:41 UTC (rev 536) +++ mspsim/se/sics/mspsim/cli/MiscCommands.java 2009-05-24 22:11:04 UTC (rev 537) @@ -314,35 +314,6 @@ context.executeCommand(command); } }); - handler.registerCommand("rfanalyzer", new BasicLineCommand("analyze radio packets", "") { - CC2420PacketHandler listener; - CommandContext context; - public int executeCommand(CommandContext context) { - this.context = context; - MSP430 cpu = (MSP430) registry.getComponent(MSP430.class); - listener = new CC2420PacketHandler(cpu); - listener.setOutput(context.out); - IEEE802154Handler ieeeHandler = new IEEE802154Handler(); - listener.addUpperLayerHandler(0, ieeeHandler); - ieeeHandler.setLowerLayerHandler(listener); - IPStack ipStack = new IPStack(); - LoWPANHandler lowpanHandler = new LoWPANHandler(ipStack); - ieeeHandler.addUpperLayerHandler(0, lowpanHandler); - lowpanHandler.setLowerLayerHandler(ieeeHandler); - ipStack.setLinkLayerHandler(lowpanHandler); - return 0; - } - public void lineRead(String line) { - if (listener != null) { - byte[] data = Utils.hexconv(line); - for (int i = 0; i < data.length; i++) { - //context.out.println("Byte " + i + " = " + ((int) data[i] & 0xff)); - // Currently it will autoprint when packet is ready... - listener.receivedByte(data[i]); - } - } - } - }); handler.registerCommand("rflistener", new BasicLineCommand("an rflisteer", "[input|output] <rf-chip>") { CommandContext context; Added: mspsim/se/sics/mspsim/cli/NetCommands.java =================================================================== --- mspsim/se/sics/mspsim/cli/NetCommands.java (rev 0) +++ mspsim/se/sics/mspsim/cli/NetCommands.java 2009-05-24 22:11:04 UTC (rev 537) @@ -0,0 +1,68 @@ +/** + * + */ +package se.sics.mspsim.cli; + +import se.sics.mspsim.core.MSP430; +import se.sics.mspsim.net.CC2420PacketHandler; +import se.sics.mspsim.net.IEEE802154Handler; +import se.sics.mspsim.net.IPStack; +import se.sics.mspsim.net.LoWPANHandler; +import se.sics.mspsim.util.ComponentRegistry; +import se.sics.mspsim.util.Utils; + +/** + * @author joakim + * + */ +public class NetCommands implements CommandBundle { + + private IPStack ipStack; + public void setupCommands(final ComponentRegistry registry, CommandHandler handler) { + + handler.registerCommand("ipstack", new BasicLineCommand("setup 802.15.4/IP stack", "") { + CC2420PacketHandler listener; + CommandContext context; + public int executeCommand(CommandContext context) { + this.context = context; + MSP430 cpu = (MSP430) registry.getComponent(MSP430.class); + listener = new CC2420PacketHandler(cpu); + listener.setOutput(context.out); + IEEE802154Handler ieeeHandler = new IEEE802154Handler(); + listener.addUpperLayerHandler(0, ieeeHandler); + ieeeHandler.setLowerLayerHandler(listener); + ipStack = new IPStack(); + LoWPANHandler lowpanHandler = new LoWPANHandler(ipStack); + ieeeHandler.addUpperLayerHandler(0, lowpanHandler); + lowpanHandler.setLowerLayerHandler(ieeeHandler); + ipStack.setLinkLayerHandler(lowpanHandler); + context.err.print("IP Stack started"); + return 0; + } + + public void lineRead(String line) { + if (listener != null) { + byte[] data = Utils.hexconv(line); + for (int i = 0; i < data.length; i++) { + //context.out.println("Byte " + i + " = " + ((int) data[i] & 0xff)); + // Currently it will autoprint when packet is ready... + listener.receivedByte(data[i]); + } + } + } + }); + + handler.registerCommand("tspstart", new BasicCommand("starts a TSP tunnel", "<server> <user> <password>") { + public int executeCommand(CommandContext context) { + if (ipStack.startTSPTunnel(context.getArgument(0), + context.getArgument(1), context.getArgument(2))) { + context.out.print("TSP Tunnel started"); + return 0; + } else { + context.out.print("TSP Tunnel failed"); + return 1; + } + } + }); + } +} Added: mspsim/se/sics/mspsim/net/BytePayload.java =================================================================== --- mspsim/se/sics/mspsim/net/BytePayload.java (rev 0) +++ mspsim/se/sics/mspsim/net/BytePayload.java 2009-05-24 22:11:04 UTC (rev 537) @@ -0,0 +1,25 @@ +package se.sics.mspsim.net; + +/* keep the packet payload untouched ... */ +public class BytePayload implements IPPayload { + + byte[] payloadData; + byte dispatch; + + public BytePayload(IPv6Packet packet) { + parsePacketData(packet); + } + + public byte[] generatePacketData(IPv6Packet packet) { + return payloadData; + } + + public byte getDispatch() { + return dispatch; + } + + public void parsePacketData(IPv6Packet packet) { + dispatch = packet.getDispatch(); + payloadData = packet.getPayload(); + } +} Modified: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-23 21:43:41 UTC (rev 536) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-24 22:11:04 UTC (rev 537) @@ -185,7 +185,7 @@ /* write version and flow if needed */ if ((enc1 & IPHC_VF_C) == 0) { - pos += packet.writeVFlow(data, pos); + pos += writeVFlow(packet, data, pos); } /* write traffic class if needed */ if ((enc1 & IPHC_TC_C) == 0) { @@ -315,6 +315,14 @@ return dataPacket; } + public int writeVFlow(IPv6Packet packet, byte[] data, int pos) { + data[pos++] = (byte) (0x60 | (packet.flowLabel >> 16) & 0x0f); + data[pos++] = (byte)((packet.flowLabel >> 8) & 0xff); + data[pos++] = (byte) (packet.flowLabel & 0xff); + return 3; + } + + public void parsePacketData(IPv6Packet packet) { /* first two is ... */ int pos = 2; Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-23 21:43:41 UTC (rev 536) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-24 22:11:04 UTC (rev 537) @@ -2,6 +2,8 @@ import java.io.PrintStream; import java.util.ArrayList; +import se.sics.mspsim.util.Utils; + public class ICMP6Packet implements IPPayload { public static final int DISPATCH = 58; @@ -45,18 +47,20 @@ byte hopLimit = (byte) 128; byte autoConfigFlags; - int routerLifetime = 600; /* time in seconds for keeping the router as default */ - int reachableTime = 10000; /* time in millis when node still should be counted as reachable */ - int retransmissionTimer = 1000; /* time in millis between solicitations */ + int routerLifetime = 100; /* time in seconds for keeping the router as default */ + int reachableTime = 360000; /* time in millis when node still should be counted as reachable */ + int retransmissionTimer = 0; /* time in millis between solicitations */ int mtuSize = 1280; + byte[] echoData; + private ArrayList<byte[]> options = new ArrayList<byte[]>(); /* prefix info option - type = 3, len = 4 (64x4 bits), prefix = 64 bits */ private final static byte[] defaultPrefixInfo = new byte[] {3, 4, 64, (byte) (ON_LINK | AUTOCONFIG), - 0, 0, 1, 0, /* valid lifetime - 256 seconds for now*/ - 0, 1, 0, 0, /* prefered lifetime - 65535 seconds lifetime of autoconf addr */ + (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, /* valid lifetime -1 seconds for now*/ + (byte)0xff, (byte)0xff, (byte)0xff, (byte)0xff, /* prefered lifetime -1 seconds lifetime of autoconf addr */ 0, 0, 0, 0, /* reserved */ /* the prefix ... */ (byte)0xaa, (byte)0xaa, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 @@ -70,6 +74,8 @@ options.clear(); byte[] prefixInfo = new byte[defaultPrefixInfo.length]; System.arraycopy(defaultPrefixInfo, 0, prefixInfo, 0, defaultPrefixInfo.length); + byte[] prefix = stack.prefix; + System.arraycopy(prefix, 0, prefixInfo, 16, prefix.length); options.add(prefixInfo); options.add(mtuOption); addLinkOption(SOURCE_LINKADDR, llAddr); @@ -97,6 +103,14 @@ return null; } + public byte[] getEchoData() { + return echoData; + } + + public void setEchoData(byte[] edata) { + echoData = edata; + } + public void printPacket(PrintStream out) { String typeS = "" + type; if (type >= 128) { @@ -119,6 +133,7 @@ System.out.println(" routerLifeTime: " + routerLifetime + " (sec)"); System.out.println(" reachableTime: " + reachableTime + " (msec)"); System.out.println(" retransmissionTimer: " + retransmissionTimer + " (msec)"); + System.out.println(" autoConf: " + autoConfigFlags); byte[] prefixInfo = getOption(PREFIX_INFO); int bits = prefixInfo[2]; int bytes = bits / 8; @@ -128,6 +143,8 @@ if ((i & 1) == 1) out.print(":"); } out.println("/" + bits); + out.println("RA Valid Lifetime: " + Packet.get32(prefixInfo, 4)); + out.println("RA Pref. Lifetime: " + Packet.get32(prefixInfo, 8)); byte[] srcLink = getOption(SOURCE_LINKADDR); if (srcLink != null) { /* assuming 8 bytes for the mac ??? */ @@ -153,7 +170,11 @@ case ECHO_REPLY: id = packet.get16(4); seqNo = packet.get16(6); - handleOptions(packet, 8); + int dataLen = packet.getPayloadLength() - 8; + if (dataLen > 0) { + echoData = new byte[dataLen]; + packet.copy(8, echoData, 0, dataLen); + } break; case NEIGHBOR_SOLICITATION: case NEIGHBOR_ADVERTISEMENT: @@ -219,7 +240,11 @@ buffer[pos++] = (byte) (id & 0xff); buffer[pos++] = (byte) (seqNo >> 8); buffer[pos++] = (byte) (seqNo & 0xff); - pos = addOptions(buffer, pos); + if (echoData != null) { + for (int i = 0; i < echoData.length; i++) { + buffer[pos++] = echoData[i]; + } + } break; case NEIGHBOR_SOLICITATION: case NEIGHBOR_ADVERTISEMENT: @@ -279,4 +304,17 @@ public byte getDispatch() { return DISPATCH; } + + + public static void main(String[] args) { + byte[] pData = Utils.hexconv("6000000000403a3f200105c01000000a00000000000001ad200105c011024e000212740504030201800070e3de1b00011b87194ad859000008090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637"); + IPv6Packet packet = new IPv6Packet(); + packet.setBytes(pData); + packet.parsePacketData(packet); + if (packet.nextHeader == 58) { + ICMP6Packet icmpPacket = new ICMP6Packet(); + icmpPacket.parsePacketData(packet); + icmpPacket.printPacket(System.out); + } + } } Modified: mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-23 21:43:41 UTC (rev 536) +++ mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-24 22:11:04 UTC (rev 537) @@ -29,7 +29,7 @@ // is this ok? ipp.destAddress = packet.sourceAddress; ipp.sourceAddress = ipStack.myLocalIPAddress; - ipStack.sendPacket(ipp); + ipStack.sendPacket(ipp, packet.netInterface); break; case ICMP6Packet.ECHO_REPLY: System.out.println("ICMP6 got echo reply!!"); @@ -50,7 +50,7 @@ // is this ok? ipp.destAddress = packet.sourceAddress; ipp.sourceAddress = ipStack.myLocalIPAddress; - ipStack.sendPacket(ipp); + ipStack.sendPacket(ipp, packet.netInterface); break; case ICMP6Packet.ROUTER_SOLICITATION: if (ipStack.isRouter()) { @@ -71,8 +71,9 @@ ipp.sourceAddress = ipStack.myLocalIPAddress; System.out.print("Created ICMP6 RA for "); IPv6Packet.printAddress(System.out, ipp.destAddress); + packet.printPacket(System.out); - ipStack.sendPacket(ipp); + ipStack.sendPacket(ipp, packet.netInterface); } break; } Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-05-23 21:43:41 UTC (rev 536) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-05-24 22:11:04 UTC (rev 537) @@ -46,9 +46,10 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.net.SocketException; +import java.net.UnknownHostException; import java.util.Arrays; -import se.sics.mspsim.core.MSP430; import se.sics.mspsim.util.Utils; public class IPStack { @@ -56,7 +57,9 @@ public static final byte[] ALL_NODES = {(byte) 0xff, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; public static final byte[] ALL_ROUTERS = {(byte) 0xff, 0x02, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 1}; + 0, 0, 0, 0, 0, 0, 0, 2}; + public static final byte[] UNSPECIFIED = {(byte) 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; byte[] prefix = null; int prefixSize = 0; @@ -77,10 +80,15 @@ /* is router -> router behavior */ private boolean isRouter = true; + + private IPPacketer tunnelPacketer = new IPv6Packet(); + private TSPClient tunnel; /* this needs to be generalized later... and down to lowpan too... */ //private HC01Packeter ipPacketer = new HC01Packeter(); - + + // TODO: read from configfile... + public IPStack() { icmp6Handler = new ICMP6PacketHandler(this); prefix = new byte[] {(byte) 0xaa, (byte)0xaa, 0, 0, 0, 0, 0, 0}; @@ -88,6 +96,20 @@ configureIPAddress(); } + public boolean startTSPTunnel(String server, String user, String password) { + try { + tunnel = new TSPClient(server, user, password); + tunnel.setIPStack(this); + tunnel.waitSetup(); + return tunnel.isReady(); + } catch (SocketException e) { + e.printStackTrace(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + return false; + } + public void setLinkLayerHandler(PacketHandler handler) { linkLayerHandler = handler; } @@ -98,6 +120,22 @@ configureIPAddress(); } + public boolean isOnLink(byte[] address) { + /* bc or link local */ + if (address[0] == ((byte) 0xff) || (address[0] == ((byte) 0xfe) && + address[1] == ((byte)0x80))) { + return true; + } + + /* unspecified - on link ?? */ + if (Arrays.equals(UNSPECIFIED, address)) return true; + /* prefix match? */ + for (int i = 0; i < prefixSize / 8; i++) { + if (address[i] != prefix[i]) return false; + } + return true; + } + public void configureIPAddress() { if (prefix != null) { System.arraycopy(prefix, 0, myIPAddress, 0, prefixSize / 8); @@ -107,6 +145,9 @@ } /* autoconfig ?? */ myLocalIPAddress[8] = myIPAddress[8] = (byte) (myIPAddress[8] ^ 0x02); + + System.out.println("***** Prefix Set / IP address: "); + IPv6Packet.printAddress(System.out, myIPAddress); } private boolean findRoute(IPv6Packet packet) { @@ -135,24 +176,74 @@ macAddr[0] = (byte) (macAddr[0] ^ 0x02); } - public void sendPacket(IPv6Packet packet) { + /* send a packet - can be bound for specific interface */ + public void sendPacket(IPv6Packet packet, NetworkInterface nIf) { /* find route checks if there are link addr, and otherwise sets them */ - if (findRoute(packet)) { - linkLayerHandler.sendPacket(packet); + if (nIf == linkLayerHandler || + (nIf == null) && isOnLink(packet.getDestinationAddress())) { + if (findRoute(packet)) { + linkLayerHandler.sendPacket(packet); + } + } else { + System.out.println("*** Should go out on tunnel: "); + System.out.print("MyAddress: "); + IPv6Packet.printAddress(System.out, myIPAddress); + System.out.print(", Dest: "); + IPv6Packet.printAddress(System.out, packet.getDestinationAddress()); + if (tunnel.isReady()) { + tunnel.sendPacket(packet); + } } } public void receivePacket(IPv6Packet packet) { - System.out.println("IPv6 packet received!!!"); + System.out.println("IPv6 packet received!"); packet.printPacket(System.out); - switch (packet.nextHeader) { - case ICMP6Packet.DISPATCH: - icmp6Handler.handlePacket(packet); - break; + if (!isOnLink(packet.getDestinationAddress()) && + packet.netInterface != tunnel) { + System.out.println("**** Should go out on tunnel!!!!"); + if (packet.ipPayload == null) { + packet.setIPPayload(new BytePayload(packet)); + } + /* will this work ??? */ + System.out.print("MyAddress: "); + IPv6Packet.printAddress(System.out, myIPAddress); + System.out.print(", Dest: "); + IPv6Packet.printAddress(System.out, packet.getDestinationAddress()); + if (tunnel.isReady()) { + tunnel.sendPacket(packet); + } + } else if (isForMe(packet.getDestinationAddress())){ + System.out.println("#### PACKET FOR ME!!!"); + switch (packet.nextHeader) { + case ICMP6Packet.DISPATCH: + icmp6Handler.handlePacket(packet); + break; + } + } else if (packet.netInterface != linkLayerHandler) { + /* Can not be from link layer (default) -- */ + /* if HC01 - we need to handle UDP at least... */ + System.out.println("#### PACKET FOR: " + packet.getDestinationAddress() + " sent to link"); + if (packet.ipPayload == null) { + packet.setIPPayload(new BytePayload(packet)); + if (findRoute(packet)) { + linkLayerHandler.sendPacket(packet); + } + } } } - + + /* is the packet for me ? */ + private boolean isForMe(byte[] address) { + if (Arrays.equals(myIPAddress, address) || + Arrays.equals(myLocalIPAddress, address)) return true; + if (isRouter && Arrays.equals(ALL_ROUTERS, address)) return true; + if (Arrays.equals(ALL_NODES, address)) return true; + if (Arrays.equals(UNSPECIFIED, address)) return true; + return false; + } + public void setLinkLayerAddress(byte[] addr) { myLinkAddress = addr; } Modified: mspsim/se/sics/mspsim/net/IPv6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-23 21:43:41 UTC (rev 536) +++ mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-24 22:11:04 UTC (rev 537) @@ -43,6 +43,8 @@ import java.io.PrintStream; +import se.sics.mspsim.util.Utils; + /** * @author Joakim Eriksson, SICS * @@ -50,6 +52,7 @@ public class IPv6Packet extends Packet implements IPPacketer { public static final int ICMP6_DISPATCH = 58; + public static final boolean DEBUG = true; int version; int trafficClass; @@ -62,6 +65,7 @@ int ipLen = 0; int payloadLen = 0; IPPayload ipPayload; + public NetworkInterface netInterface; public IPv6Packet() { version = 6; @@ -107,8 +111,13 @@ } /* this is for setting raw packet data */ +//TODO: should not take an argument here??? it should parse its own +// data array??? public void parsePacketData(IPv6Packet packet) { version = (packet.getData(0) & 0xff) >> 4; + if (DEBUG) { + System.out.println("IPv6Packet: version: " + version); + } if (version != 6) { return; } @@ -119,7 +128,7 @@ packet.getData(3) & 0xff; payloadLen = ((packet.getData(4) & 0xff) << 8) + packet.getData(5); nextHeader = packet.getData(6); - hopLimit = packet.getData(7); + hopLimit = packet.getData(7) & 0xff; packet.copy(8, sourceAddress, 0, 16); packet.copy(24, destAddress, 0, 16); // move position 40 bytes forward for handling next headers / payload @@ -172,13 +181,6 @@ return sum; } - public int writeVFlow(byte[] data, int pos) { - data[pos++] = (byte) (0x60 | (flowLabel >> 16) & 0x0f); - data[pos++] = (byte)((flowLabel >> 8) & 0xff); - data[pos++] = (byte) (flowLabel & 0xff); - return 3; - } - public static boolean isMACBased(byte[] address, byte[] macAddress) { if (address[8] == (macAddress[0] ^ 0x02)) { for (int i = 1; i < macAddress.length; i++) { @@ -209,10 +211,32 @@ return nextHeader; } - @Override + // TODO: should not take an argument here - should be this packet + // that should be generating the data??? public byte[] generatePacketData(IPv6Packet packet) { - // TODO Auto-generated method stub - return null; + byte[] payload = ipPayload.generatePacketData(packet); + int size = 40 + payload.length; + byte[] dataPacket = new byte[size]; + + dataPacket[0] = (byte) (0x60 | (trafficClass >> 4) & 0x0f); + dataPacket[1] = (byte) (((trafficClass & 0xf) << 4) | + ((flowLabel >> 16) & 0xf)); + dataPacket[2] = (byte) ((trafficClass >> 8) & 0xff); + dataPacket[3] = (byte) (trafficClass & 0xff); + + dataPacket[4] = (byte) ((payload.length >> 8) & 0xff); + dataPacket[5] = (byte) (payload.length & 0xff); + + dataPacket[6] = (byte) (nextHeader & 0xff); + dataPacket[7] = (byte) (hopLimit & 0xff); + + int pos = 8; + System.arraycopy(packet.getSourceAddress(), 0, dataPacket, pos, 16); + pos += 16; + System.arraycopy(packet.getDestinationAddress(), 0, dataPacket, pos, 16); + pos += 16; + System.arraycopy(payload, 0, dataPacket, 40, payload.length); + return dataPacket; } public IPPayload getIPPayload() { @@ -232,4 +256,12 @@ out.print(":"); } } + + public static void main(String[] args) { + byte[] data = Utils.hexconv("6000000000200001fe80000000000000023048fffe904cd2ff02000000000000000000026c5b5f303a000100050200008300527800000000ff02000000000000000000026c5b5f30"); + IPv6Packet packet = new IPv6Packet(); + packet.setBytes(data); + packet.parsePacketData(packet); + packet.printPacket(System.out); + } } \ No newline at end of file Modified: mspsim/se/sics/mspsim/net/LoWPANHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/LoWPANHandler.java 2009-05-23 21:43:41 UTC (rev 536) +++ mspsim/se/sics/mspsim/net/LoWPANHandler.java 2009-05-24 22:11:04 UTC (rev 537) @@ -39,7 +39,7 @@ */ package se.sics.mspsim.net; -public class LoWPANHandler extends AbstractPacketHandler { +public class LoWPANHandler extends AbstractPacketHandler implements NetworkInterface { private IPStack ipStack; @@ -47,6 +47,10 @@ ipStack = stack; } + public String getName() { + return "6lowpan"; + } + public void packetReceived(Packet packet) { /* create IP packet based on the correct dispatch */ IPv6Packet ipPacket = new IPv6Packet(packet); @@ -57,6 +61,7 @@ if (dispatch == ipStack.getDefaultPacketer().getDispatch()) { ipStack.getDefaultPacketer().parsePacketData(ipPacket); /* send in the packet */ + ipPacket.netInterface = this; ipStack.receivePacket(ipPacket); } } Added: mspsim/se/sics/mspsim/net/NetworkInterface.java =================================================================== --- mspsim/se/sics/mspsim/net/NetworkInterface.java (rev 0) +++ mspsim/se/sics/mspsim/net/NetworkInterface.java 2009-05-24 22:11:04 UTC (rev 537) @@ -0,0 +1,5 @@ +package se.sics.mspsim.net; + +public interface NetworkInterface { + public String getName(); +} Modified: mspsim/se/sics/mspsim/net/Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/Packet.java 2009-05-23 21:43:41 UTC (rev 536) +++ mspsim/se/sics/mspsim/net/Packet.java 2009-05-24 22:11:04 UTC (rev 537) @@ -124,13 +124,33 @@ public int get32(int pos) { pos = currentPos + pos; - if (packetData.length > pos + 3) + if (packetData.length >= pos + 3) { return ((packetData[pos] & 0xff) << 24) | ((packetData[pos + 1] & 0xff) << 16) | ((packetData[pos + 2] & 0xff) << 8) | (packetData[pos + 3] & 0xff); + } return 0; } + + public static int get32(byte[] data, int pos) { + if (data.length >= pos + 3) { + return ((data[pos] & 0xff) << 24) | + ((data[pos + 1] & 0xff) << 16) | + ((data[pos + 2] & 0xff) << 8) | + (data[pos + 3] & 0xff); + } + return 0; + } + + public static int get16(byte[] data, int pos) { + if (data.length >= pos + 1) { + return ((data[pos] & 0xff) << 8) | + ((data[pos + 1] & 0xff) << 0); + } + return 0; + } + public int get16(int pos) { pos = currentPos + pos; Modified: mspsim/se/sics/mspsim/net/TSPClient.java =================================================================== --- mspsim/se/sics/mspsim/net/TSPClient.java 2009-05-23 21:43:41 UTC (rev 536) +++ mspsim/se/sics/mspsim/net/TSPClient.java 2009-05-24 22:11:04 UTC (rev 537) @@ -9,7 +9,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class TSPClient { +public class TSPClient implements NetworkInterface { public static final int DEFAULT_PORT = 3653; private static final byte[] VERSION = "VERSION=2.0.0\r\n".getBytes(); @@ -17,13 +17,14 @@ private static final byte[] AUTH_ANON = "AUTHENTICATE ANONYMOUS\r\b".getBytes(); enum WriterState {WAIT, STARTED, CAPABILITIES_RECEIVED, AUTHENTICATE_REQ_OK, TUNNEL_CONF_RECEIVED, TUNNEL_UP}; - enum ReaderState {CAP_EXPECTED, AUTH_OK_EXPECTED, TUNNEL_CONF_EXPECTED, + enum ReaderState {CAP_EXPECTED, AUTH_ACK_EXPECTED, AUTH_OK_EXPECTED, TUNNEL_CONF_EXPECTED, TUNNEL_UP}; private static final Pattern prefixPattern = Pattern.compile("(?m).+?<prefix (.+?)>(.+?)</prefix>"); - + private IPStack ipStack; + WriterState writerState = WriterState.STARTED; ReaderState readerState = ReaderState.CAP_EXPECTED; @@ -35,8 +36,16 @@ private String user; private String password; + private boolean userLoggedIn = false; public TSPClient(String host) throws SocketException, UnknownHostException { + this(host, null, null); + } + + public TSPClient(String host, String user, String password) throws SocketException, UnknownHostException { + this.user = user; + this.password = password; + connection = new DatagramSocket(); serverAddr = InetAddress.getByName(host); //connection.connect(serverAddr, DEFAULT_PORT); @@ -67,6 +76,18 @@ new Thread(reader).start(); } + public String getName() { + return "tsp"; + } + + public void setIPStack(IPStack ipStack) { + this.ipStack = ipStack; + } + + public boolean isReady() { + return writerState == WriterState.TUNNEL_UP; + } + int wWait = 0; private void writer() throws IOException, InterruptedException { System.out.println("Writer started. sending version..."); @@ -87,18 +108,22 @@ System.out.println("Writer: sending AUTH"); if (user == null) { sendPacket(AUTH_ANON); + setReaderState(ReaderState.AUTH_OK_EXPECTED, WriterState.WAIT); } else { sendPacket(AUTH_PLAIN); + setReaderState(ReaderState.AUTH_ACK_EXPECTED, WriterState.WAIT); } - setReaderState(ReaderState.AUTH_OK_EXPECTED, WriterState.WAIT); break; case AUTHENTICATE_REQ_OK: - if (user == null) { + if (user == null || userLoggedIn) { sendTunnelReq(); + setReaderState(ReaderState.TUNNEL_CONF_EXPECTED, WriterState.WAIT); } else { // send login with user/pass!!! + sendAuth(); + userLoggedIn = true; + setReaderState(ReaderState.AUTH_OK_EXPECTED, WriterState.WAIT); } - setReaderState(ReaderState.TUNNEL_CONF_EXPECTED, WriterState.WAIT); break; case TUNNEL_CONF_RECEIVED: String accept = "<tunnel action=\"accept\"></tunnel>\r\n"; @@ -106,6 +131,7 @@ sendPacket(accept.getBytes()); System.out.println("*** Tunnel UP!"); setReaderState(ReaderState.TUNNEL_UP, WriterState.TUNNEL_UP); + notifyReady(); break; case TUNNEL_UP: /* all ok - do nothing but sleep.*/ @@ -117,15 +143,28 @@ } } } + + private synchronized void notifyReady() { + notifyAll(); + } + private void sendAuth() throws IOException { + String auth = "\0" + user + "\0" + password + "\r\n"; + sendPacket(auth.getBytes()); + } + private void sendTunnelReq() throws IOException { InetAddress myAddr = InetAddress.getLocalHost(); byte[] addr = myAddr.getAddress(); String myAddress = String.format("%d.%d.%d.%d", addr[0] & 0xff, addr[1] & 0xff, addr[2] & 0xff, addr[3] & 0xff); + String router = ""; + if (user != null) { + router = "<router><prefix length=\"64\"/></router>"; + } String tunnelConf = "<tunnel action=\"create\" type=\"v6udpv4\"><client><address type=\"ipv4\">" + - myAddress + "</address><keepalive interval=\"30\"></keepalive>" + + myAddress + "</address><keepalive interval=\"30\"></keepalive>" + router + "</client></tunnel>\r\n"; tunnelConf = "Content-length: " + tunnelConf.length() + "\r\n" + tunnelConf; @@ -161,7 +200,11 @@ case CAP_EXPECTED: writerState = WriterState.CAPABILITIES_RECEIVED; break; + case AUTH_ACK_EXPECTED: + writerState = WriterState.AUTHENTICATE_REQ_OK; + break; case AUTH_OK_EXPECTED: + // Check if auth is really ok!!! writerState = WriterState.AUTHENTICATE_REQ_OK; break; case TUNNEL_CONF_EXPECTED: @@ -169,18 +212,44 @@ Matcher m = prefixPattern.matcher(sData); if (m.find()) { System.out.println("Prefix: " + m.group(2) + " arg:" + m.group(1)); + if (ipStack != null) { + byte[] prefix = getPrefix(m.group(2)); + /* this is hardcoded for 64 bits for now */ + ipStack.setPrefix(prefix, 64); + } } } writerState = WriterState.TUNNEL_CONF_RECEIVED; break; case TUNNEL_UP: System.out.println("*** Tunneled packet received!!!"); + if (ipStack != null) { + IPv6Packet packet = new IPv6Packet(); + packet.setBytes(data, 0, receiveP.getLength()); + packet.parsePacketData(packet); + packet.netInterface = this; + ipStack.receivePacket(packet); + } break; } } } - + // handles format XXXX:XXXX:XXXX ... + private byte[] getPrefix(String prefix) { + prefix = prefix.trim(); + String[] parts = prefix.split(":"); + // each XXXX should be two bytes... + byte[] prefixBytes = new byte[parts.length * 2]; + for (int i = 0; i < parts.length; i++) { + System.out.println("## Parsing: " + parts[i]); + int val = Integer.parseInt(parts[i], 16); + prefixBytes[i * 2] = (byte) (val >> 8); + prefixBytes[i * 2 + 1] = (byte) (val & 0xff); + } + return prefixBytes; + } + private void sendPacket(byte[] packetData) throws IOException { byte[] pData = new byte[8 + packetData.length]; pData[0] = (byte) (0xf0 | (seq >>24) & 0xf); @@ -203,8 +272,23 @@ new String(packetData)); } + + public void sendPacket(IPv6Packet packet) { + byte[] data = packet.generatePacketData(packet); + System.out.println("Sending IPv6Packet on tunnel: " + data); + System.out.print("Packet: "); + packet.printPacket(System.out); + System.out.println(); + try { + sendPacket(data); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) throws UnknownHostException, IOException { // Pattern pattern = Pattern.compile("(?m).+?<server>(.+?)</server>.+?"); // String data = "<tunnel action=\"info\" type=\"v6udpv4\" lifetime=\"604800\">" + @@ -229,7 +313,21 @@ // System.out.println("No match"); // } // - - TSPClient tspc = new TSPClient(args[0]); + if (args.length == 1) { + TSPClient tspc = new TSPClient(args[0]); + } else if (args.length == 3) { + TSPClient tspc = new TSPClient(args[0], args[1], args[2]); + } } + + public synchronized boolean waitSetup() { + if (!isReady()) { + try { + wait(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + return isReady(); + } } Modified: mspsim/se/sics/mspsim/platform/GenericNode.java =================================================================== --- mspsim/se/sics/mspsim/platform/GenericNode.java 2009-05-23 21:43:41 UTC (rev 536) +++ mspsim/se/sics/mspsim/platform/GenericNode.java 2009-05-24 22:11:04 UTC (rev 537) @@ -46,6 +46,7 @@ import se.sics.mspsim.cli.CommandHandler; import se.sics.mspsim.cli.DebugCommands; import se.sics.mspsim.cli.MiscCommands; +import se.sics.mspsim.cli.NetCommands; import se.sics.mspsim.cli.ProfilerCommands; import se.sics.mspsim.cli.StreamCommandHandler; import se.sics.mspsim.cli.WindowCommands; @@ -200,6 +201,7 @@ registry.registerComponent("statcmd", new StatCommands(cpu, stats)); registry.registerComponent("wincmd", new WindowCommands()); registry.registerComponent("profilecmd", new ProfilerCommands()); + registry.registerComponent("netcmd", new NetCommands()); // Monitor execution cpu.setMonitorExec(true); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-23 21:43:46
|
Revision: 536 http://mspsim.svn.sourceforge.net/mspsim/?rev=536&view=rev Author: joxe Date: 2009-05-23 21:43:41 +0000 (Sat, 23 May 2009) Log Message: ----------- added TSPClient for support of IPv6 tunnels - initial non working version Modified Paths: -------------- mspsim/se/sics/mspsim/net/ICMP6Packet.java mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java Added Paths: ----------- mspsim/se/sics/mspsim/net/TSPClient.java Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-23 14:51:57 UTC (rev 535) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-23 21:43:41 UTC (rev 536) @@ -153,6 +153,7 @@ case ECHO_REPLY: id = packet.get16(4); seqNo = packet.get16(6); + handleOptions(packet, 8); break; case NEIGHBOR_SOLICITATION: case NEIGHBOR_ADVERTISEMENT: @@ -218,6 +219,7 @@ buffer[pos++] = (byte) (id & 0xff); buffer[pos++] = (byte) (seqNo >> 8); buffer[pos++] = (byte) (seqNo & 0xff); + pos = addOptions(buffer, pos); break; case NEIGHBOR_SOLICITATION: case NEIGHBOR_ADVERTISEMENT: Modified: mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-23 14:51:57 UTC (rev 535) +++ mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-23 21:43:41 UTC (rev 536) @@ -18,6 +18,22 @@ ICMP6Packet p; IPv6Packet ipp; switch (icmpPacket.type) { + case ICMP6Packet.ECHO_REQUEST: + p = new ICMP6Packet(); + p.type = ICMP6Packet.ECHO_REPLY; + p.seqNo = icmpPacket.seqNo; + p.id = icmpPacket.id; + + ipp = new IPv6Packet(); + ipp.setIPPayload(p); + // is this ok? + ipp.destAddress = packet.sourceAddress; + ipp.sourceAddress = ipStack.myLocalIPAddress; + ipStack.sendPacket(ipp); + break; + case ICMP6Packet.ECHO_REPLY: + System.out.println("ICMP6 got echo reply!!"); + break; case ICMP6Packet.NEIGHBOR_SOLICITATION: p = new ICMP6Packet(); p.targetAddress = icmpPacket.targetAddress; @@ -33,28 +49,31 @@ ipp.setIPPayload(p); // is this ok? ipp.destAddress = packet.sourceAddress; + ipp.sourceAddress = ipStack.myLocalIPAddress; ipStack.sendPacket(ipp); break; case ICMP6Packet.ROUTER_SOLICITATION: - p = new ICMP6Packet(); - p.targetAddress = icmpPacket.targetAddress; - p.type = ICMP6Packet.ROUTER_ADVERTISEMENT; - p.flags = ICMP6Packet.FLAG_SOLICITED | + if (ipStack.isRouter()) { + p = new ICMP6Packet(); + p.targetAddress = icmpPacket.targetAddress; + p.type = ICMP6Packet.ROUTER_ADVERTISEMENT; + p.flags = ICMP6Packet.FLAG_SOLICITED | ICMP6Packet.FLAG_OVERRIDE; - /* ensure that the RA is updated... */ - p.updateRA(ipStack); - - ipp = new IPv6Packet(); - ipp.setIPPayload(p); - // is this ok? - //ipp.destAddress = packet.sourceAddress; - ipp.destAddress = IPStack.ALL_NODES; //packet.sourceAddress; - ipp.sourceAddress = ipStack.myLocalIPAddress; - System.out.print("Created ICMP6 RA for "); - IPv6Packet.printAddress(System.out, ipp.destAddress); - - ipStack.sendPacket(ipp); + /* ensure that the RA is updated... */ + p.updateRA(ipStack); + + ipp = new IPv6Packet(); + ipp.setIPPayload(p); + // is this ok? + //ipp.destAddress = packet.sourceAddress; + ipp.destAddress = IPStack.ALL_NODES; //packet.sourceAddress; + ipp.sourceAddress = ipStack.myLocalIPAddress; + System.out.print("Created ICMP6 RA for "); + IPv6Packet.printAddress(System.out, ipp.destAddress); + + ipStack.sendPacket(ipp); + } break; } } Added: mspsim/se/sics/mspsim/net/TSPClient.java =================================================================== --- mspsim/se/sics/mspsim/net/TSPClient.java (rev 0) +++ mspsim/se/sics/mspsim/net/TSPClient.java 2009-05-23 21:43:41 UTC (rev 536) @@ -0,0 +1,235 @@ +package se.sics.mspsim.net; + +import java.io.IOException; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketException; +import java.net.UnknownHostException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class TSPClient { + + public static final int DEFAULT_PORT = 3653; + private static final byte[] VERSION = "VERSION=2.0.0\r\n".getBytes(); + private static final byte[] AUTH_PLAIN = "AUTHENTICATE PLAIN\r\b".getBytes(); + private static final byte[] AUTH_ANON = "AUTHENTICATE ANONYMOUS\r\b".getBytes(); + enum WriterState {WAIT, STARTED, CAPABILITIES_RECEIVED, AUTHENTICATE_REQ_OK, + TUNNEL_CONF_RECEIVED, TUNNEL_UP}; + enum ReaderState {CAP_EXPECTED, AUTH_OK_EXPECTED, TUNNEL_CONF_EXPECTED, + TUNNEL_UP}; + + private static final Pattern prefixPattern = + Pattern.compile("(?m).+?<prefix (.+?)>(.+?)</prefix>"); + + + WriterState writerState = WriterState.STARTED; + ReaderState readerState = ReaderState.CAP_EXPECTED; + + DatagramSocket connection; //args[0], DEFAULT_PORT); + + DatagramPacket receiveP; + InetAddress serverAddr; + int seq = 0; + + private String user; + private String password; + + public TSPClient(String host) throws SocketException, UnknownHostException { + connection = new DatagramSocket(); + serverAddr = InetAddress.getByName(host); + //connection.connect(serverAddr, DEFAULT_PORT); + receiveP = new DatagramPacket(new byte[1280], 1280); + + Runnable writer = new Runnable() { + public void run() { + try { + writer(); + } catch (IOException e) { + e.printStackTrace(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }; + Runnable reader = new Runnable() { + public void run() { + try { + reader(); + } catch (IOException e) { + e.printStackTrace(); + } + } + }; + + new Thread(writer).start(); + new Thread(reader).start(); + } + + int wWait = 0; + private void writer() throws IOException, InterruptedException { + System.out.println("Writer started. sending version..."); + while (true) { + switch (writerState) { + case STARTED: + sendPacket(VERSION); + setReaderState(ReaderState.CAP_EXPECTED, WriterState.WAIT); + break; + case WAIT: + Thread.sleep(100); + wWait++; + if (wWait > 10) { + System.out.println("Waited for " + wWait); + } + break; + case CAPABILITIES_RECEIVED: + System.out.println("Writer: sending AUTH"); + if (user == null) { + sendPacket(AUTH_ANON); + } else { + sendPacket(AUTH_PLAIN); + } + setReaderState(ReaderState.AUTH_OK_EXPECTED, WriterState.WAIT); + break; + case AUTHENTICATE_REQ_OK: + if (user == null) { + sendTunnelReq(); + } else { + // send login with user/pass!!! + } + setReaderState(ReaderState.TUNNEL_CONF_EXPECTED, WriterState.WAIT); + break; + case TUNNEL_CONF_RECEIVED: + String accept = "<tunnel action=\"accept\"></tunnel>\r\n"; + accept = "Content-length: " + accept.length() + "\r\n" + accept; + sendPacket(accept.getBytes()); + System.out.println("*** Tunnel UP!"); + setReaderState(ReaderState.TUNNEL_UP, WriterState.TUNNEL_UP); + break; + case TUNNEL_UP: + /* all ok - do nothing but sleep.*/ + Thread.sleep(100); + break; + default: + System.out.println("In mode: " + writerState); + Thread.sleep(1000); + } + } + } + + private void sendTunnelReq() throws IOException { + InetAddress myAddr = InetAddress.getLocalHost(); + byte[] addr = myAddr.getAddress(); + String myAddress = String.format("%d.%d.%d.%d", + addr[0] & 0xff, addr[1] & 0xff, addr[2] & 0xff, addr[3] & 0xff); + String tunnelConf = + "<tunnel action=\"create\" type=\"v6udpv4\"><client><address type=\"ipv4\">" + + myAddress + "</address><keepalive interval=\"30\"></keepalive>" + + "</client></tunnel>\r\n"; + tunnelConf = "Content-length: " + tunnelConf.length() + "\r\n" + + tunnelConf; + sendPacket(tunnelConf.getBytes()); + } + + private void setReaderState(ReaderState rs, WriterState ws) { + readerState = rs; + writerState = ws; + wWait = 0; + } + + private void reader() throws IOException { + while(true) { + System.out.println("Receiving packet..."); + connection.receive(receiveP); + System.out.println("Packet received: " + receiveP.getLength()); + byte[] data = receiveP.getData(); + for (int i = 0, n = receiveP.getLength(); i < n; i++) { + if (i < 8 || writerState == WriterState.TUNNEL_UP) { + System.out.printf("%02x", data[i]); + } else { + System.out.print((char) data[i]); + } + } + String sData = new String(data, 8, receiveP.getLength() - 8); + String[] parts = sData.split("\n"); + if (parts.length > 1) { + System.out.println("Response size: " + parts[0]); + System.out.println("Response code: " + parts[1]); + } + switch (readerState) { + case CAP_EXPECTED: + writerState = WriterState.CAPABILITIES_RECEIVED; + break; + case AUTH_OK_EXPECTED: + writerState = WriterState.AUTHENTICATE_REQ_OK; + break; + case TUNNEL_CONF_EXPECTED: + if (user != null) { + Matcher m = prefixPattern.matcher(sData); + if (m.find()) { + System.out.println("Prefix: " + m.group(2) + " arg:" + m.group(1)); + } + } + writerState = WriterState.TUNNEL_CONF_RECEIVED; + break; + case TUNNEL_UP: + System.out.println("*** Tunneled packet received!!!"); + break; + } + } + } + + + private void sendPacket(byte[] packetData) throws IOException { + byte[] pData = new byte[8 + packetData.length]; + pData[0] = (byte) (0xf0 | (seq >>24) & 0xf); + pData[1] = (byte) ((seq >> 16) & 0xff); + pData[2] = (byte) ((seq >> 8) & 0xff); + pData[3] = (byte) (seq & 0xff); + + long time = System.currentTimeMillis() / 1000; + pData[4] = (byte) ((time >> 24) & 0xff); + pData[5] = (byte) ((time >> 16) & 0xff); + pData[6] = (byte) ((time >> 8) & 0xff); + pData[7] = (byte) ((time >> 0) & 0xff); + seq++; + + System.arraycopy(packetData, 0, pData, 8, packetData.length); + + DatagramPacket packet = new DatagramPacket(pData, pData.length, serverAddr, DEFAULT_PORT); + connection.send(packet); + System.out.println("Packet sent... " + pData.length + " => C:" + + new String(packetData)); + + } + + + public static void main(String[] args) throws UnknownHostException, IOException { +// Pattern pattern = Pattern.compile("(?m).+?<server>(.+?)</server>.+?"); +// String data = "<tunnel action=\"info\" type=\"v6udpv4\" lifetime=\"604800\">" + +// "<server>" + +// "<address type=\"ipv4\">81.171.72.11</address>" + +// "<address type=\"ipv6\">2001:05c0:1400:000b:0000:0000:0000:1634</address>" + +// "</server>" + +// "<client><address type=\"ipv4\">85.228.25.3</address>" + +// "<address type=\"ipv6\">2001:05c0:1400:000b:0000:0000:0000:1635</address>" + +// "<address type=\"dn\">Joakim.broker.freenet6.net</address>" + +// "<router>" + +// "<prefix length=\"56\">2001:05c0:1501:e300:0000:0000:0000:0000</prefix>" + +// "</router>" + +// "<keepalive interval=\"30\">" + +// "<address type=\"ipv6\">2001:05c0:1400:000b:0000:0000:0000:1634</address>" + +// "</keepalive></client></tunnel>"; + +// Matcher m = pattern.matcher(data); +// if (m.find()) { +// System.out.println("Match: " + m.group(1)); +// } else { +// System.out.println("No match"); +// } +// + + TSPClient tspc = new TSPClient(args[0]); + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2009-05-23 14:52:14
|
Revision: 535 http://mspsim.svn.sourceforge.net/mspsim/?rev=535&view=rev Author: nifi Date: 2009-05-23 14:51:57 +0000 (Sat, 23 May 2009) Log Message: ----------- fixed compiler warning for Sun API Modified Paths: -------------- mspsim/se/sics/mspsim/net/ICMP6Packet.java Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-23 07:47:52 UTC (rev 534) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-23 14:51:57 UTC (rev 535) @@ -1,10 +1,7 @@ package se.sics.mspsim.net; - import java.io.PrintStream; import java.util.ArrayList; -import sun.awt.geom.AreaOp.AddOp; - public class ICMP6Packet implements IPPayload { public static final int DISPATCH = 58; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-23 07:48:01
|
Revision: 534 http://mspsim.svn.sourceforge.net/mspsim/?rev=534&view=rev Author: joxe Date: 2009-05-23 07:47:52 +0000 (Sat, 23 May 2009) Log Message: ----------- fixed router flag in NS/NA so that defrouter is not dropped Modified Paths: -------------- mspsim/se/sics/mspsim/net/ICMP6Packet.java mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java mspsim/se/sics/mspsim/net/IPStack.java Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-22 18:37:50 UTC (rev 533) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-23 07:47:52 UTC (rev 534) @@ -3,6 +3,8 @@ import java.io.PrintStream; import java.util.ArrayList; +import sun.awt.geom.AreaOp.AddOp; + public class ICMP6Packet implements IPPayload { public static final int DISPATCH = 58; @@ -68,18 +70,27 @@ void updateRA(IPStack stack) { byte[] llAddr = stack.getLinkLayerAddress(); - byte[] srcLinkOptionLong = new byte[16]; - srcLinkOptionLong[0] = SOURCE_LINKADDR; - srcLinkOptionLong[1] = 2; - System.arraycopy(llAddr, 0, srcLinkOptionLong, 2, llAddr.length); options.clear(); byte[] prefixInfo = new byte[defaultPrefixInfo.length]; System.arraycopy(defaultPrefixInfo, 0, prefixInfo, 0, defaultPrefixInfo.length); options.add(prefixInfo); options.add(mtuOption); - options.add(srcLinkOptionLong); + addLinkOption(SOURCE_LINKADDR, llAddr); } + void addLinkOption(int type, byte[] llAddr) { + byte[] opt; + if (llAddr.length > 6) { + opt = new byte[16]; + } else { + opt = new byte[8]; + } + opt[0] = (byte) type; + opt[1] = (byte) (opt.length / 8); + System.arraycopy(llAddr, 0, opt, 2, llAddr.length); + options.add(opt); + } + public byte[] getOption(int type) { for (int i = 0; i < options.size(); i++) { if (options.get(i)[0] == type) { @@ -153,6 +164,7 @@ } targetAddress = new byte[16]; packet.copy(8, targetAddress, 0, 16); + handleOptions(packet, 24); break; case ROUTER_SOLICITATION: break; @@ -219,6 +231,7 @@ for (int i = 0; i < targetAddress.length; i++) { buffer[pos++] = targetAddress[i]; } + pos = addOptions(buffer, pos); break; case ROUTER_ADVERTISEMENT: buffer[pos++] = hopLimit; @@ -230,13 +243,7 @@ IPv6Packet.set32(buffer, pos, retransmissionTimer); pos += 4; /* add options */ - for (int i = 0; i < options.size(); i++) { - byte[] option = options.get(i); - System.out.println("Adding option: " + option[0] + " len: " + option[1] + - "/" + option.length + " at " + pos); - System.arraycopy(option, 0, buffer, pos, option.length); - pos += option.length; - } + pos = addOptions(buffer, pos); break; } @@ -258,6 +265,17 @@ return packetData; } + private int addOptions(byte[] buffer, int pos) { + for (int i = 0; i < options.size(); i++) { + byte[] option = options.get(i); + System.out.println("Adding option: " + option[0] + " len: " + option[1] + + "/" + option.length + " at " + pos); + System.arraycopy(option, 0, buffer, pos, option.length); + pos += option.length; + } + return pos; + } + @Override public byte getDispatch() { return DISPATCH; Modified: mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-22 18:37:50 UTC (rev 533) +++ mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-23 07:47:52 UTC (rev 534) @@ -21,10 +21,14 @@ case ICMP6Packet.NEIGHBOR_SOLICITATION: p = new ICMP6Packet(); p.targetAddress = icmpPacket.targetAddress; - p.type = ICMP6Packet.NEIGHBOR_ADVERTISEMENT; + p.type = ICMP6Packet.NEIGHBOR_ADVERTISEMENT; p.flags = ICMP6Packet.FLAG_SOLICITED | - ICMP6Packet.FLAG_OVERRIDE; - + ICMP6Packet.FLAG_OVERRIDE; + if (ipStack.isRouter()) { + p.flags |= ICMP6Packet.FLAG_ROUTER; + } + /* always send the linkaddr option */ + p.addLinkOption(ICMP6Packet.TARGET_LINKADDR, ipStack.getLinkLayerAddress()); ipp = new IPv6Packet(); ipp.setIPPayload(p); // is this ok? Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-05-22 18:37:50 UTC (rev 533) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-05-23 07:47:52 UTC (rev 534) @@ -74,6 +74,9 @@ private PacketHandler linkLayerHandler; private IPPacketer defaultPacketer = new HC01Packeter(); private ICMP6PacketHandler icmp6Handler; + + /* is router -> router behavior */ + private boolean isRouter = true; /* this needs to be generalized later... and down to lowpan too... */ //private HC01Packeter ipPacketer = new HC01Packeter(); @@ -198,4 +201,8 @@ } } } + + public boolean isRouter() { + return isRouter ; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-22 18:38:12
|
Revision: 533 http://mspsim.svn.sourceforge.net/mspsim/?rev=533&view=rev Author: joxe Date: 2009-05-22 18:37:50 +0000 (Fri, 22 May 2009) Log Message: ----------- fixed route ads to be accepted by uIPv6 Modified Paths: -------------- mspsim/se/sics/mspsim/net/HC01Packeter.java mspsim/se/sics/mspsim/net/ICMP6Packet.java mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java mspsim/se/sics/mspsim/net/IEEE802154Handler.java mspsim/se/sics/mspsim/net/IPStack.java mspsim/se/sics/mspsim/net/IPv6Packet.java mspsim/se/sics/mspsim/net/Packet.java Modified: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-22 10:17:50 UTC (rev 532) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-22 18:37:50 UTC (rev 533) @@ -236,6 +236,9 @@ } /* destination compression */ + System.out.print("isMulticastCompressable?: "); + IPv6Packet.printAddress(System.out, packet.destAddress); + if(packet.isMulticastDestination()) { /* Address is multicast, try to compress */ if(isMulticastCompressable(packet.destAddress)) { @@ -543,7 +546,10 @@ } private boolean isMulticastCompressable(byte[] address) { - return false; + for (int i = 2; i < 15; i++) { + if (address[i] != 0) return false; + } + return (address[15] == 1 || address[15] == 2); } Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-22 10:17:50 UTC (rev 532) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-22 18:37:50 UTC (rev 533) @@ -44,7 +44,7 @@ int flags; - byte hopLimit = (byte) 255; + byte hopLimit = (byte) 128; byte autoConfigFlags; int routerLifetime = 600; /* time in seconds for keeping the router as default */ int reachableTime = 10000; /* time in millis when node still should be counted as reachable */ @@ -71,12 +71,13 @@ byte[] srcLinkOptionLong = new byte[16]; srcLinkOptionLong[0] = SOURCE_LINKADDR; srcLinkOptionLong[1] = 2; - System.arraycopy(llAddr, 0, srcLinkOptionLong, 2, llAddr.length); - options.add(srcLinkOptionLong); + System.arraycopy(llAddr, 0, srcLinkOptionLong, 2, llAddr.length); + options.clear(); byte[] prefixInfo = new byte[defaultPrefixInfo.length]; System.arraycopy(defaultPrefixInfo, 0, prefixInfo, 0, defaultPrefixInfo.length); options.add(prefixInfo); options.add(mtuOption); + options.add(srcLinkOptionLong); } public byte[] getOption(int type) { @@ -104,6 +105,12 @@ out.println(); } if (type == ROUTER_ADVERTISEMENT) { + System.out.println("ICMPv6 Route Advertisement"); + System.out.println(" Hop Limit: " + (hopLimit & 0xff)); + System.out.println(" autoConfig: " + (autoConfigFlags & 0xff)); + System.out.println(" routerLifeTime: " + routerLifetime + " (sec)"); + System.out.println(" reachableTime: " + reachableTime + " (msec)"); + System.out.println(" retransmissionTimer: " + retransmissionTimer + " (msec)"); byte[] prefixInfo = getOption(PREFIX_INFO); int bits = prefixInfo[2]; int bytes = bits / 8; @@ -179,6 +186,8 @@ while (pos < size) { int type = packet.getData(pos); int oSize = (packet.getData(pos + 1) & 0xff) * 8; + System.out.println("Handling option: " + type + " size " + oSize); + if (oSize == 0) return; byte[] option = new byte[oSize]; packet.copy(pos, option, 0, oSize); options.add(option); @@ -214,7 +223,7 @@ case ROUTER_ADVERTISEMENT: buffer[pos++] = hopLimit; buffer[pos++] = autoConfigFlags; - buffer[pos++] = (byte) (routerLifetime >> 8); + buffer[pos++] = (byte) ((routerLifetime >> 8) & 0xff); buffer[pos++] = (byte) (routerLifetime & 0xff); IPv6Packet.set32(buffer, pos, reachableTime); pos += 4; @@ -223,6 +232,8 @@ /* add options */ for (int i = 0; i < options.size(); i++) { byte[] option = options.get(i); + System.out.println("Adding option: " + option[0] + " len: " + option[1] + + "/" + option.length + " at " + pos); System.arraycopy(option, 0, buffer, pos, option.length); pos += option.length; } Modified: mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-22 10:17:50 UTC (rev 532) +++ mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-22 18:37:50 UTC (rev 533) @@ -44,9 +44,12 @@ ipp = new IPv6Packet(); ipp.setIPPayload(p); // is this ok? - ipp.destAddress = packet.sourceAddress; + //ipp.destAddress = packet.sourceAddress; + ipp.destAddress = IPStack.ALL_NODES; //packet.sourceAddress; + ipp.sourceAddress = ipStack.myLocalIPAddress; System.out.print("Created ICMP6 RA for "); IPv6Packet.printAddress(System.out, ipp.destAddress); + ipStack.sendPacket(ipp); break; } Modified: mspsim/se/sics/mspsim/net/IEEE802154Handler.java =================================================================== --- mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-22 10:17:50 UTC (rev 532) +++ mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-22 18:37:50 UTC (rev 533) @@ -41,6 +41,7 @@ package se.sics.mspsim.net; import java.io.PrintStream; +import java.util.Arrays; public class IEEE802154Handler extends AbstractPacketHandler { @@ -61,9 +62,13 @@ public static final int SHORT_ADDRESS = 2; public static final int LONG_ADDRESS = 3; + + private static final byte[] BROADCAST_ADDR = {(byte)0xff, (byte)0xff}; private int defaultAddressMode = LONG_ADDRESS; private byte seqNo = 0; + + private int myPanID = 0xabcd; /* create a 802.15.4 packet of the bytes and "dispatch" to the * next handler @@ -145,6 +150,7 @@ System.out.println("Packet should be sent!!!"); byte[] buffer = new byte[127]; int pos = 0; + int destPanID = 0xabcd; /* construct a default packet... needs fixing later */ /* no security, no compression, etc */ buffer[0] = DATAFRAME; @@ -152,28 +158,33 @@ int destMode = defaultAddressMode; int srcMode = defaultAddressMode; int frameVersion = 0; + + if (Arrays.equals(packet.getLinkDestination(), BROADCAST_ADDR)) { + destMode = SHORT_ADDRESS; + destPanID = 0xffff; + } buffer[1] = (byte)((destMode << 2) | - (frameVersion << 4) | (srcMode << 6)); + (frameVersion << 4) | (srcMode << 6)); buffer[2] = seqNo++; pos = 3; - /* hardcoded PAN */ - buffer[pos++] = (byte) 0xcd; - buffer[pos++] = (byte) 0xab; + /* Destination PAN */ + buffer[pos++] = (byte) (destPanID & 0xff); + buffer[pos++] = (byte) (destPanID >> 8); byte[] dest = packet.getLinkDestination(); for (int i = 0; i < dest.length; i++) { buffer[pos++] = dest[dest.length - i - 1]; } - /* hardcoded PAN */ - buffer[pos++] = (byte) 0xcd; - buffer[pos++] = (byte) 0xab; + /* Source PAN */ + buffer[pos++] = (byte) (myPanID & 0xff); + buffer[pos++] = (byte) (myPanID >> 8); byte[] src = packet.getLinkSource(); - for (int i = 0; i < dest.length; i++) { - buffer[pos++] = src[dest.length - i - 1]; + for (int i = 0; i < src.length; i++) { + buffer[pos++] = src[src.length - i - 1]; } byte[] pHeader = new byte[pos]; Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-05-22 10:17:50 UTC (rev 532) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-05-22 18:37:50 UTC (rev 533) @@ -43,13 +43,34 @@ package se.sics.mspsim.net; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; + +import se.sics.mspsim.core.MSP430; +import se.sics.mspsim.util.Utils; + public class IPStack { + public static final byte[] ALL_NODES = {(byte) 0xff, 0x02, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1}; + public static final byte[] ALL_ROUTERS = {(byte) 0xff, 0x02, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1}; + + byte[] prefix = null; + int prefixSize = 0; + byte[] myIPAddress = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00}; + byte[] myLocalIPAddress = new byte[] { (byte)0xfe, (byte)0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00}; /* currently assumes only one link-layer and one address */ - byte[] myLinkAddress = new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; + byte[] myLinkAddress = new byte[] {0x00, 0x12, 0x75, 0x04, 0x05, 0x06, 0x07, 0x08}; + byte[] linkBroadcast = new byte[] {(byte) 0xff, (byte) 0xff}; + private PacketHandler linkLayerHandler; private IPPacketer defaultPacketer = new HC01Packeter(); private ICMP6PacketHandler icmp6Handler; @@ -59,21 +80,57 @@ public IPStack() { icmp6Handler = new ICMP6PacketHandler(this); + prefix = new byte[] {(byte) 0xaa, (byte)0xaa, 0, 0, 0, 0, 0, 0}; + prefixSize = 64; /* link size */ + configureIPAddress(); } - + public void setLinkLayerHandler(PacketHandler handler) { linkLayerHandler = handler; } + + public void setPrefix(byte[] prefix, int size) { + this.prefix = prefix; + prefixSize = size; + configureIPAddress(); + } + public void configureIPAddress() { + if (prefix != null) { + System.arraycopy(prefix, 0, myIPAddress, 0, prefixSize / 8); + } + for (int i = 0; i < 8; i++) { + myLocalIPAddress[8 + i] = myIPAddress[8 + i] = myLinkAddress[i]; + } + /* autoconfig ?? */ + myLocalIPAddress[8] = myIPAddress[8] = (byte) (myIPAddress[8] ^ 0x02); + } + private boolean findRoute(IPv6Packet packet) { // this does not do anything yet... we assume that the low 8 byte is MAC if (packet.getLinkDestination() == null) { /* find a MAC address for this packets destination... */ - packet.setAttribute("link.destination", new byte[8]); + byte[] destAddr = packet.getDestinationAddress(); + /* is it a bc to all nodes? */ + if (Arrays.equals(ALL_NODES, destAddr)) { + packet.setAttribute("link.destination", linkBroadcast); + } else { + byte[] destMAC = new byte[8]; + /* fill the array with a autoconf address ... */ + makeLLAddress(destAddr, destMAC); + packet.setAttribute("link.destination", destMAC); + } } packet.setAttribute("link.source", myLinkAddress); return true; } + + public void makeLLAddress(byte[] ipAddr, byte[] macAddr) { + for (int i = 0; i < macAddr.length; i++) { + macAddr[i] = ipAddr[8 + i]; + } + macAddr[0] = (byte) (macAddr[0] ^ 0x02); + } public void sendPacket(IPv6Packet packet) { /* find route checks if there are link addr, and otherwise sets them */ @@ -120,4 +177,25 @@ public IPPacketer getDefaultPacketer() { return defaultPacketer; } + + public static void main(String[] args) throws IOException { + IEEE802154Handler ieeeHandler = new IEEE802154Handler(); + IPStack ipStack = new IPStack(); + LoWPANHandler lowpanHandler = new LoWPANHandler(ipStack); + ieeeHandler.addUpperLayerHandler(0, lowpanHandler); + lowpanHandler.setLowerLayerHandler(ieeeHandler); + ipStack.setLinkLayerHandler(lowpanHandler); + + String line; + BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); + while((line = reader.readLine()) != null) { + if (line.length() > 10) { + System.out.println("---------- packet read ------"); + byte[] data = Utils.hexconv(line); + Packet packet = new Packet(); + packet.setBytes(data, 0, data.length); + ieeeHandler.packetReceived(packet); + } + } + } } Modified: mspsim/se/sics/mspsim/net/IPv6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-22 10:17:50 UTC (rev 532) +++ mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-22 18:37:50 UTC (rev 533) @@ -44,7 +44,7 @@ import java.io.PrintStream; /** - * @author joakim + * @author Joakim Eriksson, SICS * */ public class IPv6Packet extends Packet implements IPPacketer { @@ -66,6 +66,7 @@ public IPv6Packet() { version = 6; flowLabel = 0; + hopLimit = 255; } public IPv6Packet(Packet packet) { @@ -125,8 +126,8 @@ packet.incPos(40); } - public static void set32(byte[] data, int pos, int value) { - data[pos++] = (byte) ((value >> 32) & 0xff); + public static void set32(byte[] data, int pos, long value) { + data[pos++] = (byte) ((value >> 24) & 0xff); data[pos++] = (byte) ((value >> 16) & 0xff); data[pos++] = (byte) ((value >> 8) & 0xff); data[pos++] = (byte) (value & 0xff); @@ -195,8 +196,7 @@ } public boolean isMulticastDestination() { - // TODO Auto-generated method stub - return false; + return (destAddress[0] == (byte)0xff); } /* how can we check this before we know the MAC address??? */ Modified: mspsim/se/sics/mspsim/net/Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/Packet.java 2009-05-22 10:17:50 UTC (rev 532) +++ mspsim/se/sics/mspsim/net/Packet.java 2009-05-22 18:37:50 UTC (rev 533) @@ -125,8 +125,10 @@ public int get32(int pos) { pos = currentPos + pos; if (packetData.length > pos + 3) - return ((packetData[pos] & 0xff) << 24) | ((packetData[pos++] & 0xff) << 16) | - ((packetData[pos] & 0xff) << 8) | (packetData[pos + 1] & 0xff); + return ((packetData[pos] & 0xff) << 24) | + ((packetData[pos + 1] & 0xff) << 16) | + ((packetData[pos + 2] & 0xff) << 8) | + (packetData[pos + 3] & 0xff); return 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-22 10:18:24
|
Revision: 532 http://mspsim.svn.sourceforge.net/mspsim/?rev=532&view=rev Author: joxe Date: 2009-05-22 10:17:50 +0000 (Fri, 22 May 2009) Log Message: ----------- changed icmp options handling Modified Paths: -------------- mspsim/se/sics/mspsim/net/ICMP6Packet.java mspsim/se/sics/mspsim/net/IPv6Packet.java Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-21 15:53:55 UTC (rev 531) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-22 10:17:50 UTC (rev 532) @@ -1,6 +1,7 @@ package se.sics.mspsim.net; import java.io.PrintStream; +import java.util.ArrayList; public class ICMP6Packet implements IPPayload { @@ -23,6 +24,11 @@ public static final int ON_LINK = 0x80; public static final int AUTOCONFIG = 0x40; + public static final int SOURCE_LINKADDR = 1; + public static final int TARGET_LINKADDR = 2; + public static final int PREFIX_INFO = 3; + public static final int MTU_INFO = 5; + public static final String[] TYPE_NAME = new String[] { "ECHO_REQUEST", "ECHO_REPLY", "GROUP_QUERY", "GROUP_REPORT", "GROUP_REDUCTION", @@ -43,27 +49,45 @@ int routerLifetime = 600; /* time in seconds for keeping the router as default */ int reachableTime = 10000; /* time in millis when node still should be counted as reachable */ int retransmissionTimer = 1000; /* time in millis between solicitations */ + int mtuSize = 1280; - /* source link layer option - type = 1, len = 1 (64 bits) */ - byte[] srcLinkOptionShort = new byte[] {1, 1, 0, 0, 0, 0, 0, 0}; - byte[] srcLinkOptionLong = new byte[] {1, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0}; + private ArrayList<byte[]> options = new ArrayList<byte[]>(); + /* prefix info option - type = 3, len = 4 (64x4 bits), prefix = 64 bits */ - byte[] prefixInfo = new byte[] {3, 4, 64, (byte) (ON_LINK | AUTOCONFIG), - 0, 0, 1, 0, /* valid lifetime - 256 seconds for now*/ - 0, 1, 0, 0, /* prefered lifetime - 65535 seconds lifetime of autoconf addr */ - 0, 0, 0, 0, /* reserved */ - /* the prefix ... */ - (byte)0xaa, (byte)0xaa, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + private final static byte[] defaultPrefixInfo = + new byte[] {3, 4, 64, (byte) (ON_LINK | AUTOCONFIG), + 0, 0, 1, 0, /* valid lifetime - 256 seconds for now*/ + 0, 1, 0, 0, /* prefered lifetime - 65535 seconds lifetime of autoconf addr */ + 0, 0, 0, 0, /* reserved */ + /* the prefix ... */ + (byte)0xaa, (byte)0xaa, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + /* default MTU is 1280 (5x256) which also is the smallest allowed */ byte[] mtuOption = new byte[] {5, 1, 0, 0, 0, 0, 5, 0}; void updateRA(IPStack stack) { byte[] llAddr = stack.getLinkLayerAddress(); - System.arraycopy(llAddr, 0, srcLinkOptionLong, 2, llAddr.length); + byte[] srcLinkOptionLong = new byte[16]; + srcLinkOptionLong[0] = SOURCE_LINKADDR; + srcLinkOptionLong[1] = 2; + System.arraycopy(llAddr, 0, srcLinkOptionLong, 2, llAddr.length); + options.add(srcLinkOptionLong); + byte[] prefixInfo = new byte[defaultPrefixInfo.length]; + System.arraycopy(defaultPrefixInfo, 0, prefixInfo, 0, defaultPrefixInfo.length); + options.add(prefixInfo); + options.add(mtuOption); } + public byte[] getOption(int type) { + for (int i = 0; i < options.size(); i++) { + if (options.get(i)[0] == type) { + return options.get(i); + } + } + return null; + } + public void printPacket(PrintStream out) { String typeS = "" + type; if (type >= 128) { @@ -80,6 +104,7 @@ out.println(); } if (type == ROUTER_ADVERTISEMENT) { + byte[] prefixInfo = getOption(PREFIX_INFO); int bits = prefixInfo[2]; int bytes = bits / 8; out.print("RA Prefix: "); @@ -88,6 +113,13 @@ if ((i & 1) == 1) out.print(":"); } out.println("/" + bits); + byte[] srcLink = getOption(SOURCE_LINKADDR); + if (srcLink != null) { + /* assuming 8 bytes for the mac ??? */ + System.out.print("Source Link: "); + IPv6Packet.printMACAddress(out, srcLink, 2, 8); + System.out.println(); + } } /* ICMP can not have payload ?! */ } @@ -115,6 +147,16 @@ targetAddress = new byte[16]; packet.copy(8, targetAddress, 0, 16); break; + case ROUTER_SOLICITATION: + break; + case ROUTER_ADVERTISEMENT: + hopLimit = packet.getData(4); + autoConfigFlags = packet.getData(5); + routerLifetime = packet.get16(6); + reachableTime = packet.get32(8); + retransmissionTimer = packet.get32(12); + handleOptions(packet, 16); + break; } byte[] data = packet.getPayload(); @@ -130,6 +172,20 @@ } } + /* create generic options array instead... */ + private void handleOptions(IPv6Packet packet, int pos) { + int size = packet.getPayloadLength(); + System.out.println("ICMPv6 Options: total size: " + size + " pos: " + pos); + while (pos < size) { + int type = packet.getData(pos); + int oSize = (packet.getData(pos + 1) & 0xff) * 8; + byte[] option = new byte[oSize]; + packet.copy(pos, option, 0, oSize); + options.add(option); + pos += oSize; + } + } + @Override public byte[] generatePacketData(IPv6Packet packet) { byte[] buffer = new byte[127]; @@ -165,12 +221,11 @@ IPv6Packet.set32(buffer, pos, retransmissionTimer); pos += 4; /* add options */ - System.arraycopy(srcLinkOptionLong, 0, buffer, pos, srcLinkOptionLong.length); - pos += mtuOption.length; - System.arraycopy(mtuOption, 0, buffer, pos, mtuOption.length); - pos += mtuOption.length; - System.arraycopy(prefixInfo, 0, buffer, pos, prefixInfo.length); - pos += prefixInfo.length; + for (int i = 0; i < options.size(); i++) { + byte[] option = options.get(i); + System.arraycopy(option, 0, buffer, pos, option.length); + pos += option.length; + } break; } Modified: mspsim/se/sics/mspsim/net/IPv6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-21 15:53:55 UTC (rev 531) +++ mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-22 10:17:50 UTC (rev 532) @@ -223,4 +223,13 @@ ipPayload = ipp; nextHeader = ipp.getDispatch(); } + + public static void printMACAddress(PrintStream out, byte[] data, + int pos, int size) { + for (int i = 0; i < size; i++) { + out.printf("%02x", data[i + pos]); + if (i < size - 1) + out.print(":"); + } + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-21 15:54:11
|
Revision: 531 http://mspsim.svn.sourceforge.net/mspsim/?rev=531&view=rev Author: joxe Date: 2009-05-21 15:53:55 +0000 (Thu, 21 May 2009) Log Message: ----------- fixed so that NA/RA can be received by uip6 Modified Paths: -------------- mspsim/se/sics/mspsim/cli/MiscCommands.java mspsim/se/sics/mspsim/net/CC2420PacketHandler.java mspsim/se/sics/mspsim/net/IPStack.java Modified: mspsim/se/sics/mspsim/cli/MiscCommands.java =================================================================== --- mspsim/se/sics/mspsim/cli/MiscCommands.java 2009-05-21 09:30:47 UTC (rev 530) +++ mspsim/se/sics/mspsim/cli/MiscCommands.java 2009-05-21 15:53:55 UTC (rev 531) @@ -319,7 +319,8 @@ CommandContext context; public int executeCommand(CommandContext context) { this.context = context; - listener = new CC2420PacketHandler(); + MSP430 cpu = (MSP430) registry.getComponent(MSP430.class); + listener = new CC2420PacketHandler(cpu); listener.setOutput(context.out); IEEE802154Handler ieeeHandler = new IEEE802154Handler(); listener.addUpperLayerHandler(0, ieeeHandler); Modified: mspsim/se/sics/mspsim/net/CC2420PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/CC2420PacketHandler.java 2009-05-21 09:30:47 UTC (rev 530) +++ mspsim/se/sics/mspsim/net/CC2420PacketHandler.java 2009-05-21 15:53:55 UTC (rev 531) @@ -41,8 +41,9 @@ package se.sics.mspsim.net; import java.io.PrintStream; - import se.sics.mspsim.chip.RFListener; +import se.sics.mspsim.core.MSP430Core; +import se.sics.mspsim.core.TimeEvent; import se.sics.mspsim.util.Utils; public class CC2420PacketHandler extends AbstractPacketHandler implements RFListener { @@ -63,6 +64,11 @@ int packetLen; int sfdSearch = 0; + MSP430Core cpu; + public CC2420PacketHandler(MSP430Core cpu) { + this.cpu = cpu; + } + public void receivedByte(byte data) { packetBuffer[pos++] = data; switch (mode) { @@ -117,6 +123,7 @@ public void sendPacket(Packet packet) { + final Packet sendPacket = packet; byte[] size = new byte[1]; byte[] crc = new byte[2]; size[0] = (byte) ((packet.getTotalLength() + 2)& 0xff); @@ -126,14 +133,20 @@ byte[] data = packet.getBytes(); System.out.println("Should send packet to radio!!!! " + packet.getTotalLength()); // Stuff to send to radio!!! - System.out.println("CC2420: Packet to send: "); - byte[] buffer = packet.getBytes(); - for (int i = 0; i < buffer.length; i++) { - System.out.printf("%02x", buffer[i]); - out.printf("%02x", buffer[i]); - } - /* send to output + two additional bytes...! */ - out.println(); + TimeEvent te = new TimeEvent(0) { + public void execute(long t) { + System.out.println("CC2420: Packet to send: "); + byte[] buffer = sendPacket.getBytes(); + for (int i = 0; i < buffer.length; i++) { + System.out.printf("%02x", buffer[i]); + out.printf("%02x", buffer[i]); + } + /* send to output + two additional bytes...! */ + out.println(); + } + }; + /* schedule packet delivery in 10 ms */ + cpu.scheduleTimeEventMillis(te, 10); } Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-05-21 09:30:47 UTC (rev 530) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-05-21 15:53:55 UTC (rev 531) @@ -85,7 +85,7 @@ public void receivePacket(IPv6Packet packet) { System.out.println("IPv6 packet received!!!"); packet.printPacket(System.out); - // do stuff! + switch (packet.nextHeader) { case ICMP6Packet.DISPATCH: icmp6Handler.handlePacket(packet); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-21 09:30:48
|
Revision: 530 http://mspsim.svn.sourceforge.net/mspsim/?rev=530&view=rev Author: joxe Date: 2009-05-21 09:30:47 +0000 (Thu, 21 May 2009) Log Message: ----------- fixed payload len for ICMP packets -> correct checksum Modified Paths: -------------- mspsim/se/sics/mspsim/net/ICMP6Packet.java mspsim/se/sics/mspsim/net/IPv6Packet.java Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-21 09:09:12 UTC (rev 529) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-21 09:30:47 UTC (rev 530) @@ -79,6 +79,16 @@ IPv6Packet.printAddress(out, targetAddress); out.println(); } + if (type == ROUTER_ADVERTISEMENT) { + int bits = prefixInfo[2]; + int bytes = bits / 8; + out.print("RA Prefix: "); + for (int i = 0; i < bytes; i++) { + out.printf("%02x", prefixInfo[16 + i]); + if ((i & 1) == 1) out.print(":"); + } + out.println("/" + bits); + } /* ICMP can not have payload ?! */ } @@ -167,6 +177,11 @@ byte[] packetData = new byte[pos]; System.arraycopy(buffer, 0, packetData, 0, pos); + /* TODO: this should probably be taken care of in another way - + * for example by allowing the IPPayload packets to set the data + * into the payload which sets the payload length... + */ + packet.payloadLen = pos; int sum = packet.upperLayerHeaderChecksum(); sum = IPv6Packet.checkSum(sum, packetData, packetData.length); sum = (~sum) & 0xffff; Modified: mspsim/se/sics/mspsim/net/IPv6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-21 09:09:12 UTC (rev 529) +++ mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-21 09:30:47 UTC (rev 530) @@ -144,6 +144,7 @@ public int upperLayerHeaderChecksum() { /* First sum pseudoheader. */ /* IP protocol and length fields. This addition cannot carry. */ + if (payloadLen == 0) throw new IllegalStateException("No payload length when calculating upper layer checksum."); int sum = payloadLen + nextHeader; /* Sum IP source and destination addresses. */ sum = checkSum(sum, sourceAddress, 16); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-21 09:09:19
|
Revision: 529 http://mspsim.svn.sourceforge.net/mspsim/?rev=529&view=rev Author: joxe Date: 2009-05-21 09:09:12 +0000 (Thu, 21 May 2009) Log Message: ----------- minor bugfix on HC01 contexts Modified Paths: -------------- mspsim/se/sics/mspsim/net/HC01Packeter.java Modified: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-21 08:42:44 UTC (rev 528) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-21 09:09:12 UTC (rev 529) @@ -42,8 +42,6 @@ */ package se.sics.mspsim.net; -import com.sun.corba.se.impl.javax.rmi.CORBA.Util; - import se.sics.mspsim.util.Utils; public class HC01Packeter implements IPPacketer { @@ -112,15 +110,13 @@ // set-up some fake contexts just to get started... contexts[0] = new AddrContext(); contexts[1] = new AddrContext(); - contexts[2] = new AddrContext(); - contexts[3] = new AddrContext(); +// contexts[2] = new AddrContext(); +// contexts[3] = new AddrContext(); - contexts[0].used = 1; contexts[0].number = 0; contexts[0].prefix[0] = (byte) 0xfe; contexts[0].prefix[1] = (byte) 0x80; - contexts[1].used = 1; contexts[1].number = 1; contexts[1].prefix[0] = (byte) 0xaa; contexts[1].prefix[1] = (byte) 0xaa; @@ -217,6 +213,7 @@ int context; if ((context = lookupContext(packet.sourceAddress)) != -1) { + if (DEBUG) System.out.println("HC01: Found context (SRC): " + context); /* elide the prefix */ enc2 |= context << 4; if (packet.isSourceMACBased()) { @@ -232,6 +229,7 @@ pos += 8; } } else { + if (DEBUG) System.out.println("HC01: no context - use full addr (SRC)"); enc2 |= IPHC_SAM_I; System.arraycopy(packet.sourceAddress, 0, data, pos, 16); pos += 16; @@ -261,6 +259,7 @@ } else { /* Address is unicast, try to compress */ if((context = lookupContext(packet.destAddress)) != -1) { + if (DEBUG) System.out.println("HC01: Found context (DST): " + context); /* elide the prefix */ enc2 |= context; if(packet.isDestinationMACBased()) { @@ -316,10 +315,10 @@ public void parsePacketData(IPv6Packet packet) { /* first two is ... */ int pos = 2; - int enc0 = packet.getData(0); - int enc1 = packet.getData(1); - if ((enc0 & 0x40) == 0) { - if ((enc0 & 0x80) == 0) { + int enc1 = packet.getData(0); + int enc2 = packet.getData(1); + if ((enc1 & 0x40) == 0) { + if ((enc1 & 0x80) == 0) { packet.version = (packet.getData(pos) & 0xf0) >> 4; packet.trafficClass = ((packet.getData(pos) & 0x0f)<<4) + ((packet.getData(pos + 1) & 0xff) >> 4); packet.flowLabel = (packet.getData(pos + 1) & 0x0f) << 16 + (packet.getData(pos + 2) & 0xff) << 8 + @@ -335,7 +334,7 @@ } else { packet.version = 6; packet.flowLabel = 0; - if ((enc0 & 0x80) == 0) { + if ((enc1 & 0x80) == 0) { packet.trafficClass = (packet.getData(pos) & 0xff); pos++; } else { @@ -344,12 +343,12 @@ } /* next header not compressed -> get it */ - if ((enc0 & 0x20) == 0) { + if ((enc1 & 0x20) == 0) { packet.nextHeader = packet.getData(pos++); } /* encoding of TTL */ - switch (enc0 & 0x18) { + switch (enc1 & 0x18) { case IPHC_TTL_1: packet.hopLimit = 1; break; @@ -365,9 +364,13 @@ } /* 0, 1, 2, 3 as source address ??? */ - int srcAddress = (packet.getData(1) & 0x30) >> 4; + int srcAddress = (enc2 & 0x30) >> 4; AddrContext context = lookupContext(srcAddress); - switch (enc1 & 0xc0) { + if (DEBUG) { + System.out.println("HC01: uncompress (SRC) enc2 & c0 = " + (enc2 & 0xc0) + + " ctx =" + srcAddress); + } + switch (enc2 & 0xc0) { case IPHC_SAM_0: if(context == null) { System.out.println("sicslowpan uncompress_hdr: error context not found\n"); @@ -416,6 +419,7 @@ pos += 8; break; case IPHC_SAM_I: + if (DEBUG) System.out.println("HC01: full address used (SRC)"); /* copy whole address from packet */ packet.copy(pos, packet.sourceAddress, 0, 16); pos += 16; @@ -423,9 +427,13 @@ } /* Destination address */ - context = lookupContext(packet.getData(2) & 0x03); - - switch(enc1 & 0x0C) { + context = lookupContext(enc2 & 0x03); + if (DEBUG) { + System.out.println("HC01: uncompress (DST) enc2 & 0x0c = " + (enc2 & 0x0c) + + " ctx =" + (enc2 & 0x03)); + } + + switch(enc2 & 0x0C) { case IPHC_DAM_0: if(context == null) { System.out.println("sicslowpan uncompress_hdr: error context not found\n"); @@ -479,7 +487,7 @@ break; } - if ((enc0 & 0x20) != 0) { + if ((enc1 & 0x20) != 0) { /* The next header is compressed, NHC is following */ if ((packet.getData(pos) & 0xfc) == NHC_UDP_ID) { System.out.println("HC01: Next header UDP!"); @@ -521,8 +529,8 @@ } else { } - System.out.println("Encoding 0: " + Utils.hex8(enc0) + - " Encoding 1: " + Utils.hex8(enc1)); + System.out.println("Encoding 0: " + Utils.hex8(enc1) + + " Encoding 1: " + Utils.hex8(enc2)); System.out.println("TTL: " + packet.hopLimit); System.out.print("Src Addr: "); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-21 08:43:12
|
Revision: 528 http://mspsim.svn.sourceforge.net/mspsim/?rev=528&view=rev Author: joxe Date: 2009-05-21 08:42:44 +0000 (Thu, 21 May 2009) Log Message: ----------- fixed HC01 address copy bug Modified Paths: -------------- mspsim/se/sics/mspsim/net/HC01Packeter.java mspsim/se/sics/mspsim/net/ICMP6Packet.java mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java Modified: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-20 21:58:43 UTC (rev 527) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-21 08:42:44 UTC (rev 528) @@ -275,14 +275,15 @@ } else { /* do not compress IID */ enc2 |= IPHC_DAM_64; - System.arraycopy(data, pos, packet.destAddress, 8, 8); + System.arraycopy(packet.destAddress, 8, data, pos, 8); pos += 8; } } } else { /* send the full address */ + if (DEBUG) System.out.println("HC01: full destination address"); enc2 |= IPHC_DAM_I; - System.arraycopy(data, pos, packet.destAddress, 0, 16); + System.arraycopy(packet.destAddress, 0, data, pos, 16); pos += 16; } } @@ -296,7 +297,12 @@ if (DEBUG) System.out.println("HC01 Header compression: size " + pos + " enc1: " + Utils.hex8(enc1) + " enc2: " + Utils.hex8(enc2)); - + if (DEBUG) { + System.out.print("HC01: From "); + IPv6Packet.printAddress(System.out, packet.sourceAddress); + System.out.print("HC01: To "); + IPv6Packet.printAddress(System.out, packet.destAddress); + } IPPayload payload = packet.getIPPayload(); byte[] pload = payload.generatePacketData(packet); if (DEBUG) System.out.println("HC01 Payload size: " + pload.length); Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-20 21:58:43 UTC (rev 527) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-21 08:42:44 UTC (rev 528) @@ -32,8 +32,7 @@ int type; int code; int checksum; - byte[] targetAddress = new byte[16]; - + byte[] targetAddress; int id; int seqNo; @@ -60,6 +59,11 @@ /* default MTU is 1280 (5x256) which also is the smallest allowed */ byte[] mtuOption = new byte[] {5, 1, 0, 0, 0, 0, 5, 0}; + void updateRA(IPStack stack) { + byte[] llAddr = stack.getLinkLayerAddress(); + System.arraycopy(llAddr, 0, srcLinkOptionLong, 2, llAddr.length); + } + public void printPacket(PrintStream out) { String typeS = "" + type; if (type >= 128) { @@ -77,7 +81,7 @@ } /* ICMP can not have payload ?! */ } - + public void parsePacketData(IPv6Packet packet) { if (packet.nextHeader == 58) { type = packet.getData(0) & 0xff; @@ -98,6 +102,7 @@ if (type == NEIGHBOR_ADVERTISEMENT) { flags = packet.getData(4) & 0xff; } + targetAddress = new byte[16]; packet.copy(8, targetAddress, 0, 16); break; } Modified: mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-20 21:58:43 UTC (rev 527) +++ mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-21 08:42:44 UTC (rev 528) @@ -38,10 +38,15 @@ p.flags = ICMP6Packet.FLAG_SOLICITED | ICMP6Packet.FLAG_OVERRIDE; + /* ensure that the RA is updated... */ + p.updateRA(ipStack); + ipp = new IPv6Packet(); ipp.setIPPayload(p); // is this ok? ipp.destAddress = packet.sourceAddress; + System.out.print("Created ICMP6 RA for "); + IPv6Packet.printAddress(System.out, ipp.destAddress); ipStack.sendPacket(ipp); break; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-20 21:59:14
|
Revision: 527 http://mspsim.svn.sourceforge.net/mspsim/?rev=527&view=rev Author: joxe Date: 2009-05-20 21:58:43 +0000 (Wed, 20 May 2009) Log Message: ----------- minor fixes Modified Paths: -------------- mspsim/se/sics/mspsim/net/HC01Packeter.java mspsim/se/sics/mspsim/net/ICMP6Packet.java mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java mspsim/se/sics/mspsim/net/IEEE802154Handler.java Modified: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-17 21:41:07 UTC (rev 526) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-20 21:58:43 UTC (rev 527) @@ -42,9 +42,13 @@ */ package se.sics.mspsim.net; +import com.sun.corba.se.impl.javax.rmi.CORBA.Util; + import se.sics.mspsim.util.Utils; public class HC01Packeter implements IPPacketer { + + private boolean DEBUG = true; /* * Values of fields within the IPHC encoding first byte * (C stands for compressed and I for inline) @@ -173,7 +177,7 @@ public byte[] generatePacketData(IPv6Packet packet) { int enc1 = 0, enc2 = 0; byte[] data = new byte[40]; - int pos = 3; + int pos = 2; if (packet.flowLabel == 0) { /* compress version and flow label! */ @@ -286,15 +290,16 @@ // uncomp_hdr_len = UIP_IPH_LEN; // TODO: add udp header compression!!! - data[0] = HC01_DISPATCH; - data[1] = (byte) (enc1 & 0xff); - data[2] = (byte) (enc2 & 0xff); - - System.out.println("HC01 Header compression: size " + pos); + // data[0] = HC01_DISPATCH; - layer below does this!!! + data[0] = (byte) (enc1 & 0xff); + data[1] = (byte) (enc2 & 0xff); + if (DEBUG) System.out.println("HC01 Header compression: size " + pos + + " enc1: " + Utils.hex8(enc1) + " enc2: " + Utils.hex8(enc2)); + IPPayload payload = packet.getIPPayload(); byte[] pload = payload.generatePacketData(packet); - System.out.println("HC01 Payload size: " + pload.length); + if (DEBUG) System.out.println("HC01 Payload size: " + pload.length); byte[] dataPacket = new byte[pos + pload.length]; System.arraycopy(data, 0, dataPacket, 0, pos); @@ -305,8 +310,10 @@ public void parsePacketData(IPv6Packet packet) { /* first two is ... */ int pos = 2; - if ((packet.getData(0) & 0x40) == 0) { - if ((packet.getData(0) & 0x80) == 0) { + int enc0 = packet.getData(0); + int enc1 = packet.getData(1); + if ((enc0 & 0x40) == 0) { + if ((enc0 & 0x80) == 0) { packet.version = (packet.getData(pos) & 0xf0) >> 4; packet.trafficClass = ((packet.getData(pos) & 0x0f)<<4) + ((packet.getData(pos + 1) & 0xff) >> 4); packet.flowLabel = (packet.getData(pos + 1) & 0x0f) << 16 + (packet.getData(pos + 2) & 0xff) << 8 + @@ -322,7 +329,7 @@ } else { packet.version = 6; packet.flowLabel = 0; - if ((packet.getData(0) & 0x80) == 0) { + if ((enc0 & 0x80) == 0) { packet.trafficClass = (packet.getData(pos) & 0xff); pos++; } else { @@ -331,12 +338,12 @@ } /* next header not compressed -> get it */ - if ((packet.getData(0) & 0x20) == 0) { + if ((enc0 & 0x20) == 0) { packet.nextHeader = packet.getData(pos++); } /* encoding of TTL */ - switch (packet.getData(0) & 0x18) { + switch (enc0 & 0x18) { case IPHC_TTL_1: packet.hopLimit = 1; break; @@ -354,7 +361,7 @@ /* 0, 1, 2, 3 as source address ??? */ int srcAddress = (packet.getData(1) & 0x30) >> 4; AddrContext context = lookupContext(srcAddress); - switch (packet.getData(1) & 0xc0) { + switch (enc1 & 0xc0) { case IPHC_SAM_0: if(context == null) { System.out.println("sicslowpan uncompress_hdr: error context not found\n"); @@ -412,7 +419,7 @@ /* Destination address */ context = lookupContext(packet.getData(2) & 0x03); - switch(packet.getData(1) & 0x0C) { + switch(enc1 & 0x0C) { case IPHC_DAM_0: if(context == null) { System.out.println("sicslowpan uncompress_hdr: error context not found\n"); @@ -466,7 +473,7 @@ break; } - if ((packet.getData(0) & 0x20) != 0) { + if ((enc0 & 0x20) != 0) { /* The next header is compressed, NHC is following */ if ((packet.getData(pos) & 0xfc) == NHC_UDP_ID) { System.out.println("HC01: Next header UDP!"); @@ -508,8 +515,8 @@ } else { } - System.out.println("Encoding 0: " + Utils.hex8(packet.getData(0)) + - " Encoding 1: " + Utils.hex8(packet.getData(1))); + System.out.println("Encoding 0: " + Utils.hex8(enc0) + + " Encoding 1: " + Utils.hex8(enc1)); System.out.println("TTL: " + packet.hopLimit); System.out.print("Src Addr: "); Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-17 21:41:07 UTC (rev 526) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-20 21:58:43 UTC (rev 527) @@ -5,7 +5,7 @@ public class ICMP6Packet implements IPPayload { public static final int DISPATCH = 58; - + public static final int ECHO_REQUEST = 128; public static final int ECHO_REPLY = 129; public static final int GROUP_QUERY = 130; @@ -22,11 +22,11 @@ public static final int ON_LINK = 0x80; public static final int AUTOCONFIG = 0x40; - + public static final String[] TYPE_NAME = new String[] { "ECHO_REQUEST", "ECHO_REPLY", "GROUP_QUERY", "GROUP_REPORT", "GROUP_REDUCTION", - "ROUTER_SOLICITATION", "ROUTER_ADVERTISEMENT", + "ROUTER_SOLICITATION", "ROUTER_ADVERTISEMENT", "NEIGHBOR_SOLICITATION", "NEIGHBOR_ADVERTISEMENT"}; int type; @@ -39,16 +39,16 @@ int flags; - byte hopLimit; + byte hopLimit = (byte) 255; byte autoConfigFlags; - int routerLifetime = 600; /* time in seconds for keeping the router as default */ + int routerLifetime = 600; /* time in seconds for keeping the router as default */ int reachableTime = 10000; /* time in millis when node still should be counted as reachable */ int retransmissionTimer = 1000; /* time in millis between solicitations */ /* source link layer option - type = 1, len = 1 (64 bits) */ byte[] srcLinkOptionShort = new byte[] {1, 1, 0, 0, 0, 0, 0, 0}; byte[] srcLinkOptionLong = new byte[] {1, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0}; + 0, 0, 0, 0, 0, 0, 0, 0}; /* prefix info option - type = 3, len = 4 (64x4 bits), prefix = 64 bits */ byte[] prefixInfo = new byte[] {3, 4, 64, (byte) (ON_LINK | AUTOCONFIG), 0, 0, 1, 0, /* valid lifetime - 256 seconds for now*/ @@ -59,7 +59,7 @@ }; /* default MTU is 1280 (5x256) which also is the smallest allowed */ byte[] mtuOption = new byte[] {5, 1, 0, 0, 0, 0, 5, 0}; - + public void printPacket(PrintStream out) { String typeS = "" + type; if (type >= 128) { @@ -75,9 +75,9 @@ IPv6Packet.printAddress(out, targetAddress); out.println(); } - /* ICMP can not have payload ?! */ + /* ICMP can not have payload ?! */ } - + public void parsePacketData(IPv6Packet packet) { if (packet.nextHeader == 58) { type = packet.getData(0) & 0xff; @@ -158,7 +158,7 @@ pos += prefixInfo.length; break; } - + byte[] packetData = new byte[pos]; System.arraycopy(buffer, 0, packetData, 0, pos); @@ -168,7 +168,7 @@ packetData[2] = (byte) (sum >> 8); packetData[3] = (byte) (sum & 0xff); - + return packetData; } Modified: mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-17 21:41:07 UTC (rev 526) +++ mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-20 21:58:43 UTC (rev 527) @@ -3,11 +3,11 @@ public class ICMP6PacketHandler { IPStack ipStack; - + public ICMP6PacketHandler(IPStack stack) { ipStack = stack; } - + public void handlePacket(IPv6Packet packet) { ICMP6Packet icmpPacket = new ICMP6Packet(); icmpPacket.parsePacketData(packet); @@ -37,7 +37,7 @@ p.type = ICMP6Packet.ROUTER_ADVERTISEMENT; p.flags = ICMP6Packet.FLAG_SOLICITED | ICMP6Packet.FLAG_OVERRIDE; - + ipp = new IPv6Packet(); ipp.setIPPayload(p); // is this ok? Modified: mspsim/se/sics/mspsim/net/IEEE802154Handler.java =================================================================== --- mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-17 21:41:07 UTC (rev 526) +++ mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-20 21:58:43 UTC (rev 527) @@ -134,7 +134,7 @@ packet.setAttribute(PAYLOAD_LEN, packet.getPayloadLength()); packet.setAttribute(VERSION, frameVersion); packet.setAttribute(SEQ_NO, seqNumber); - + System.out.println("802.15.4 Consumed " + pos + " bytes"); dispatch(-1, packet); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-17 21:41:29
|
Revision: 526 http://mspsim.svn.sourceforge.net/mspsim/?rev=526&view=rev Author: joxe Date: 2009-05-17 21:41:07 +0000 (Sun, 17 May 2009) Log Message: ----------- added payload class Modified Paths: -------------- mspsim/se/sics/mspsim/net/CC2420PacketHandler.java mspsim/se/sics/mspsim/net/HC01Packeter.java mspsim/se/sics/mspsim/net/ICMP6Packet.java mspsim/se/sics/mspsim/net/IEEE802154Handler.java mspsim/se/sics/mspsim/net/IPv6Packet.java Added Paths: ----------- mspsim/se/sics/mspsim/net/IPPayload.java Modified: mspsim/se/sics/mspsim/net/CC2420PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/CC2420PacketHandler.java 2009-05-17 21:11:36 UTC (rev 525) +++ mspsim/se/sics/mspsim/net/CC2420PacketHandler.java 2009-05-17 21:41:07 UTC (rev 526) @@ -118,9 +118,11 @@ public void sendPacket(Packet packet) { byte[] size = new byte[1]; - size[0] = (byte) (packet.getTotalLength() & 0xff); + byte[] crc = new byte[2]; + size[0] = (byte) ((packet.getTotalLength() + 2)& 0xff); packet.prependBytes(size); packet.prependBytes(PREAMBLE); + packet.appendBytes(crc); byte[] data = packet.getBytes(); System.out.println("Should send packet to radio!!!! " + packet.getTotalLength()); // Stuff to send to radio!!! @@ -130,7 +132,7 @@ System.out.printf("%02x", buffer[i]); out.printf("%02x", buffer[i]); } - /* send to output! */ + /* send to output + two additional bytes...! */ out.println(); } Modified: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-17 21:11:36 UTC (rev 525) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-17 21:41:07 UTC (rev 526) @@ -514,7 +514,7 @@ System.out.println("TTL: " + packet.hopLimit); System.out.print("Src Addr: "); IPv6Packet.printAddress(System.out, packet.sourceAddress); - System.out.print(" Dest Addr: "); + System.out.print("Dst Addr: "); IPv6Packet.printAddress(System.out, packet.destAddress); System.out.println(); // packet.setPayload(data, 40, ???); Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-17 21:11:36 UTC (rev 525) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-17 21:41:07 UTC (rev 526) @@ -102,9 +102,9 @@ break; } - int sum = packet.upperLayerHeaderChecksum(); byte[] data = packet.getPayload(); System.out.println("Payloadsize: " + data.length); + int sum = packet.upperLayerHeaderChecksum(); sum = IPv6Packet.checkSum(sum, data, data.length); sum = (~sum) & 0xffff; if (sum == checksum) { @@ -161,6 +161,14 @@ byte[] packetData = new byte[pos]; System.arraycopy(buffer, 0, packetData, 0, pos); + + int sum = packet.upperLayerHeaderChecksum(); + sum = IPv6Packet.checkSum(sum, packetData, packetData.length); + sum = (~sum) & 0xffff; + + packetData[2] = (byte) (sum >> 8); + packetData[3] = (byte) (sum & 0xff); + return packetData; } Modified: mspsim/se/sics/mspsim/net/IEEE802154Handler.java =================================================================== --- mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-17 21:11:36 UTC (rev 525) +++ mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-17 21:41:07 UTC (rev 526) @@ -133,6 +133,7 @@ packet.incPos(pos); packet.setAttribute(PAYLOAD_LEN, packet.getPayloadLength()); packet.setAttribute(VERSION, frameVersion); + packet.setAttribute(SEQ_NO, seqNumber); dispatch(-1, packet); } @@ -184,7 +185,7 @@ // for (int i = 0; i < buffer.length; i++) { // System.out.printf("%02x", buffer[i]); // } - System.out.println(); +// System.out.println(); lowerLayer.sendPacket(packet); } Added: mspsim/se/sics/mspsim/net/IPPayload.java =================================================================== --- mspsim/se/sics/mspsim/net/IPPayload.java (rev 0) +++ mspsim/se/sics/mspsim/net/IPPayload.java 2009-05-17 21:41:07 UTC (rev 526) @@ -0,0 +1,16 @@ +package se.sics.mspsim.net; + +public interface IPPayload { + + public byte getDispatch(); + + /* Call this when payload needs to be externalized + */ + public byte[] generatePacketData(IPv6Packet packet); + + /* + * Call this to parse the IP packet + */ + public void parsePacketData(IPv6Packet packet); +} + Modified: mspsim/se/sics/mspsim/net/IPv6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-17 21:11:36 UTC (rev 525) +++ mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-17 21:41:07 UTC (rev 526) @@ -222,4 +222,4 @@ ipPayload = ipp; nextHeader = ipp.getDispatch(); } -} +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-17 21:12:00
|
Revision: 525 http://mspsim.svn.sourceforge.net/mspsim/?rev=525&view=rev Author: joxe Date: 2009-05-17 21:11:36 +0000 (Sun, 17 May 2009) Log Message: ----------- fixed so that it is possible to send back data to CC2420 from IPStack Modified Paths: -------------- mspsim/se/sics/mspsim/cli/MiscCommands.java mspsim/se/sics/mspsim/net/CC2420PacketHandler.java mspsim/se/sics/mspsim/net/HC01Packeter.java mspsim/se/sics/mspsim/net/ICMP6Packet.java mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java mspsim/se/sics/mspsim/net/IEEE802154Handler.java mspsim/se/sics/mspsim/net/IPv6Packet.java Modified: mspsim/se/sics/mspsim/cli/MiscCommands.java =================================================================== --- mspsim/se/sics/mspsim/cli/MiscCommands.java 2009-05-17 14:02:52 UTC (rev 524) +++ mspsim/se/sics/mspsim/cli/MiscCommands.java 2009-05-17 21:11:36 UTC (rev 525) @@ -320,6 +320,7 @@ public int executeCommand(CommandContext context) { this.context = context; listener = new CC2420PacketHandler(); + listener.setOutput(context.out); IEEE802154Handler ieeeHandler = new IEEE802154Handler(); listener.addUpperLayerHandler(0, ieeeHandler); ieeeHandler.setLowerLayerHandler(listener); Modified: mspsim/se/sics/mspsim/net/CC2420PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/CC2420PacketHandler.java 2009-05-17 14:02:52 UTC (rev 524) +++ mspsim/se/sics/mspsim/net/CC2420PacketHandler.java 2009-05-17 21:11:36 UTC (rev 525) @@ -43,6 +43,7 @@ import java.io.PrintStream; import se.sics.mspsim.chip.RFListener; +import se.sics.mspsim.util.Utils; public class CC2420PacketHandler extends AbstractPacketHandler implements RFListener { @@ -51,8 +52,10 @@ private static final int SFD_SEARCH = 1; private static final int LEN = 2; private static final int PACKET = 3; - + private static final byte[] PREAMBLE = {0, 0, 0, 0, 0x7a}; + + private PrintStream out; byte[] packetBuffer = new byte[256]; int mode = SFD_SEARCH; @@ -114,11 +117,25 @@ public void sendPacket(Packet packet) { - packet.prependBytes(new byte[packet.getTotalLength()]); + byte[] size = new byte[1]; + size[0] = (byte) (packet.getTotalLength() & 0xff); + packet.prependBytes(size); packet.prependBytes(PREAMBLE); byte[] data = packet.getBytes(); System.out.println("Should send packet to radio!!!! " + packet.getTotalLength()); // Stuff to send to radio!!! + System.out.println("CC2420: Packet to send: "); + byte[] buffer = packet.getBytes(); + for (int i = 0; i < buffer.length; i++) { + System.out.printf("%02x", buffer[i]); + out.printf("%02x", buffer[i]); + } + /* send to output! */ + out.println(); } + + public void setOutput(PrintStream out) { + this.out = out; + } } Modified: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-17 14:02:52 UTC (rev 524) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-17 21:11:36 UTC (rev 525) @@ -291,9 +291,14 @@ data[2] = (byte) (enc2 & 0xff); System.out.println("HC01 Header compression: size " + pos); + + IPPayload payload = packet.getIPPayload(); + byte[] pload = payload.generatePacketData(packet); + System.out.println("HC01 Payload size: " + pload.length); - byte[] dataPacket = new byte[pos]; + byte[] dataPacket = new byte[pos + pload.length]; System.arraycopy(data, 0, dataPacket, 0, pos); + System.arraycopy(pload, 0, dataPacket, pos, pload.length); return dataPacket; } Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-17 14:02:52 UTC (rev 524) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-17 21:11:36 UTC (rev 525) @@ -2,7 +2,7 @@ import java.io.PrintStream; -public class ICMP6Packet { //extends Packet { +public class ICMP6Packet implements IPPayload { public static final int DISPATCH = 58; @@ -20,6 +20,9 @@ public static final int FLAG_SOLICITED = 0x40; public static final int FLAG_OVERRIDE = 0x20; + public static final int ON_LINK = 0x80; + public static final int AUTOCONFIG = 0x40; + public static final String[] TYPE_NAME = new String[] { "ECHO_REQUEST", "ECHO_REPLY", "GROUP_QUERY", "GROUP_REPORT", "GROUP_REDUCTION", @@ -29,13 +32,34 @@ int type; int code; int checksum; - byte[] targetAddress; + byte[] targetAddress = new byte[16]; int id; int seqNo; int flags; + byte hopLimit; + byte autoConfigFlags; + int routerLifetime = 600; /* time in seconds for keeping the router as default */ + int reachableTime = 10000; /* time in millis when node still should be counted as reachable */ + int retransmissionTimer = 1000; /* time in millis between solicitations */ + + /* source link layer option - type = 1, len = 1 (64 bits) */ + byte[] srcLinkOptionShort = new byte[] {1, 1, 0, 0, 0, 0, 0, 0}; + byte[] srcLinkOptionLong = new byte[] {1, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; + /* prefix info option - type = 3, len = 4 (64x4 bits), prefix = 64 bits */ + byte[] prefixInfo = new byte[] {3, 4, 64, (byte) (ON_LINK | AUTOCONFIG), + 0, 0, 1, 0, /* valid lifetime - 256 seconds for now*/ + 0, 1, 0, 0, /* prefered lifetime - 65535 seconds lifetime of autoconf addr */ + 0, 0, 0, 0, /* reserved */ + /* the prefix ... */ + (byte)0xaa, (byte)0xaa, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }; + /* default MTU is 1280 (5x256) which also is the smallest allowed */ + byte[] mtuOption = new byte[] {5, 1, 0, 0, 0, 0, 5, 0}; + public void printPacket(PrintStream out) { String typeS = "" + type; if (type >= 128) { @@ -53,7 +77,7 @@ } /* ICMP can not have payload ?! */ } - + public void parsePacketData(IPv6Packet packet) { if (packet.nextHeader == 58) { type = packet.getData(0) & 0xff; @@ -74,7 +98,6 @@ if (type == NEIGHBOR_ADVERTISEMENT) { flags = packet.getData(4) & 0xff; } - targetAddress = new byte[16]; packet.copy(8, targetAddress, 0, 16); break; } @@ -91,4 +114,58 @@ } } } + + @Override + public byte[] generatePacketData(IPv6Packet packet) { + byte[] buffer = new byte[127]; + buffer[0] = (byte) type; + buffer[1] = (byte) code; + /* crc goes at 2/3 */ + int pos = 4; + switch (type) { + case ECHO_REQUEST: + case ECHO_REPLY: + buffer[pos++] = (byte) (id >> 8); + buffer[pos++] = (byte) (id & 0xff); + buffer[pos++] = (byte) (seqNo >> 8); + buffer[pos++] = (byte) (seqNo & 0xff); + break; + case NEIGHBOR_SOLICITATION: + case NEIGHBOR_ADVERTISEMENT: + if (type == NEIGHBOR_ADVERTISEMENT) { + buffer[pos++] = (byte) flags; + } + pos = 8; + for (int i = 0; i < targetAddress.length; i++) { + buffer[pos++] = targetAddress[i]; + } + break; + case ROUTER_ADVERTISEMENT: + buffer[pos++] = hopLimit; + buffer[pos++] = autoConfigFlags; + buffer[pos++] = (byte) (routerLifetime >> 8); + buffer[pos++] = (byte) (routerLifetime & 0xff); + IPv6Packet.set32(buffer, pos, reachableTime); + pos += 4; + IPv6Packet.set32(buffer, pos, retransmissionTimer); + pos += 4; + /* add options */ + System.arraycopy(srcLinkOptionLong, 0, buffer, pos, srcLinkOptionLong.length); + pos += mtuOption.length; + System.arraycopy(mtuOption, 0, buffer, pos, mtuOption.length); + pos += mtuOption.length; + System.arraycopy(prefixInfo, 0, buffer, pos, prefixInfo.length); + pos += prefixInfo.length; + break; + } + + byte[] packetData = new byte[pos]; + System.arraycopy(buffer, 0, packetData, 0, pos); + return packetData; + } + + @Override + public byte getDispatch() { + return DISPATCH; + } } Modified: mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-17 14:02:52 UTC (rev 524) +++ mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-17 21:11:36 UTC (rev 525) @@ -12,22 +12,38 @@ ICMP6Packet icmpPacket = new ICMP6Packet(); icmpPacket.parsePacketData(packet); + icmpPacket.printPacket(System.out); + /* handle packet - just a test for now */ + ICMP6Packet p; + IPv6Packet ipp; switch (icmpPacket.type) { case ICMP6Packet.NEIGHBOR_SOLICITATION: - icmpPacket.printPacket(System.out); - ICMP6Packet p = new ICMP6Packet(); + p = new ICMP6Packet(); p.targetAddress = icmpPacket.targetAddress; p.type = ICMP6Packet.NEIGHBOR_ADVERTISEMENT; p.flags = ICMP6Packet.FLAG_SOLICITED | ICMP6Packet.FLAG_OVERRIDE; - IPv6Packet ipp = new IPv6Packet(); - ipp.nextHeader = IPv6Packet.ICMP6_DISPATCH; + ipp = new IPv6Packet(); + ipp.setIPPayload(p); // is this ok? ipp.destAddress = packet.sourceAddress; ipStack.sendPacket(ipp); break; + case ICMP6Packet.ROUTER_SOLICITATION: + p = new ICMP6Packet(); + p.targetAddress = icmpPacket.targetAddress; + p.type = ICMP6Packet.ROUTER_ADVERTISEMENT; + p.flags = ICMP6Packet.FLAG_SOLICITED | + ICMP6Packet.FLAG_OVERRIDE; + + ipp = new IPv6Packet(); + ipp.setIPPayload(p); + // is this ok? + ipp.destAddress = packet.sourceAddress; + ipStack.sendPacket(ipp); + break; } } } Modified: mspsim/se/sics/mspsim/net/IEEE802154Handler.java =================================================================== --- mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-17 14:02:52 UTC (rev 524) +++ mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-17 21:11:36 UTC (rev 525) @@ -175,11 +175,17 @@ buffer[pos++] = src[dest.length - i - 1]; } - System.out.println("Packet to send: "); - for (int i = 0; i < pos; i++) { - System.out.printf("%02x", buffer[i]); - } - System.out.println(); + byte[] pHeader = new byte[pos]; + System.arraycopy(buffer, 0, pHeader, 0, pos); + packet.prependBytes(pHeader); + +// System.out.println("802.15.4: Packet to send: "); +// buffer = packet.getBytes(); +// for (int i = 0; i < buffer.length; i++) { +// System.out.printf("%02x", buffer[i]); +// } + System.out.println(); + lowerLayer.sendPacket(packet); } public void printPacket(PrintStream out, Packet packet) { Modified: mspsim/se/sics/mspsim/net/IPv6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-17 14:02:52 UTC (rev 524) +++ mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-17 21:11:36 UTC (rev 525) @@ -61,6 +61,7 @@ int ipLen = 0; int payloadLen = 0; + IPPayload ipPayload; public IPv6Packet() { version = 6; @@ -124,6 +125,13 @@ packet.incPos(40); } + public static void set32(byte[] data, int pos, int value) { + data[pos++] = (byte) ((value >> 32) & 0xff); + data[pos++] = (byte) ((value >> 16) & 0xff); + data[pos++] = (byte) ((value >> 8) & 0xff); + data[pos++] = (byte) (value & 0xff); + } + public static long getLong(byte[] data, int pos) { long lval = data[pos] + ((data[pos + 1] & 0xffL) << 8) + ((data[pos + 2] & 0xffL) << 16) + ((data[pos + 3] & 0xffL) << 24) + @@ -206,4 +214,12 @@ return null; } + public IPPayload getIPPayload() { + return ipPayload; + } + + public void setIPPayload(IPPayload ipp) { + ipPayload = ipp; + nextHeader = ipp.getDispatch(); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-17 14:03:10
|
Revision: 524 http://mspsim.svn.sourceforge.net/mspsim/?rev=524&view=rev Author: joxe Date: 2009-05-17 14:02:52 +0000 (Sun, 17 May 2009) Log Message: ----------- minor fix on IPStack and 802.15.4 Modified Paths: -------------- mspsim/se/sics/mspsim/cli/MiscCommands.java mspsim/se/sics/mspsim/net/CC2420PacketHandler.java mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java mspsim/se/sics/mspsim/net/IEEE802154Handler.java mspsim/se/sics/mspsim/net/IPStack.java Modified: mspsim/se/sics/mspsim/cli/MiscCommands.java =================================================================== --- mspsim/se/sics/mspsim/cli/MiscCommands.java 2009-05-14 16:43:40 UTC (rev 523) +++ mspsim/se/sics/mspsim/cli/MiscCommands.java 2009-05-17 14:02:52 UTC (rev 524) @@ -322,9 +322,12 @@ listener = new CC2420PacketHandler(); IEEE802154Handler ieeeHandler = new IEEE802154Handler(); listener.addUpperLayerHandler(0, ieeeHandler); + ieeeHandler.setLowerLayerHandler(listener); IPStack ipStack = new IPStack(); LoWPANHandler lowpanHandler = new LoWPANHandler(ipStack); - ieeeHandler.addUpperLayerHandler(0, lowpanHandler); + ieeeHandler.addUpperLayerHandler(0, lowpanHandler); + lowpanHandler.setLowerLayerHandler(ieeeHandler); + ipStack.setLinkLayerHandler(lowpanHandler); return 0; } public void lineRead(String line) { Modified: mspsim/se/sics/mspsim/net/CC2420PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/CC2420PacketHandler.java 2009-05-14 16:43:40 UTC (rev 523) +++ mspsim/se/sics/mspsim/net/CC2420PacketHandler.java 2009-05-17 14:02:52 UTC (rev 524) @@ -117,7 +117,7 @@ packet.prependBytes(new byte[packet.getTotalLength()]); packet.prependBytes(PREAMBLE); byte[] data = packet.getBytes(); - System.out.println("Should send to radio!!!! " + packet.getTotalLength()); + System.out.println("Should send packet to radio!!!! " + packet.getTotalLength()); // Stuff to send to radio!!! } Modified: mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-14 16:43:40 UTC (rev 523) +++ mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-17 14:02:52 UTC (rev 524) @@ -15,6 +15,7 @@ /* handle packet - just a test for now */ switch (icmpPacket.type) { case ICMP6Packet.NEIGHBOR_SOLICITATION: + icmpPacket.printPacket(System.out); ICMP6Packet p = new ICMP6Packet(); p.targetAddress = icmpPacket.targetAddress; p.type = ICMP6Packet.NEIGHBOR_ADVERTISEMENT; Modified: mspsim/se/sics/mspsim/net/IEEE802154Handler.java =================================================================== --- mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-14 16:43:40 UTC (rev 523) +++ mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-17 14:02:52 UTC (rev 524) @@ -48,13 +48,23 @@ public static final String SOURCE_MODE = "802154.sourceMode"; public static final String DESTINATION_PAN_ID = "802154.destPAN"; public static final String DESTINATION_MODE = "802154.destMode"; + public static final String VERSION = "802154.version"; public static final String SEQ_NO = "802154.seqno"; public static final String PAYLOAD_LEN = "802154.len"; + public static final int BEACONFRAME = 0x00; + public static final int DATAFRAME = 0x01; + public static final int ACKFRAME = 0x02; + public static final int CMDFRAME = 0x03; + + public static final int SHORT_ADDRESS = 2; public static final int LONG_ADDRESS = 3; + private int defaultAddressMode = LONG_ADDRESS; + private byte seqNo = 0; + /* create a 802.15.4 packet of the bytes and "dispatch" to the * next handler */ @@ -91,6 +101,7 @@ } pos += 8; } + packet.setAttribute(DESTINATION_MODE, destAddrMode); packet.setAttribute(Packet.LL_DESTINATION, destAddress); } @@ -116,10 +127,12 @@ } pos += 8; } + packet.setAttribute(SOURCE_MODE, srcAddrMode); packet.setAttribute(Packet.LL_SOURCE, sourceAddress); } packet.incPos(pos); packet.setAttribute(PAYLOAD_LEN, packet.getPayloadLength()); + packet.setAttribute(VERSION, frameVersion); dispatch(-1, packet); } @@ -127,8 +140,46 @@ /* create a 802.15.4 packet with the given packet as payload, and * deliver to the lower layer handler */ @Override - public void sendPacket(Packet payload) { - // TODO Auto-generated method stub + public void sendPacket(Packet packet) { + System.out.println("Packet should be sent!!!"); + byte[] buffer = new byte[127]; + int pos = 0; + /* construct a default packet... needs fixing later */ + /* no security, no compression, etc */ + buffer[0] = DATAFRAME; + + int destMode = defaultAddressMode; + int srcMode = defaultAddressMode; + int frameVersion = 0; + + buffer[1] = (byte)((destMode << 2) | + (frameVersion << 4) | (srcMode << 6)); + buffer[2] = seqNo++; + + pos = 3; + /* hardcoded PAN */ + buffer[pos++] = (byte) 0xcd; + buffer[pos++] = (byte) 0xab; + + byte[] dest = packet.getLinkDestination(); + for (int i = 0; i < dest.length; i++) { + buffer[pos++] = dest[dest.length - i - 1]; + } + + /* hardcoded PAN */ + buffer[pos++] = (byte) 0xcd; + buffer[pos++] = (byte) 0xab; + + byte[] src = packet.getLinkSource(); + for (int i = 0; i < dest.length; i++) { + buffer[pos++] = src[dest.length - i - 1]; + } + + System.out.println("Packet to send: "); + for (int i = 0; i < pos; i++) { + System.out.printf("%02x", buffer[i]); + } + System.out.println(); } public void printPacket(PrintStream out, Packet packet) { @@ -138,15 +189,15 @@ out.printf(" to %4x/", packet.getAttributeAsInt(DESTINATION_PAN_ID)); printAddress(out, packet.getAttributeAsInt(DESTINATION_MODE), (byte[]) packet.getAttribute(Packet.LL_DESTINATION)); - out.printf(" seqNo: %d len: %d\n", packet.getAttributeAsInt(SEQ_NO), - packet.getAttributeAsInt(PAYLOAD_LEN)); + out.printf(" seqNo: %d vers: %d len: %d\n", packet.getAttributeAsInt(SEQ_NO), + packet.getAttributeAsInt(VERSION), packet.getAttributeAsInt(PAYLOAD_LEN)); } private void printAddress(PrintStream out, int type, byte[] addr) { if (type == SHORT_ADDRESS) { - out.printf("%02x02x", addr[0], addr[1]); + out.printf("%02x%02x", addr[0], addr[1]); } else if (type == LONG_ADDRESS) { - out.printf("%02x02x:%02x02x:%02x02x:%02x02x", addr[0], addr[1], + out.printf("%02x%02x:%02x%02x:%02x%02x:%02x%02x", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], addr[6], addr[7]); } } Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-05-14 16:43:40 UTC (rev 523) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-05-17 14:02:52 UTC (rev 524) @@ -45,9 +45,10 @@ public class IPStack { - byte[] myIPAddress; + byte[] myIPAddress = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, + 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00}; /* currently assumes only one link-layer and one address */ - byte[] myLinkAddress; + byte[] myLinkAddress = new byte[] {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; private PacketHandler linkLayerHandler; private IPPacketer defaultPacketer = new HC01Packeter(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-14 16:43:50
|
Revision: 523 http://mspsim.svn.sourceforge.net/mspsim/?rev=523&view=rev Author: joxe Date: 2009-05-14 16:43:40 +0000 (Thu, 14 May 2009) Log Message: ----------- removed unused class Modified Paths: -------------- mspsim/se/sics/mspsim/cli/MiscCommands.java Removed Paths: ------------- mspsim/se/sics/mspsim/net/HC01PacketHandler.java Modified: mspsim/se/sics/mspsim/cli/MiscCommands.java =================================================================== --- mspsim/se/sics/mspsim/cli/MiscCommands.java 2009-05-14 16:25:36 UTC (rev 522) +++ mspsim/se/sics/mspsim/cli/MiscCommands.java 2009-05-14 16:43:40 UTC (rev 523) @@ -54,13 +54,11 @@ import se.sics.mspsim.core.Chip; import se.sics.mspsim.core.MSP430; import se.sics.mspsim.core.TimeEvent; -import se.sics.mspsim.net.CC2420Packet; import se.sics.mspsim.net.CC2420PacketHandler; -import se.sics.mspsim.net.HC01PacketHandler; import se.sics.mspsim.net.ICMP6Packet; import se.sics.mspsim.net.ICMP6PacketHandler; import se.sics.mspsim.net.IEEE802154Handler; -import se.sics.mspsim.net.IEEE802154Packet; +import se.sics.mspsim.net.IPStack; import se.sics.mspsim.net.IPv6Packet; import se.sics.mspsim.net.LoWPANHandler; import se.sics.mspsim.util.ComponentRegistry; @@ -324,14 +322,9 @@ listener = new CC2420PacketHandler(); IEEE802154Handler ieeeHandler = new IEEE802154Handler(); listener.addUpperLayerHandler(0, ieeeHandler); - LoWPANHandler lowpanHandler = new LoWPANHandler(); - ieeeHandler.addUpperLayerHandler(0, lowpanHandler); - HC01PacketHandler hc01Handler = new HC01PacketHandler(); - - lowpanHandler.addUpperLayerHandler(0x03, hc01Handler); - hc01Handler.addUpperLayerHandler(IPv6Packet.ICMP6_DISPATCH, - new ICMP6PacketHandler()); - + IPStack ipStack = new IPStack(); + LoWPANHandler lowpanHandler = new LoWPANHandler(ipStack); + ieeeHandler.addUpperLayerHandler(0, lowpanHandler); return 0; } public void lineRead(String line) { Deleted: mspsim/se/sics/mspsim/net/HC01PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01PacketHandler.java 2009-05-14 16:25:36 UTC (rev 522) +++ mspsim/se/sics/mspsim/net/HC01PacketHandler.java 2009-05-14 16:43:40 UTC (rev 523) @@ -1,569 +0,0 @@ -/** - * Copyright (c) 2009, Swedish Institute of Computer Science. - * 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. - * - * This file is part of MSPSim. - * - * $Id: $ - * - * ----------------------------------------------------------------- - * - * AbstractPacket - * - * Author : Joakim Eriksson - * Original Authors (Contiki Code): - * - * Created : mar 2009 - * Updated : $Date:$ - * $Revision:$ - */ - -package se.sics.mspsim.net; -import se.sics.mspsim.util.Utils; - -public class HC01PacketHandler extends AbstractPacketHandler { - /* - * Values of fields within the IPHC encoding first byte - * (C stands for compressed and I for inline) - */ - public final static int IPHC_TC_C = 0x80; - public final static int IPHC_VF_C = 0x40; - public final static int IPHC_NH_C = 0x20; - public final static int IPHC_TTL_1 = 0x08; - public final static int IPHC_TTL_64 = 0x10; - public final static int IPHC_TTL_255 = 0x18; - public final static int IPHC_TTL_I = 0x00; - - /* Values of fields within the IPHC encoding second byte */ - public final static int IPHC_SAM_I = 0x00; - public final static int IPHC_SAM_64 = 0x40; - public final static int IPHC_SAM_16 = 0x80; - public final static int IPHC_SAM_0 = 0xC0; - public final static int IPHC_DAM_I = 0x00; - public final static int IPHC_DAM_64 = 0x04; - public final static int IPHC_DAM_16 = 0x08; - public final static int IPHC_DAM_0 = 0x0C; - - public final static int NHC_UDP_ID = 0xF8; - public final static int NHC_UDP_C = 0xFB; - public final static int NHC_UDP_I = 0xF8; - - /* Link local context number */ - public final static int IPHC_ADDR_CONTEXT_LL = 0; - /* 16-bit multicast addresses compression */ - public final static int IPHC_MCAST_RANGE = 0xA0; - - /* Min and Max compressible UDP ports */ - public final static int UDP_PORT_MIN = 0xF0B0; - public final static int UDP_PORT_MAX = 0xF0BF; /* F0B0 + 15 */ - - public static final int HC01_DISPATCH = 0x03; - - /* move these to IPv6 Packet !! */ - public final static int PROTO_ICMP = 1; - public final static int PROTO_TCP = 6; - public final static int PROTO_UDP = 17; - public final static int PROTO_ICMP6 = 58; - - private static class AddrContext { - int used; - int number; - byte[] prefix = new byte[8]; - - public boolean matchPrefix(byte[] address) { - for (int i = 0; i < prefix.length; i++) { - if (prefix[i] != address[i]) - return false; - } - return true; - } - } - - private AddrContext[] contexts = new AddrContext[4]; - - public HC01PacketHandler() { - // set-up some fake contexts just to get started... - contexts[0] = new AddrContext(); - contexts[1] = new AddrContext(); - contexts[2] = new AddrContext(); - contexts[3] = new AddrContext(); - - contexts[0].used = 1; - contexts[0].number = 0; - contexts[0].prefix[0] = (byte) 0xfe; - contexts[0].prefix[1] = (byte) 0x80; - - contexts[1].used = 1; - contexts[1].number = 1; - contexts[1].prefix[0] = (byte) 0xaa; - contexts[1].prefix[1] = (byte) 0xaa; - - } - - - /** - * \brief check whether we can compress the IID in - * address to 16 bits. - * This is used for unicast addresses only, and is true - * if first 49 bits of IID are 0 - * @return - */ - private boolean is16bitCompressable(byte[] address) { - return ((address[8] | address[9] | address[10] | address[11] | - address[12] | address[13]) == 0) && - (address[14] & 0x80) == 0; - } - - /** - * \brief check whether the 9-bit group-id of the - * compressed multicast address is known. It is true - * if the 9-bit group is the all nodes or all routers - * group. - * \param a is typed u8_t * - */ -// #define sicslowpan_is_mcast_addr_decompressable(a) \ -// (((*a & 0x01) == 0) && \ -// ((*(a + 1) == 0x01) || (*(a + 1) == 0x02))) - - /** - * \brief check whether the 112-bit group-id of the - * multicast address is mappable to a 9-bit group-id - * It is true if the group is the all nodes or all - * routers group. - */ -// #define sicslowpan_is_mcast_addr_compressable(a) \ -// ((((a)->u16[1]) == 0) && \ -// (((a)->u16[2]) == 0) && \ -// (((a)->u16[3]) == 0) && \ -// (((a)->u16[4]) == 0) && \ -// (((a)->u16[5]) == 0) && \ -// (((a)->u16[6]) == 0) && \ -// (((a)->u8[14]) == 0) && \ -// ((((a)->u8[15]) == 1) || (((a)->u8[15]) == 2))) - - - - public void packetReceived(Packet container) { - byte[] payload = container.getPayload(); - IPv6Packet packet = new IPv6Packet(); - container.setPayloadPacket(packet); - packet.containerPacket = container; - setPacketData(packet, payload, payload.length); - dispatch(packet.nextHeader, packet); - } - - /* this is used for sending packets! */ - /* we need lots of more info here !!! target, reply-of-packet, etc */ - public void sendPacket(Packet payload) { - } - - private byte[] getLinkSourceAddress(AbstractPacket packet) { - while (packet != null && !(packet instanceof IEEE802154Packet)) - packet = (AbstractPacket) packet.containerPacket; - if (packet != null) { - IEEE802154Packet ieeePacket = (IEEE802154Packet) packet; - return ieeePacket.getSourceAddress(); - } - return null; - } - - private byte[] getLinkDestinationAddress(AbstractPacket packet) { - while (packet != null && !(packet instanceof IEEE802154Packet)) - packet = (AbstractPacket) packet.containerPacket; - if (packet != null) { - IEEE802154Packet ieeePacket = (IEEE802154Packet) packet; - return ieeePacket.getDestinationAddress(); - } - return null; - } - - /* HC01 header compression from 40 bytes to less... */ - public byte[] getPacketData(IPv6Packet packet) { - int enc1 = 0, enc2 = 0; - byte[] data = new byte[40]; - int pos = 3; - - if (packet.flowLabel == 0) { - /* compress version and flow label! */ - enc1 |= IPHC_VF_C; - } - if (packet.trafficClass == 0) { - enc1 |= IPHC_TC_C; - } - - /* write version and flow if needed */ - if ((enc1 & IPHC_VF_C) == 0) { - pos += packet.writeVFlow(data, pos); - } - /* write traffic class if needed */ - if ((enc1 & IPHC_TC_C) == 0) { - data[pos++] = (byte) (packet.trafficClass & 0xff); - } - - /* Note that the payload length is always compressed */ - - /* TODO: compress UDP!!! */ - data[pos++] = (byte) (packet.nextHeader & 0xff); - - switch (packet.hopLimit) { - case 1: - enc1 |= IPHC_TTL_1; - break; - case 64: - enc1 |= IPHC_TTL_64; - break; - case 255: - enc1 |= IPHC_TTL_255; - break; - default: - data[pos++] = (byte) (packet.hopLimit & 0xff); - } - - int context; - if ((context = lookupContext(packet.sourceAddress)) != -1) { - /* elide the prefix */ - enc2 |= context << 4; - if (packet.isSourceMACBased()) { - /* elide the IID */ - enc2 |= IPHC_SAM_0; - } else if (is16bitCompressable(packet.sourceAddress)){ - enc2 |= IPHC_SAM_16; - data[pos++] = packet.sourceAddress[14]; - data[pos++] = packet.sourceAddress[15]; - } else { - enc2 |= IPHC_SAM_64; - System.arraycopy(packet.sourceAddress, 8, data, pos, 8); - pos += 8; - } - } else { - enc2 |= IPHC_SAM_I; - System.arraycopy(packet.sourceAddress, 0, data, pos, 16); - pos += 16; - } - - /* destination compression */ - if(packet.isMulticastDestination()) { - /* Address is multicast, try to compress */ - if(isMulticastCompressable(packet.destAddress)) { - enc2 |= IPHC_DAM_16; - /* 3 first bits = 101 */ - data[pos] = (byte) IPHC_MCAST_RANGE; - /* bits 3-6 = scope = bits 8-11 in 128 bits address */ - data[pos++] |= (packet.destAddress[1] & 0x0F) << 1; - /* - * bits 7 - 15 = 9-bit group - * We just copy the last byte because it works - * with currently supported groups - */ - data[pos++] = packet.destAddress[15]; - } else { - /* send the full address */ - enc2 |= IPHC_DAM_I; - System.arraycopy(packet.destAddress, 0, data, pos, 16); - pos += 16; - } - } else { - /* Address is unicast, try to compress */ - if((context = lookupContext(packet.destAddress)) != -1) { - /* elide the prefix */ - enc2 |= context; - if(packet.isDestinationMACBased()) { - /* elide the IID */ - enc2 |= IPHC_DAM_0; - } else { - if(is16bitCompressable(packet.destAddress)) { - /* compress IID to 16 bits */ - enc2 |= IPHC_DAM_16; - data[pos++] = packet.destAddress[14]; - data[pos++] = packet.destAddress[15]; - } else { - /* do not compress IID */ - enc2 |= IPHC_DAM_64; - System.arraycopy(data, pos, packet.destAddress, 8, 8); - pos += 8; - } - } - } else { - /* send the full address */ - enc2 |= IPHC_DAM_I; - System.arraycopy(data, pos, packet.destAddress, 0, 16); - pos += 16; - } - } - - // uncomp_hdr_len = UIP_IPH_LEN; - // TODO: add udp header compression!!! - - data[0] = HC01_DISPATCH; - data[1] = (byte) (enc1 & 0xff); - data[2] = (byte) (enc2 & 0xff); - - System.out.println("HC01 Header compression: size " + pos); - - byte[] dataPacket = new byte[pos]; - System.arraycopy(data, 0, dataPacket, 0, pos); - return dataPacket; - } - - public void setPacketData(IPv6Packet packet, byte[] data, int len) { - /* first two is ... */ - int pos = 2; - if ((data[0] & 0x40) == 0) { - if ((data[0] & 0x80) == 0) { - packet.version = (data[pos] & 0xf0) >> 4; - packet.trafficClass = ((data[pos] & 0x0f)<<4) + ((data[pos + 1] & 0xff) >> 4); - packet.flowLabel = (data[pos + 1] & 0x0f) << 16 + (data[pos + 2] & 0xff) << 8 + - data[pos + 3] & 0xff; - pos += 4; - } else { - packet.version = 6; - packet.trafficClass = 0; - packet.flowLabel = (data[pos] & 0x0f) << 16 - + (data[pos + 1] & 0xff) << 8 + data[pos + 2] & 0xff;; - pos += 3; - } - } else { - packet.version = 6; - packet.flowLabel = 0; - if ((data[0] & 0x80) == 0) { - packet.trafficClass = (data[pos] & 0xff); - pos++; - } else { - packet.trafficClass = 0; - } - } - - /* next header not compressed -> get it */ - if ((data[0] & 0x20) == 0) { - packet.nextHeader = data[pos++]; - } - - /* encoding of TTL */ - switch (data[0] & 0x18) { - case IPHC_TTL_1: - packet.hopLimit = 1; - break; - case IPHC_TTL_64: - packet.hopLimit = 64; - break; - case IPHC_TTL_255: - packet.hopLimit = 0xff; - break; - case IPHC_TTL_I: - packet.hopLimit = data[pos++]; - break; - } - - /* 0, 1, 2, 3 as source address ??? */ - int srcAddress = (data[1] & 0x30) >> 4; - AddrContext context = lookupContext(srcAddress); - switch (data[1] & 0xc0) { - case IPHC_SAM_0: - if(context == null) { - System.out.println("sicslowpan uncompress_hdr: error context not found\n"); - return; - } - /* set hi address as prefix from context */ - System.arraycopy(context.prefix, 0, packet.sourceAddress, 0, 8); - /* infer IID from L2 address */ - byte[] linkAddress = getLinkSourceAddress(packet); - System.arraycopy(linkAddress, 0, packet.sourceAddress, 8, 8); - /* TODO: clean autoconf stuff up */ - packet.sourceAddress[8] ^= 0x02; - break; - case IPHC_SAM_16: - if((data[pos] & 0x80) == 0) { - /* unicast address */ - if(context == null) { - System.out.println("sicslowpan uncompress_hdr: error context not found\n"); - return; - } - /* set hi address as prefix from context */ - System.arraycopy(context.prefix, 0, packet.sourceAddress, 0, 8); - /* copy 6 NULL bytes then 2 last bytes of IID */ - java.util.Arrays.fill(packet.sourceAddress, 8, 14, (byte)0); - packet.sourceAddress[14] = data[pos]; - packet.sourceAddress[15] = data[pos + 1]; - pos += 2; - } else { - /* [ignore] multicast address check the 9-bit group-id is known */ - java.util.Arrays.fill(packet.sourceAddress, 0, 16, (byte)0); - packet.sourceAddress[0] = (byte)0xff; - packet.sourceAddress[1] = (byte)(((data[pos] & 0xff) >> 1) & 0x0f); - packet.sourceAddress[15] = data[pos + 1]; - pos += 2; - } - break; - case IPHC_SAM_64: - if(context == null) { - System.out.println("sicslowpan uncompress_hdr: error context not found\n"); - return; - } - /* copy prefix from context */ - System.arraycopy(context.prefix, 0, packet.sourceAddress, 0, 8); - /* copy IID from packet */ - System.arraycopy(data, pos, packet.sourceAddress, 8, 8); - pos += 8; - break; - case IPHC_SAM_I: - /* copy whole address from packet */ - System.arraycopy(data, pos, packet.sourceAddress, 0, 16); - pos += 16; - break; - } - - /* Destination address */ - context = lookupContext(data[2] & 0x03); - - switch(data[1] & 0x0C) { - case IPHC_DAM_0: - if(context == null) { - System.out.println("sicslowpan uncompress_hdr: error context not found\n"); - return; - } - /* copy prefix from context */ - System.arraycopy(context.prefix, 0, packet.destAddress, 0, 8); - /* infer IID from L2 address */ - /* figure out a way to pick this up from link-layer !!! */ - byte[] destAddress = getLinkDestinationAddress(packet); - System.arraycopy(destAddress, 0, packet.destAddress, 8, 8); - /* cleanup autoconf stuff later ... */ - packet.destAddress[8] ^= 0x02; - break; - case IPHC_DAM_16: - if((data[pos] & 0x80) == 0) { - /* unicast address */ - if(context == null) { - System.out.println("sicslowpan uncompress_hdr: error context not found\n"); - return; - } - System.arraycopy(context.prefix, 0, packet.destAddress, 0, 8); - /* copy 6 NULL bytes then 2 last bytes of IID */ - packet.destAddress[14] = data[pos]; - packet.destAddress[15] = data[pos + 1]; - pos += 2; - } else { - /* [ignore] multicast address check the 9-bit group-id is known */ - System.out.println("*** Multicast address!!! HC01: " + data[pos] + "," + data[pos + 1]); - java.util.Arrays.fill(packet.destAddress, 0, 16, (byte)0); - packet.destAddress[0] = (byte) 0xff; - packet.destAddress[1] = (byte)(((data[pos] & 0xff) >> 1) & 0x0F); - packet.destAddress[15] = (byte) (data[pos + 1] & 0xff); - pos += 2; - } - break; - case IPHC_DAM_64: - if(context == null) { - System.out.println("sicslowpan uncompress_hdr: error context not found\n"); - return; - } - /* copy prefix from context */ - System.arraycopy(context.prefix, 0, packet.destAddress, 0, 8); - /* copy IID from packet */ - System.arraycopy(data, pos, packet.destAddress, 8, 8); - pos += 8; - break; - case IPHC_DAM_I: - /* copy whole address from packet */ - System.arraycopy(data, pos, packet.destAddress, 0, 16); - pos += 16; - break; - } - - if ((data[0] & 0x20) != 0) { - /* The next header is compressed, NHC is following */ - if ((data[pos] & 0xfc) == NHC_UDP_ID) { - System.out.println("HC01: Next header UDP!"); - packet.nextHeader = PROTO_UDP; - int srcPort = 0; - int destPort = 0; - int checkSum = 0; - switch(data[pos] & 0xff) { - case NHC_UDP_C: - /* 1 byte for NHC, 1 byte for ports, 2 bytes chksum */ - srcPort = UDP_PORT_MIN + ((data[pos + 1] & 0xff) >> 4); - destPort = UDP_PORT_MIN + (data[pos + 1] & 0x0F); - checkSum = ((data[pos + 2] & 0xff) << 8) + (data[pos + 3] & 0xff); - pos += 4; - break; - case NHC_UDP_I: - /* 1 byte for NHC, 4 byte for ports, 2 bytes chksum */ - srcPort = ((data[pos + 1] & 0xff)<< 8) + (data[pos + 2] & 0xff); - destPort = ((data[pos + 3] & 0xff)<< 8) + (data[pos + 4] & 0xff); - checkSum = ((data[pos + 5] & 0xff)<< 8) + (data[pos + 6] & 0xff); - pos += 7; - break; - default: - System.out.println("sicslowpan uncompress_hdr: error unsupported UDP compression\n"); - return; - } - System.out.println("DestPort: " + destPort); - System.out.println("SourcePort: " + srcPort); - System.out.println("Checksum: " + srcPort); - } - } - - boolean frag = false; - /* fragment handling ... */ - if (!frag) { - /* this does not handle the UDP header compression yet... */ - int plen = len - pos; - packet.setPayload(data, pos, plen); - } else { - } - - System.out.println("Encoding 0: " + Utils.hex8(data[0]) + - " Encoding 1: " + Utils.hex8(data[1])); - - System.out.println("TTL: " + packet.hopLimit); - System.out.print("Src Addr: "); - IPv6Packet.printAddress(System.out, packet.sourceAddress); - System.out.print(" Dest Addr: "); - IPv6Packet.printAddress(System.out, packet.destAddress); - System.out.println(); - // packet.setPayload(data, 40, ???); - } - - private boolean isMulticastCompressable(byte[] address) { - return false; - } - - - private AddrContext lookupContext(int index) { - if (index < contexts.length) - return contexts[index]; - return null; - } - - private int lookupContext(byte[] address) { - for (int i = 0; i < contexts.length; i++) { - if (contexts[i] != null && contexts[i].matchPrefix(address)) { - return i; - } - } - return -1; - } -} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-14 16:25:43
|
Revision: 522 http://mspsim.svn.sourceforge.net/mspsim/?rev=522&view=rev Author: joxe Date: 2009-05-14 16:25:36 +0000 (Thu, 14 May 2009) Log Message: ----------- removed unused classes Removed Paths: ------------- mspsim/se/sics/mspsim/net/CC2420Packet.java mspsim/se/sics/mspsim/net/IEEE802154Packet.java mspsim/se/sics/mspsim/net/LoWPANPacket.java Deleted: mspsim/se/sics/mspsim/net/CC2420Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/CC2420Packet.java 2009-05-14 16:05:30 UTC (rev 521) +++ mspsim/se/sics/mspsim/net/CC2420Packet.java 2009-05-14 16:25:36 UTC (rev 522) @@ -1,20 +0,0 @@ -package se.sics.mspsim.net; - -import java.io.PrintStream; - -public class CC2420Packet extends AbstractPacket { - - public void printPacket(PrintStream out) { - out.print("CC2420 | len:" + payload.length + " | "); - for (int i = 0; i < payload.length; i++) { - out.printf("%02x", payload[i] & 0xff); - if ((i & 3) == 3) { - out.print(" "); - } - } - out.println(); - if (payloadPacket != null) { - payloadPacket.printPacket(out); - } - } -} Deleted: mspsim/se/sics/mspsim/net/IEEE802154Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IEEE802154Packet.java 2009-05-14 16:05:30 UTC (rev 521) +++ mspsim/se/sics/mspsim/net/IEEE802154Packet.java 2009-05-14 16:25:36 UTC (rev 522) @@ -1,159 +0,0 @@ -/** - * Copyright (c) 2009, Swedish Institute of Computer Science. - * 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. - * - * This file is part of MSPSim. - * - * $Id: $ - * - * ----------------------------------------------------------------- - * - * IEEE802154Packet - * - * Author : Joakim Eriksson - * Created : mar 2009 - * Updated : $Date:$ - * $Revision:$ - */ - -package se.sics.mspsim.net; - -import java.io.PrintStream; -/* remove */ -public class IEEE802154Packet { //extends AbstractPacket { - - public static final int SHORT_ADDRESS = 2; - public static final int LONG_ADDRESS = 3; - - // TODO: remove long addresses... - private int type = 0; - private int security = 0; - private int pending = 0; - private int ackRequired = 0; - private int panCompression = 0; - private int destAddrMode; - private int frameVersion; - private int srcAddrMode; - private byte seqNumber; - private int destPanID; - private long destAddr; - private long srcAddr; - private byte[] destAddress = new byte[8]; - private byte[] sourceAddress = new byte[8]; - private int srcPanID; - -// public IEEE802154Packet(Packet container) { -// byte[] payload = container.getPayload(); -// setPacketData(container, payload, payload.length); -// } - - public IEEE802154Packet() { - } - - public byte[] getDestinationAddress() { - return destAddress; - } - - public void setDestinationAddress(byte[] destAddress) { - for (int i = 0; i < destAddress.length; i++) { - this.destAddress[i] = destAddress[i]; - } - } - - public void setSourceAddress(byte[] srcAddress) { - for (int i = 0; i < srcAddress.length; i++) { - this.sourceAddress[i] = srcAddress[i]; - } - } - - - public byte[] getSourceAddress() { - return sourceAddress; - } - - - public void setPacketData(Packet container, byte[] data, int len) { - - type = data[0] & 7; - security = (data[0] >> 3) & 1; - pending = (data[0] >> 4) & 1; - ackRequired = (data[0] >> 5) & 1; - panCompression = (data[0]>> 6) & 1; - destAddrMode = (data[1] >> 2) & 3; - frameVersion = (data[1] >> 4) & 3; - srcAddrMode = (data[1] >> 6) & 3; - seqNumber = data[2]; - - int pos = 3; - if (destAddrMode > 0) { - destPanID = (data[pos] & 0xff) + ((data[pos + 1] & 0xff) << 8); - pos += 2; - if (destAddrMode == SHORT_ADDRESS) { - destAddr = (data[pos] & 0xff) + ((data[pos + 1] & 0xff) << 8); - destAddress[1] = data[pos]; - destAddress[0] = data[pos + 1]; - pos += 2; - } else if (destAddrMode == LONG_ADDRESS) { - destAddr = data[pos] + ((data[pos + 1] & 0xffL) << 8) + - ((data[pos + 2] & 0xffL) << 16) + ((data[pos + 3] & 0xffL) << 24) + - ((data[pos + 4] & 0xffL) << 32) + ((data[pos + 5] & 0xffL)<< 40) + - ((data[pos + 6] & 0xffL) << 48) + ((data[pos + 7] & 0xffL) << 56); - - for (int i = 0; i < 8; i++) { - destAddress[i] = data[pos + 7 - i]; - } - - pos += 8; - } - } - - if (srcAddrMode > 0) { - if (panCompression == 0){ - srcPanID = (data[pos] & 0xff) + ((data[pos + 1] & 0xff) << 8); - pos += 2; - } else { - srcPanID = destPanID; - } - if (srcAddrMode == SHORT_ADDRESS) { - srcAddr = (data[pos] & 0xff) + ((data[pos + 1] & 0xff) << 8); - sourceAddress[1] = data[pos]; - sourceAddress[0] = data[pos + 1]; - pos += 2; - } else if (srcAddrMode == LONG_ADDRESS) { - srcAddr = data[pos] + ((data[pos + 1] & 0xffL) << 8) + - ((data[pos + 2] & 0xffL) << 16) + ((data[pos + 3] & 0xffL) << 24) + - ((data[pos + 4] & 0xffL) << 32) + ((data[pos + 5] & 0xffL)<< 40) + - ((data[pos + 6] & 0xffL) << 48) + ((data[pos + 7] & 0xffL) << 56); - - for (int i = 0; i < 8; i++) { - sourceAddress[i] = data[pos + 7 - i]; - } - pos += 8; - } - } -// setPayload(data, pos, len - pos); - } -} \ No newline at end of file Deleted: mspsim/se/sics/mspsim/net/LoWPANPacket.java =================================================================== --- mspsim/se/sics/mspsim/net/LoWPANPacket.java 2009-05-14 16:05:30 UTC (rev 521) +++ mspsim/se/sics/mspsim/net/LoWPANPacket.java 2009-05-14 16:25:36 UTC (rev 522) @@ -1,31 +0,0 @@ -package se.sics.mspsim.net; - -import java.io.PrintStream; - -public class LoWPANPacket extends AbstractPacket { - - int dispatch = 0; - - public LoWPANPacket() { - } - - public LoWPANPacket(byte[] data) { - dispatch = data[0]; - setPayload(data, 1, data.length - 1); - } - - public byte[] getSourceAddress() { - return containerPacket.getSourceAddress(); - } - - public byte[] getDestinationAddress() { - return containerPacket.getDestinationAddress(); - } - - public void printPacket(PrintStream out) { - out.println("6LoWPAN Dispatch: " + dispatch); - if (payloadPacket != null) { - payloadPacket.printPacket(out); - } - } -} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-14 16:05:44
|
Revision: 521 http://mspsim.svn.sourceforge.net/mspsim/?rev=521&view=rev Author: joxe Date: 2009-05-14 16:05:30 +0000 (Thu, 14 May 2009) Log Message: ----------- refactoring Added Paths: ----------- mspsim/se/sics/mspsim/net/HC01Packeter.java mspsim/se/sics/mspsim/net/IPPacketer.java mspsim/se/sics/mspsim/net/IPStack.java Added: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java (rev 0) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-14 16:05:30 UTC (rev 521) @@ -0,0 +1,538 @@ +/** + * Copyright (c) 2009, Swedish Institute of Computer Science. + * 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. + * + * This file is part of MSPSim. + * + * $Id: $ + * + * ----------------------------------------------------------------- + * + * AbstractPacket + * + * Author : Joakim Eriksson + * Original Authors (Contiki Code): + * + * Created : mar 2009 + * Updated : $Date:$ + * $Revision:$ + */ + +package se.sics.mspsim.net; +import se.sics.mspsim.util.Utils; + +public class HC01Packeter implements IPPacketer { + /* + * Values of fields within the IPHC encoding first byte + * (C stands for compressed and I for inline) + */ + public final static int IPHC_TC_C = 0x80; + public final static int IPHC_VF_C = 0x40; + public final static int IPHC_NH_C = 0x20; + public final static int IPHC_TTL_1 = 0x08; + public final static int IPHC_TTL_64 = 0x10; + public final static int IPHC_TTL_255 = 0x18; + public final static int IPHC_TTL_I = 0x00; + + /* Values of fields within the IPHC encoding second byte */ + public final static int IPHC_SAM_I = 0x00; + public final static int IPHC_SAM_64 = 0x40; + public final static int IPHC_SAM_16 = 0x80; + public final static int IPHC_SAM_0 = 0xC0; + public final static int IPHC_DAM_I = 0x00; + public final static int IPHC_DAM_64 = 0x04; + public final static int IPHC_DAM_16 = 0x08; + public final static int IPHC_DAM_0 = 0x0C; + + public final static int NHC_UDP_ID = 0xF8; + public final static int NHC_UDP_C = 0xFB; + public final static int NHC_UDP_I = 0xF8; + + /* Link local context number */ + public final static int IPHC_ADDR_CONTEXT_LL = 0; + /* 16-bit multicast addresses compression */ + public final static int IPHC_MCAST_RANGE = 0xA0; + + /* Min and Max compressible UDP ports */ + public final static int UDP_PORT_MIN = 0xF0B0; + public final static int UDP_PORT_MAX = 0xF0BF; /* F0B0 + 15 */ + + public static final int HC01_DISPATCH = 0x03; + + /* move these to IPv6 Packet !! */ + public final static int PROTO_ICMP = 1; + public final static int PROTO_TCP = 6; + public final static int PROTO_UDP = 17; + public final static int PROTO_ICMP6 = 58; + + private static class AddrContext { + int used; + int number; + byte[] prefix = new byte[8]; + + public boolean matchPrefix(byte[] address) { + for (int i = 0; i < prefix.length; i++) { + if (prefix[i] != address[i]) + return false; + } + return true; + } + } + + private AddrContext[] contexts = new AddrContext[4]; + + public HC01Packeter() { + // set-up some fake contexts just to get started... + contexts[0] = new AddrContext(); + contexts[1] = new AddrContext(); + contexts[2] = new AddrContext(); + contexts[3] = new AddrContext(); + + contexts[0].used = 1; + contexts[0].number = 0; + contexts[0].prefix[0] = (byte) 0xfe; + contexts[0].prefix[1] = (byte) 0x80; + + contexts[1].used = 1; + contexts[1].number = 1; + contexts[1].prefix[0] = (byte) 0xaa; + contexts[1].prefix[1] = (byte) 0xaa; + + } + + public byte getDispatch() { + return HC01_DISPATCH; + } + + /** + * \brief check whether we can compress the IID in + * address to 16 bits. + * This is used for unicast addresses only, and is true + * if first 49 bits of IID are 0 + * @return + */ + private boolean is16bitCompressable(byte[] address) { + return ((address[8] | address[9] | address[10] | address[11] | + address[12] | address[13]) == 0) && + (address[14] & 0x80) == 0; + } + + /** + * \brief check whether the 9-bit group-id of the + * compressed multicast address is known. It is true + * if the 9-bit group is the all nodes or all routers + * group. + * \param a is typed u8_t * + */ +// #define sicslowpan_is_mcast_addr_decompressable(a) \ +// (((*a & 0x01) == 0) && \ +// ((*(a + 1) == 0x01) || (*(a + 1) == 0x02))) + + /** + * \brief check whether the 112-bit group-id of the + * multicast address is mappable to a 9-bit group-id + * It is true if the group is the all nodes or all + * routers group. + */ +// #define sicslowpan_is_mcast_addr_compressable(a) \ +// ((((a)->u16[1]) == 0) && \ +// (((a)->u16[2]) == 0) && \ +// (((a)->u16[3]) == 0) && \ +// (((a)->u16[4]) == 0) && \ +// (((a)->u16[5]) == 0) && \ +// (((a)->u16[6]) == 0) && \ +// (((a)->u8[14]) == 0) && \ +// ((((a)->u8[15]) == 1) || (((a)->u8[15]) == 2))) + + /* before calling this a call to the routing mechanism needs to be done + * to get the LL addresses. */ + /* HC01 header compression from 40 bytes to less... */ + public byte[] generatePacketData(IPv6Packet packet) { + int enc1 = 0, enc2 = 0; + byte[] data = new byte[40]; + int pos = 3; + + if (packet.flowLabel == 0) { + /* compress version and flow label! */ + enc1 |= IPHC_VF_C; + } + if (packet.trafficClass == 0) { + enc1 |= IPHC_TC_C; + } + + /* write version and flow if needed */ + if ((enc1 & IPHC_VF_C) == 0) { + pos += packet.writeVFlow(data, pos); + } + /* write traffic class if needed */ + if ((enc1 & IPHC_TC_C) == 0) { + data[pos++] = (byte) (packet.trafficClass & 0xff); + } + + /* Note that the payload length is always compressed */ + + /* TODO: compress UDP!!! */ + data[pos++] = (byte) (packet.nextHeader & 0xff); + + switch (packet.hopLimit) { + case 1: + enc1 |= IPHC_TTL_1; + break; + case 64: + enc1 |= IPHC_TTL_64; + break; + case 255: + enc1 |= IPHC_TTL_255; + break; + default: + data[pos++] = (byte) (packet.hopLimit & 0xff); + } + + int context; + if ((context = lookupContext(packet.sourceAddress)) != -1) { + /* elide the prefix */ + enc2 |= context << 4; + if (packet.isSourceMACBased()) { + /* elide the IID */ + enc2 |= IPHC_SAM_0; + } else if (is16bitCompressable(packet.sourceAddress)){ + enc2 |= IPHC_SAM_16; + data[pos++] = packet.sourceAddress[14]; + data[pos++] = packet.sourceAddress[15]; + } else { + enc2 |= IPHC_SAM_64; + System.arraycopy(packet.sourceAddress, 8, data, pos, 8); + pos += 8; + } + } else { + enc2 |= IPHC_SAM_I; + System.arraycopy(packet.sourceAddress, 0, data, pos, 16); + pos += 16; + } + + /* destination compression */ + if(packet.isMulticastDestination()) { + /* Address is multicast, try to compress */ + if(isMulticastCompressable(packet.destAddress)) { + enc2 |= IPHC_DAM_16; + /* 3 first bits = 101 */ + data[pos] = (byte) IPHC_MCAST_RANGE; + /* bits 3-6 = scope = bits 8-11 in 128 bits address */ + data[pos++] |= (packet.destAddress[1] & 0x0F) << 1; + /* + * bits 7 - 15 = 9-bit group + * We just copy the last byte because it works + * with currently supported groups + */ + data[pos++] = packet.destAddress[15]; + } else { + /* send the full address */ + enc2 |= IPHC_DAM_I; + System.arraycopy(packet.destAddress, 0, data, pos, 16); + pos += 16; + } + } else { + /* Address is unicast, try to compress */ + if((context = lookupContext(packet.destAddress)) != -1) { + /* elide the prefix */ + enc2 |= context; + if(packet.isDestinationMACBased()) { + /* elide the IID */ + enc2 |= IPHC_DAM_0; + } else { + if(is16bitCompressable(packet.destAddress)) { + /* compress IID to 16 bits */ + enc2 |= IPHC_DAM_16; + data[pos++] = packet.destAddress[14]; + data[pos++] = packet.destAddress[15]; + } else { + /* do not compress IID */ + enc2 |= IPHC_DAM_64; + System.arraycopy(data, pos, packet.destAddress, 8, 8); + pos += 8; + } + } + } else { + /* send the full address */ + enc2 |= IPHC_DAM_I; + System.arraycopy(data, pos, packet.destAddress, 0, 16); + pos += 16; + } + } + + // uncomp_hdr_len = UIP_IPH_LEN; + // TODO: add udp header compression!!! + + data[0] = HC01_DISPATCH; + data[1] = (byte) (enc1 & 0xff); + data[2] = (byte) (enc2 & 0xff); + + System.out.println("HC01 Header compression: size " + pos); + + byte[] dataPacket = new byte[pos]; + System.arraycopy(data, 0, dataPacket, 0, pos); + return dataPacket; + } + + public void parsePacketData(IPv6Packet packet) { + /* first two is ... */ + int pos = 2; + if ((packet.getData(0) & 0x40) == 0) { + if ((packet.getData(0) & 0x80) == 0) { + packet.version = (packet.getData(pos) & 0xf0) >> 4; + packet.trafficClass = ((packet.getData(pos) & 0x0f)<<4) + ((packet.getData(pos + 1) & 0xff) >> 4); + packet.flowLabel = (packet.getData(pos + 1) & 0x0f) << 16 + (packet.getData(pos + 2) & 0xff) << 8 + + packet.getData(pos + 3) & 0xff; + pos += 4; + } else { + packet.version = 6; + packet.trafficClass = 0; + packet.flowLabel = (packet.getData(pos) & 0x0f) << 16 + + (packet.getData(pos + 1) & 0xff) << 8 + packet.getData(pos + 2) & 0xff;; + pos += 3; + } + } else { + packet.version = 6; + packet.flowLabel = 0; + if ((packet.getData(0) & 0x80) == 0) { + packet.trafficClass = (packet.getData(pos) & 0xff); + pos++; + } else { + packet.trafficClass = 0; + } + } + + /* next header not compressed -> get it */ + if ((packet.getData(0) & 0x20) == 0) { + packet.nextHeader = packet.getData(pos++); + } + + /* encoding of TTL */ + switch (packet.getData(0) & 0x18) { + case IPHC_TTL_1: + packet.hopLimit = 1; + break; + case IPHC_TTL_64: + packet.hopLimit = 64; + break; + case IPHC_TTL_255: + packet.hopLimit = 0xff; + break; + case IPHC_TTL_I: + packet.hopLimit = packet.getData(pos++); + break; + } + + /* 0, 1, 2, 3 as source address ??? */ + int srcAddress = (packet.getData(1) & 0x30) >> 4; + AddrContext context = lookupContext(srcAddress); + switch (packet.getData(1) & 0xc0) { + case IPHC_SAM_0: + if(context == null) { + System.out.println("sicslowpan uncompress_hdr: error context not found\n"); + return; + } + /* set hi address as prefix from context */ + System.arraycopy(context.prefix, 0, packet.sourceAddress, 0, 8); + /* infer IID from L2 address */ + byte[] linkAddress = packet.getLinkSource();//getLinkSourceAddress(packet); + System.arraycopy(linkAddress, 0, packet.sourceAddress, 8, 8); + /* TODO: clean autoconf stuff up */ + packet.sourceAddress[8] ^= 0x02; + break; + case IPHC_SAM_16: + if((packet.getData(pos) & 0x80) == 0) { + /* unicast address */ + if(context == null) { + System.out.println("sicslowpan uncompress_hdr: error context not found\n"); + return; + } + /* set hi address as prefix from context */ + System.arraycopy(context.prefix, 0, packet.sourceAddress, 0, 8); + /* copy 6 NULL bytes then 2 last bytes of IID */ + java.util.Arrays.fill(packet.sourceAddress, 8, 14, (byte)0); + packet.sourceAddress[14] = packet.getData(pos); + packet.sourceAddress[15] = packet.getData(pos + 1); + pos += 2; + } else { + /* [ignore] multicast address check the 9-bit group-id is known */ + java.util.Arrays.fill(packet.sourceAddress, 0, 16, (byte)0); + packet.sourceAddress[0] = (byte)0xff; + packet.sourceAddress[1] = (byte)(((packet.getData(pos) & 0xff) >> 1) & 0x0f); + packet.sourceAddress[15] = packet.getData(pos + 1); + pos += 2; + } + break; + case IPHC_SAM_64: + if(context == null) { + System.out.println("sicslowpan uncompress_hdr: error context not found\n"); + return; + } + /* copy prefix from context */ + System.arraycopy(context.prefix, 0, packet.sourceAddress, 0, 8); + /* copy IID from packet */ + packet.copy(pos, packet.sourceAddress, 8, 8); + pos += 8; + break; + case IPHC_SAM_I: + /* copy whole address from packet */ + packet.copy(pos, packet.sourceAddress, 0, 16); + pos += 16; + break; + } + + /* Destination address */ + context = lookupContext(packet.getData(2) & 0x03); + + switch(packet.getData(1) & 0x0C) { + case IPHC_DAM_0: + if(context == null) { + System.out.println("sicslowpan uncompress_hdr: error context not found\n"); + return; + } + /* copy prefix from context */ + System.arraycopy(context.prefix, 0, packet.destAddress, 0, 8); + /* infer IID from L2 address */ + byte[] destAddress = packet.getLinkDestination(); + System.arraycopy(destAddress, 0, packet.destAddress, 8, 8); + /* cleanup autoconf stuff later ... */ + packet.destAddress[8] ^= 0x02; + break; + case IPHC_DAM_16: + if((packet.getData(pos) & 0x80) == 0) { + /* unicast address */ + if(context == null) { + System.out.println("sicslowpan uncompress_hdr: error context not found\n"); + return; + } + System.arraycopy(context.prefix, 0, packet.destAddress, 0, 8); + /* copy 6 NULL bytes then 2 last bytes of IID */ + packet.destAddress[14] = packet.getData(pos); + packet.destAddress[15] = packet.getData(pos + 1); + pos += 2; + } else { + /* [ignore] multicast address check the 9-bit group-id is known */ + System.out.println("*** Multicast address!!! HC01: " + packet.getData(pos) + "," + packet.getData(pos + 1)); + java.util.Arrays.fill(packet.destAddress, 0, 16, (byte)0); + packet.destAddress[0] = (byte) 0xff; + packet.destAddress[1] = (byte)(((packet.getData(pos) & 0xff) >> 1) & 0x0F); + packet.destAddress[15] = (byte) (packet.getData(pos + 1) & 0xff); + pos += 2; + } + break; + case IPHC_DAM_64: + if(context == null) { + System.out.println("sicslowpan uncompress_hdr: error context not found\n"); + return; + } + /* copy prefix from context */ + System.arraycopy(context.prefix, 0, packet.destAddress, 0, 8); + /* copy IID from packet */ + packet.copy(pos, packet.destAddress, 8, 8); + pos += 8; + break; + case IPHC_DAM_I: + /* copy whole address from packet */ + packet.copy(pos, packet.destAddress, 0, 16); + pos += 16; + break; + } + + if ((packet.getData(0) & 0x20) != 0) { + /* The next header is compressed, NHC is following */ + if ((packet.getData(pos) & 0xfc) == NHC_UDP_ID) { + System.out.println("HC01: Next header UDP!"); + packet.nextHeader = PROTO_UDP; + int srcPort = 0; + int destPort = 0; + int checkSum = 0; + switch(packet.getData(pos) & 0xff) { + case NHC_UDP_C: + /* 1 byte for NHC, 1 byte for ports, 2 bytes chksum */ + srcPort = UDP_PORT_MIN + ((packet.getData(pos + 1) & 0xff) >> 4); + destPort = UDP_PORT_MIN + (packet.getData(pos + 1) & 0x0F); + checkSum = ((packet.getData(pos + 2) & 0xff) << 8) + (packet.getData(pos + 3) & 0xff); + pos += 4; + break; + case NHC_UDP_I: + /* 1 byte for NHC, 4 byte for ports, 2 bytes chksum */ + srcPort = ((packet.getData(pos + 1) & 0xff)<< 8) + (packet.getData(pos + 2) & 0xff); + destPort = ((packet.getData(pos + 3) & 0xff)<< 8) + (packet.getData(pos + 4) & 0xff); + checkSum = ((packet.getData(pos + 5) & 0xff)<< 8) + (packet.getData(pos + 6) & 0xff); + pos += 7; + break; + default: + System.out.println("sicslowpan uncompress_hdr: error unsupported UDP compression\n"); + return; + } + System.out.println("DestPort: " + destPort); + System.out.println("SourcePort: " + srcPort); + System.out.println("Checksum: " + srcPort); + } + } + + boolean frag = false; + /* fragment handling ... */ + if (!frag) { + /* this does not handle the UDP header compression yet... */ + /* move cursor pos steps forward */ + packet.incPos(pos); + } else { + } + + System.out.println("Encoding 0: " + Utils.hex8(packet.getData(0)) + + " Encoding 1: " + Utils.hex8(packet.getData(1))); + + System.out.println("TTL: " + packet.hopLimit); + System.out.print("Src Addr: "); + IPv6Packet.printAddress(System.out, packet.sourceAddress); + System.out.print(" Dest Addr: "); + IPv6Packet.printAddress(System.out, packet.destAddress); + System.out.println(); + // packet.setPayload(data, 40, ???); + packet.payloadLen = packet.getPayloadLength(); + } + + private boolean isMulticastCompressable(byte[] address) { + return false; + } + + + private AddrContext lookupContext(int index) { + if (index < contexts.length) + return contexts[index]; + return null; + } + + private int lookupContext(byte[] address) { + for (int i = 0; i < contexts.length; i++) { + if (contexts[i] != null && contexts[i].matchPrefix(address)) { + return i; + } + } + return -1; + } +} \ No newline at end of file Added: mspsim/se/sics/mspsim/net/IPPacketer.java =================================================================== --- mspsim/se/sics/mspsim/net/IPPacketer.java (rev 0) +++ mspsim/se/sics/mspsim/net/IPPacketer.java 2009-05-14 16:05:30 UTC (rev 521) @@ -0,0 +1,20 @@ +package se.sics.mspsim.net; + +/* creates and parser IP packets */ +public interface IPPacketer { + + public byte getDispatch(); + + + /* before calling this method a call to route is needed to get + * the link layer addresses into the IPv6Packet + */ + public byte[] generatePacketData(IPv6Packet packet); + + + /* before calling this method the IPv6Packet needs to have its + * link layer addresses added from the link layer + */ + public void parsePacketData(IPv6Packet packet); + +} Added: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java (rev 0) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-05-14 16:05:30 UTC (rev 521) @@ -0,0 +1,122 @@ +/** + * Copyright (c) 2009, Swedish Institute of Computer Science. + * 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. + * + * This file is part of MSPSim. + * + * $Id: $ + * + * ----------------------------------------------------------------- + * + * IPStack + * + * An IPStack with configurable link layer, etc. + * + * Author : Joakim Eriksson + * Created : mar 2009 + * Updated : $Date:$ + * $Revision:$ + */ + +package se.sics.mspsim.net; + +public class IPStack { + + byte[] myIPAddress; + /* currently assumes only one link-layer and one address */ + byte[] myLinkAddress; + + private PacketHandler linkLayerHandler; + private IPPacketer defaultPacketer = new HC01Packeter(); + private ICMP6PacketHandler icmp6Handler; + + /* this needs to be generalized later... and down to lowpan too... */ + //private HC01Packeter ipPacketer = new HC01Packeter(); + + public IPStack() { + icmp6Handler = new ICMP6PacketHandler(this); + } + + public void setLinkLayerHandler(PacketHandler handler) { + linkLayerHandler = handler; + } + + private boolean findRoute(IPv6Packet packet) { + // this does not do anything yet... we assume that the low 8 byte is MAC + if (packet.getLinkDestination() == null) { + /* find a MAC address for this packets destination... */ + packet.setAttribute("link.destination", new byte[8]); + } + packet.setAttribute("link.source", myLinkAddress); + return true; + } + + public void sendPacket(IPv6Packet packet) { + /* find route checks if there are link addr, and otherwise sets them */ + if (findRoute(packet)) { + linkLayerHandler.sendPacket(packet); + } + } + + public void receivePacket(IPv6Packet packet) { + System.out.println("IPv6 packet received!!!"); + packet.printPacket(System.out); + // do stuff! + switch (packet.nextHeader) { + case ICMP6Packet.DISPATCH: + icmp6Handler.handlePacket(packet); + break; + } + } + + public void setLinkLayerAddress(byte[] addr) { + myLinkAddress = addr; + } + + public void setIPAddress(byte[] addr) { + myIPAddress = addr; + } + + public byte[] getLinkLayerAddress() { + return myLinkAddress; + } + + public byte[] getIPAddress() { + return myIPAddress; + } + + public IPPacketer getPacketer() { + return getDefaultPacketer(); + } + + public void setDefaultPacketer(IPPacketer defaultPacketer) { + this.defaultPacketer = defaultPacketer; + } + + public IPPacketer getDefaultPacketer() { + return defaultPacketer; + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-14 16:05:03
|
Revision: 520 http://mspsim.svn.sourceforge.net/mspsim/?rev=520&view=rev Author: joxe Date: 2009-05-14 16:04:08 +0000 (Thu, 14 May 2009) Log Message: ----------- refactoring of network stack Modified Paths: -------------- mspsim/se/sics/mspsim/net/AbstractPacket.java mspsim/se/sics/mspsim/net/AbstractPacketHandler.java mspsim/se/sics/mspsim/net/CC2420PacketHandler.java mspsim/se/sics/mspsim/net/ICMP6Packet.java mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java mspsim/se/sics/mspsim/net/IEEE802154Handler.java mspsim/se/sics/mspsim/net/IEEE802154Packet.java mspsim/se/sics/mspsim/net/IPv6Packet.java mspsim/se/sics/mspsim/net/LoWPANHandler.java mspsim/se/sics/mspsim/net/Packet.java mspsim/se/sics/mspsim/net/PacketHandler.java Modified: mspsim/se/sics/mspsim/net/AbstractPacket.java =================================================================== --- mspsim/se/sics/mspsim/net/AbstractPacket.java 2009-05-05 17:50:22 UTC (rev 519) +++ mspsim/se/sics/mspsim/net/AbstractPacket.java 2009-05-14 16:04:08 UTC (rev 520) @@ -41,7 +41,8 @@ package se.sics.mspsim.net; -public abstract class AbstractPacket implements Packet { +// remove +public abstract class AbstractPacket extends Packet { byte[] payload; int payloadLen; @@ -61,29 +62,6 @@ return null; } - public void setPayloadPacket(Packet packet) { - payloadPacket = packet; - if (packet.getContainerPacket() != this) { - packet.setContainerPacket(this); - } - } - - public void setContainerPacket(Packet packet) { - containerPacket = packet; - if (packet.getPayloadPacket() != this) { - packet.setPayloadPacket(this); - } - } - - public Packet getPayloadPacket() { - return payloadPacket; - } - - public Packet getContainerPacket() { - return containerPacket; - } - - public AbstractPacket createReply() { return null; } Modified: mspsim/se/sics/mspsim/net/AbstractPacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/AbstractPacketHandler.java 2009-05-05 17:50:22 UTC (rev 519) +++ mspsim/se/sics/mspsim/net/AbstractPacketHandler.java 2009-05-14 16:04:08 UTC (rev 520) @@ -40,10 +40,13 @@ package se.sics.mspsim.net; +import java.io.PrintStream; import java.util.ArrayList; public abstract class AbstractPacketHandler implements PacketHandler { + boolean debug = true; + ArrayList<PacketHandlerDispatch> upperLayers = new ArrayList<PacketHandlerDispatch>(); PacketHandler lowerLayer; @@ -64,25 +67,30 @@ } /* incoming packets ... */ - void dispatch(int dispatch, Packet container) { - byte[] payload = container.getPayload(); + void dispatch(int dispatch, Packet packet) { + if (debug) { + printPacket(System.out, packet); + } if (dispatch != -1) { for (int i = 0; i < upperLayers.size(); i++) { if (upperLayers.get(i).dispatch == dispatch) { - upperLayers.get(i).packetHandler.packetReceived(container); + upperLayers.get(i).packetHandler.packetReceived(packet); return; } } System.out.println("**** no dispatch handler for " + dispatch + " found..."); } else if (upperLayers.size() > 0){ - upperLayers.get(0).packetHandler.packetReceived(container); + upperLayers.get(0).packetHandler.packetReceived(packet); } } public abstract void packetReceived(Packet container); - public abstract void sendPacket(Packet payload); + public abstract void sendPacket(Packet packet); + public void printPacket(PrintStream out, Packet packet) { + } + private static class PacketHandlerDispatch { int dispatch; PacketHandler packetHandler; Modified: mspsim/se/sics/mspsim/net/CC2420PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/CC2420PacketHandler.java 2009-05-05 17:50:22 UTC (rev 519) +++ mspsim/se/sics/mspsim/net/CC2420PacketHandler.java 2009-05-14 16:04:08 UTC (rev 520) @@ -40,10 +40,14 @@ package se.sics.mspsim.net; +import java.io.PrintStream; + import se.sics.mspsim.chip.RFListener; public class CC2420PacketHandler extends AbstractPacketHandler implements RFListener { + public static final String CC2420_LEN = "cc2420.len"; + private static final int SFD_SEARCH = 1; private static final int LEN = 2; private static final int PACKET = 3; @@ -75,11 +79,14 @@ case PACKET: if (pos == packetLen + PREAMBLE.length + 1) { /* the packet is in!!! */ - CC2420Packet packet = new CC2420Packet(); - packet.setPayload(packetBuffer, PREAMBLE.length + 1, packetLen - 2); +// CC2420Packet packet = new CC2420Packet(); +// packet.setPayload(packetBuffer, PREAMBLE.length + 1, packetLen - 2); + Packet packet = new Packet(); + packet.setBytes(packetBuffer, PREAMBLE.length + 1, packetLen - 2); + packet.setAttribute(CC2420_LEN, packet.getTotalLength()); dispatch(-1, packet); - System.out.println("Packet received"); - packet.printPacket(System.out); + System.out.println("CC2420: Packet received"); + /* this is a packet that has passed the stack! */ mode = SFD_SEARCH; pos = 0; @@ -93,7 +100,25 @@ // Never any packets received here... } - public void sendPacket(Packet payload) { - // give to radio!!! + public void printPacket(PrintStream out, Packet packet) { + int payloadLen = packet.getAttributeAsInt(CC2420_LEN); + out.print("CC2420 | len:" + payloadLen + " | "); + for (int i = 0; i < payloadLen; i++) { + out.printf("%02x", packet.getData(i) & 0xff); + if ((i & 3) == 3) { + out.print(" "); + } + } + out.println(); } + + + public void sendPacket(Packet packet) { + packet.prependBytes(new byte[packet.getTotalLength()]); + packet.prependBytes(PREAMBLE); + byte[] data = packet.getBytes(); + System.out.println("Should send to radio!!!! " + packet.getTotalLength()); + // Stuff to send to radio!!! + } + } Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-05 17:50:22 UTC (rev 519) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-14 16:04:08 UTC (rev 520) @@ -2,8 +2,10 @@ import java.io.PrintStream; -public class ICMP6Packet extends AbstractPacket { +public class ICMP6Packet { //extends Packet { + public static final int DISPATCH = 58; + public static final int ECHO_REQUEST = 128; public static final int ECHO_REPLY = 129; public static final int GROUP_QUERY = 130; @@ -17,24 +19,23 @@ public static final int FLAG_ROUTER = 0x80; public static final int FLAG_SOLICITED = 0x40; public static final int FLAG_OVERRIDE = 0x20; - + public static final String[] TYPE_NAME = new String[] { "ECHO_REQUEST", "ECHO_REPLY", "GROUP_QUERY", "GROUP_REPORT", "GROUP_REDUCTION", "ROUTER_SOLICITATION", "ROUTER_ADVERTISEMENT", "NEIGHBOR_SOLICITATION", "NEIGHBOR_ADVERTISEMENT"}; - + int type; int code; int checksum; byte[] targetAddress; - + int id; int seqNo; - - IPv6Packet ip; + int flags; - + public void printPacket(PrintStream out) { String typeS = "" + type; if (type >= 128) { @@ -53,42 +54,41 @@ /* ICMP can not have payload ?! */ } - public void setPacketData(Packet packet, byte[] data, int len) { - if (packet instanceof IPv6Packet) { - ip = (IPv6Packet) packet; - - if (ip.nextHeader == 58) - type = data[0] & 0xff; - code = data[1] & 0xff; - checksum = ((data[2] & 0xff) << 8) | data[3] & 0xff; + public void parsePacketData(IPv6Packet packet) { + if (packet.nextHeader == 58) { + type = packet.getData(0) & 0xff; + code = packet.getData(1) & 0xff; + checksum = ((packet.getData(2) & 0xff) << 8) | packet.getData(3) & 0xff; /* test the checksum ... - set checksum to zero*/ - data[2] = 0; - data[3] = 0; - + packet.setData(2, (byte) 0); + packet.setData(3, (byte) 0); + switch (type) { case ECHO_REQUEST: case ECHO_REPLY: - id = get16(data, 4); - seqNo = get16(data, 6); + id = packet.get16(4); + seqNo = packet.get16(6); break; case NEIGHBOR_SOLICITATION: case NEIGHBOR_ADVERTISEMENT: if (type == NEIGHBOR_ADVERTISEMENT) { - flags = data[4] & 0xff; + flags = packet.getData(4) & 0xff; } - targetAddress = getAddress(data, 8); + targetAddress = new byte[16]; + packet.copy(8, targetAddress, 0, 16); break; } - - int sum = ip.upperLayerHeaderChecksum(); + + int sum = packet.upperLayerHeaderChecksum(); + byte[] data = packet.getPayload(); + System.out.println("Payloadsize: " + data.length); sum = IPv6Packet.checkSum(sum, data, data.length); sum = (~sum) & 0xffff; if (sum == checksum) { System.out.println("ICMPv6: Checksum matches!!!"); } else { - System.out.printf("ICMPv6: Checksum error: %04x <?> %04x", checksum, sum); + System.out.printf("ICMPv6: Checksum error: %04x <?> %04x\n", checksum, sum); } } } - } Modified: mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-05 17:50:22 UTC (rev 519) +++ mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-14 16:04:08 UTC (rev 520) @@ -1,14 +1,16 @@ package se.sics.mspsim.net; -public class ICMP6PacketHandler extends AbstractPacketHandler { +public class ICMP6PacketHandler { - public void packetReceived(Packet container) { + IPStack ipStack; + + public ICMP6PacketHandler(IPStack stack) { + ipStack = stack; + } + + public void handlePacket(IPv6Packet packet) { ICMP6Packet icmpPacket = new ICMP6Packet(); - IPv6Packet ipv6 = (IPv6Packet) container; - container.setPayloadPacket(icmpPacket); - icmpPacket.containerPacket = container; - icmpPacket.setPacketData(container, container.getPayload(), - container.getPayload().length); + icmpPacket.parsePacketData(packet); /* handle packet - just a test for now */ switch (icmpPacket.type) { @@ -20,19 +22,11 @@ ICMP6Packet.FLAG_OVERRIDE; IPv6Packet ipp = new IPv6Packet(); - ipp.version = 6; - ipp.flowLabel = 0; - ipp.setPayloadPacket(p); ipp.nextHeader = IPv6Packet.ICMP6_DISPATCH; - - - // ipp.destAddress = ???; + // is this ok? + ipp.destAddress = packet.sourceAddress; + ipStack.sendPacket(ipp); break; } } - - public void sendPacket(Packet payload) { - /* ICMP does not carry payload ?? */ - } - } Modified: mspsim/se/sics/mspsim/net/IEEE802154Handler.java =================================================================== --- mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-05 17:50:22 UTC (rev 519) +++ mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-14 16:04:08 UTC (rev 520) @@ -40,18 +40,114 @@ package se.sics.mspsim.net; +import java.io.PrintStream; + public class IEEE802154Handler extends AbstractPacketHandler { - /* create a 802.15.4 packet with the given packet as payload, and - * deliver to the lower layer handler */ - public void sendPacket(Packet payload) { - } + public static final String SOURCE_PAN_ID = "802154.sourcePAN"; + public static final String SOURCE_MODE = "802154.sourceMode"; + public static final String DESTINATION_PAN_ID = "802154.destPAN"; + public static final String DESTINATION_MODE = "802154.destMode"; + + public static final String SEQ_NO = "802154.seqno"; + public static final String PAYLOAD_LEN = "802154.len"; + + public static final int SHORT_ADDRESS = 2; + public static final int LONG_ADDRESS = 3; + /* create a 802.15.4 packet of the bytes and "dispatch" to the * next handler */ public void packetReceived(Packet packet) { - IEEE802154Packet newPacket = new IEEE802154Packet(packet); +// IEEE802154Packet newPacket = new IEEE802154Packet(packet); /* no dispatch at this level ?! */ - dispatch(-1, newPacket); + + int type = packet.getData(0) & 7; + int security = (packet.getData(0) >> 3) & 1; + int pending = (packet.getData(0) >> 4) & 1; + int ackRequired = (packet.getData(0) >> 5) & 1; + int panCompression = (packet.getData(0)>> 6) & 1; + int destAddrMode = (packet.getData(1) >> 2) & 3; + int frameVersion = (packet.getData(1) >> 4) & 3; + int srcAddrMode = (packet.getData(1) >> 6) & 3; + int seqNumber = packet.getData(2); + + int pos = 3; + int destPanID = 0; + if (destAddrMode > 0) { + destPanID = (packet.getData(pos) & 0xff) + ((packet.getData(pos + 1) & 0xff) << 8); + packet.setAttribute(DESTINATION_PAN_ID, destPanID); + byte[] destAddress = null; + pos += 2; + if (destAddrMode == SHORT_ADDRESS) { + destAddress = new byte[2]; + destAddress[1] = packet.getData(pos); + destAddress[0] = packet.getData(pos + 1); + pos += 2; + } else if (destAddrMode == LONG_ADDRESS) { + destAddress = new byte[8]; + for (int i = 0; i < 8; i++) { + destAddress[i] = packet.getData(pos + 7 - i); + } + pos += 8; + } + packet.setAttribute(Packet.LL_DESTINATION, destAddress); + } + + if (srcAddrMode > 0) { + int srcPanID = 0; + if (panCompression == 0){ + srcPanID = (packet.getData(pos) & 0xff) + ((packet.getData(pos + 1) & 0xff) << 8); + pos += 2; + } else { + srcPanID = destPanID; + } + packet.setAttribute(SOURCE_PAN_ID, srcPanID); + byte[] sourceAddress = null; + if (srcAddrMode == SHORT_ADDRESS) { + sourceAddress = new byte[2]; + sourceAddress[1] = packet.getData(pos); + sourceAddress[0] = packet.getData(pos + 1); + pos += 2; + } else if (srcAddrMode == LONG_ADDRESS) { + sourceAddress = new byte[8]; + for (int i = 0; i < 8; i++) { + sourceAddress[i] = packet.getData(pos + 7 - i); + } + pos += 8; + } + packet.setAttribute(Packet.LL_SOURCE, sourceAddress); + } + packet.incPos(pos); + packet.setAttribute(PAYLOAD_LEN, packet.getPayloadLength()); + + dispatch(-1, packet); } + + /* create a 802.15.4 packet with the given packet as payload, and + * deliver to the lower layer handler */ + @Override + public void sendPacket(Packet payload) { + // TODO Auto-generated method stub + } + + public void printPacket(PrintStream out, Packet packet) { + out.printf("802.15.4 from %4x/", packet.getAttributeAsInt(SOURCE_PAN_ID)); + printAddress(out, packet.getAttributeAsInt(SOURCE_MODE), + (byte[]) packet.getAttribute(Packet.LL_SOURCE)); + out.printf(" to %4x/", packet.getAttributeAsInt(DESTINATION_PAN_ID)); + printAddress(out, packet.getAttributeAsInt(DESTINATION_MODE), + (byte[]) packet.getAttribute(Packet.LL_DESTINATION)); + out.printf(" seqNo: %d len: %d\n", packet.getAttributeAsInt(SEQ_NO), + packet.getAttributeAsInt(PAYLOAD_LEN)); + } + + private void printAddress(PrintStream out, int type, byte[] addr) { + if (type == SHORT_ADDRESS) { + out.printf("%02x02x", addr[0], addr[1]); + } else if (type == LONG_ADDRESS) { + out.printf("%02x02x:%02x02x:%02x02x:%02x02x", addr[0], addr[1], + addr[2], addr[3], addr[4], addr[5], addr[6], addr[7]); + } + } } Modified: mspsim/se/sics/mspsim/net/IEEE802154Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IEEE802154Packet.java 2009-05-05 17:50:22 UTC (rev 519) +++ mspsim/se/sics/mspsim/net/IEEE802154Packet.java 2009-05-14 16:04:08 UTC (rev 520) @@ -42,9 +42,9 @@ package se.sics.mspsim.net; import java.io.PrintStream; +/* remove */ +public class IEEE802154Packet { //extends AbstractPacket { -public class IEEE802154Packet extends AbstractPacket { - public static final int SHORT_ADDRESS = 2; public static final int LONG_ADDRESS = 3; @@ -65,10 +65,10 @@ private byte[] sourceAddress = new byte[8]; private int srcPanID; - public IEEE802154Packet(Packet container) { - byte[] payload = container.getPayload(); - setPacketData(container, payload, payload.length); - } +// public IEEE802154Packet(Packet container) { +// byte[] payload = container.getPayload(); +// setPacketData(container, payload, payload.length); +// } public IEEE802154Packet() { } @@ -94,20 +94,8 @@ return sourceAddress; } - public void printPacket(PrintStream out) { - out.printf("802.15.4 from %4x/", srcPanID); - printAddress(out, srcAddrMode, srcAddr); - out.printf(" to %4x/", destPanID); - printAddress(out, destAddrMode, destAddr); - out.printf(" seqNo: %d len: %d\n", seqNumber, payloadLen); - if (payloadPacket != null) { - payloadPacket.printPacket(out); - } - } public void setPacketData(Packet container, byte[] data, int len) { - container.setPayloadPacket(this); - containerPacket = container; type = data[0] & 7; security = (data[0] >> 3) & 1; @@ -166,14 +154,6 @@ pos += 8; } } - setPayload(data, pos, len - pos); +// setPayload(data, pos, len - pos); } - - private void printAddress(PrintStream out, int type, long addr) { - if (type == SHORT_ADDRESS) { - out.printf("%04x", addr & 0xffff); - } else if (type == LONG_ADDRESS) { - out.printf("%04x:%04x:%04x:%04x", (addr >> 48) & 0xffff, (addr >> 32) & 0xffff, (addr >> 16) & 0xffff, addr & 0xffff); - } - } } \ No newline at end of file Modified: mspsim/se/sics/mspsim/net/IPv6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-05 17:50:22 UTC (rev 519) +++ mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-14 16:04:08 UTC (rev 520) @@ -47,23 +47,37 @@ * @author joakim * */ -public class IPv6Packet extends AbstractPacket { +public class IPv6Packet extends Packet implements IPPacketer { public static final int ICMP6_DISPATCH = 58; int version; int trafficClass; int flowLabel; - int nextHeader; + byte nextHeader; int hopLimit; byte[] sourceAddress = new byte[16]; byte[] destAddress = new byte[16]; + int ipLen = 0; + int payloadLen = 0; + public IPv6Packet() { version = 6; flowLabel = 0; } + public IPv6Packet(Packet packet) { + version = 6; + flowLabel = 0; + // copy over all the data from the packet... + // is this the right way to do this??? + this.currentPos = packet.currentPos; + this.attributes = packet.attributes; + this.packetData = packet.packetData; + ipLen = packetData.length - currentPos; + } + public byte[] getSourceAddress() { return sourceAddress; } @@ -78,9 +92,6 @@ out.print(" to "); printAddress(out, destAddress); out.printf(" NxHdr: %d\n", nextHeader); - if (payloadPacket != null) { - payloadPacket.printPacket(out); - } } public static void printAddress(PrintStream out, byte[] address) { @@ -94,20 +105,23 @@ } /* this is for setting raw packet data */ - public void setPacketData(Packet container, byte[] data, int len) { - version = (data[0] & 0xff) >> 4; + public void parsePacketData(IPv6Packet packet) { + version = (packet.getData(0) & 0xff) >> 4; if (version != 6) { return; } - trafficClass = ((data[0] & 0x0f)<<4) + ((data[1] & 0xff) >> 4); - flowLabel = (data[1] & 0x0f) << 16 + (data[2] & 0xff) << 8 + - data[3] & 0xff; - payloadLen = ((data[4] & 0xff) << 8) + data[5]; - nextHeader = data[6]; - hopLimit = data[7]; - System.arraycopy(data, 8, sourceAddress, 0, 16); - System.arraycopy(data, 24, destAddress, 0, 16); - setPayload(data, 40, payloadLen); + trafficClass = ((packet.getData(0) & 0x0f)<<4) + + ((packet.getData(1) & 0xff) >> 4); + flowLabel = (packet.getData(1) & 0x0f) << 16 + + (packet.getData(2) & 0xff) << 8 + + packet.getData(3) & 0xff; + payloadLen = ((packet.getData(4) & 0xff) << 8) + packet.getData(5); + nextHeader = packet.getData(6); + hopLimit = packet.getData(7); + packet.copy(8, sourceAddress, 0, 16); + packet.copy(24, destAddress, 0, 16); + // move position 40 bytes forward for handling next headers / payload + packet.incPos(40); } public static long getLong(byte[] data, int pos) { @@ -167,7 +181,7 @@ } public boolean isSourceMACBased() { - byte[] macAddress = containerPacket.getSourceAddress(); + byte[] macAddress = getLinkSource(); return isMACBased(sourceAddress, macAddress); } @@ -178,8 +192,18 @@ /* how can we check this before we know the MAC address??? */ public boolean isDestinationMACBased() { - byte[] macAddress = containerPacket.getDestinationAddress(); + byte[] macAddress = getLinkDestination(); return isMACBased(destAddress, macAddress); } + public byte getDispatch() { + return nextHeader; + } + + @Override + public byte[] generatePacketData(IPv6Packet packet) { + // TODO Auto-generated method stub + return null; + } + } Modified: mspsim/se/sics/mspsim/net/LoWPANHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/LoWPANHandler.java 2009-05-05 17:50:22 UTC (rev 519) +++ mspsim/se/sics/mspsim/net/LoWPANHandler.java 2009-05-14 16:04:08 UTC (rev 520) @@ -41,19 +41,38 @@ public class LoWPANHandler extends AbstractPacketHandler { - public void packetReceived(Packet container) { - LoWPANPacket packet = new LoWPANPacket(container.getPayload()); - container.setPayloadPacket(packet); - packet.containerPacket = container; - dispatch(packet.dispatch, packet); + private IPStack ipStack; + + public LoWPANHandler(IPStack stack) { + ipStack = stack; } + + public void packetReceived(Packet packet) { + /* create IP packet based on the correct dispatch */ + IPv6Packet ipPacket = new IPv6Packet(packet); + int dispatch = packet.getData(0); + packet.setAttribute("6lowpan.dispatch", dispatch); + /* remove the dispatch and continue */ + ipPacket.incPos(1); + if (dispatch == ipStack.getDefaultPacketer().getDispatch()) { + ipStack.getDefaultPacketer().parsePacketData(ipPacket); + /* send in the packet */ + ipStack.receivePacket(ipPacket); + } + } - public void sendPacket(Packet payload) { + public void sendPacket(Packet packet) { /* LoWPANHandler is for IP over 802.15.4 */ - - if (payload instanceof IPv6Packet) { - // Assume HC01 compression for now... - IEEE802154Packet p = new IEEE802154Packet(); + if (packet instanceof IPv6Packet) { + // Get packeter and create packet + byte[] data = ipStack.getPacketer().generatePacketData((IPv6Packet)packet); + packet.setBytes(data); + /* set the dispatch */ + byte[] data2 = new byte[1]; + data2[0] = ipStack.getPacketer().getDispatch(); + packet.prependBytes(data2); + /* give to lower layer for sending on... */ + lowerLayer.sendPacket(packet); } } Modified: mspsim/se/sics/mspsim/net/Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/Packet.java 2009-05-05 17:50:22 UTC (rev 519) +++ mspsim/se/sics/mspsim/net/Packet.java 2009-05-14 16:04:08 UTC (rev 520) @@ -41,21 +41,132 @@ package se.sics.mspsim.net; -import java.io.PrintStream; +import java.util.HashMap; -public interface Packet { +public class Packet { + + public static final String LL_SOURCE = "link.source"; + public static final String LL_DESTINATION = "link.destination"; - /** - * @return payload of the packet - */ - public byte[] getPayload(); - public byte[] getSourceAddress(); - public byte[] getDestinationAddress(); - void setPayloadPacket(Packet packet); - void setContainerPacket(Packet packet); - Packet getPayloadPacket(); - Packet getContainerPacket(); + protected HashMap<String, Object> attributes = new HashMap<String, Object>(); + + /* this is the packet data array */ + protected byte[] packetData; + /* current position of packet data cursor */ + int currentPos = 0; + + public void setBytes(byte[] data) { + packetData = data; + currentPos = 0; + } - public void printPacket(PrintStream out); + public void setBytes(byte[] data, int startPos, int len) { + byte[] payload = new byte[len]; + System.arraycopy(data, startPos, payload, 0, len); + packetData = payload; + /* reset cursor in this case !!! */ + currentPos = 0; + } + public void appendBytes(byte[] data) { + if (packetData == null) { + packetData = data; + } else { + setPacketData(packetData, data); + } + } + + public void prependBytes(byte[] data) { + if (packetData == null) { + packetData = data; + } else { + setPacketData(data, packetData); + } + } + + private void setPacketData(byte[] data1, byte[] data2) { + byte[] newData = new byte[data1.length + data2.length]; + System.arraycopy(data1, 0, newData, 0, data1.length); + System.arraycopy(data2, 0, newData, data1.length, data2.length); + packetData = newData; + } + + public byte[] getBytes() { + return packetData; + } + + /* total packet length */ + public int getTotalLength() { + return packetData.length; + } + + /* called when headers are parsed to get current payload lenght + * only useful when parsing messages... */ + public int getPayloadLength() { + return packetData.length - currentPos; + } + + public void setAttribute(String name, Object object) { + attributes.put(name, object); + } + + public Object getAttribute(String name) { + return attributes.get(name); + } + + public byte[] getLinkSource() { + return (byte[]) attributes.get(LL_SOURCE); + } + + public byte[] getLinkDestination() { + return (byte[]) attributes.get(LL_DESTINATION); + } + + public int get32(int pos) { + pos = currentPos + pos; + if (packetData.length > pos + 3) + return ((packetData[pos] & 0xff) << 24) | ((packetData[pos++] & 0xff) << 16) | + ((packetData[pos] & 0xff) << 8) | (packetData[pos + 1] & 0xff); + return 0; + } + + public int get16(int pos) { + pos = currentPos + pos; + if (packetData.length > pos + 1) + return ((packetData[pos] & 0xff) << 8) | packetData[pos + 1] & 0xff; + return 0; + } + + public byte getData(int pos) { + return packetData[currentPos + pos]; + } + + public void incPos(int delta) { + currentPos += delta; + } + + public byte[] getPayload() { + // payload is from pos to end... + byte[] payload = new byte[packetData.length - currentPos]; + System.arraycopy(packetData, currentPos, payload, 0, payload.length); + return payload; + } + + public int getAttributeAsInt(String attr) { + Object val = attributes.get(attr); + if (val instanceof Integer) return ((Integer)val).intValue(); + if (val instanceof String) return Integer.parseInt((String) val); + return -1; + } + + /* copies bytes from currentPos + pos to the given array */ + public void copy(int pos, byte[] dst, int dstPos, int len) { + // TODO Auto-generated method stub + int tPos = pos + currentPos; + System.arraycopy(packetData, tPos, dst, dstPos, len); + } + + public void setData(int pos, byte val) { + packetData[currentPos + pos] = val; + } } \ No newline at end of file Modified: mspsim/se/sics/mspsim/net/PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/PacketHandler.java 2009-05-05 17:50:22 UTC (rev 519) +++ mspsim/se/sics/mspsim/net/PacketHandler.java 2009-05-14 16:04:08 UTC (rev 520) @@ -5,6 +5,6 @@ public void addUpperLayerHandler(int protoID,PacketHandler handler); public void setLowerLayerHandler(PacketHandler handler); public void packetReceived(Packet container); - public void sendPacket(Packet payload); + public void sendPacket(Packet packet); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-05 17:50:44
|
Revision: 519 http://mspsim.svn.sourceforge.net/mspsim/?rev=519&view=rev Author: joxe Date: 2009-05-05 17:50:22 +0000 (Tue, 05 May 2009) Log Message: ----------- bugfix of CALL instruction thanks to Klaus Stengel Modified Paths: -------------- mspsim/se/sics/mspsim/core/MSP430Core.java Modified: mspsim/se/sics/mspsim/core/MSP430Core.java =================================================================== --- mspsim/se/sics/mspsim/core/MSP430Core.java 2009-04-30 21:31:13 UTC (rev 518) +++ mspsim/se/sics/mspsim/core/MSP430Core.java 2009-05-05 17:50:22 UTC (rev 519) @@ -857,8 +857,9 @@ int ad = (instruction >> 4) & 3; int nxtCarry = 0; op = instruction & 0xff80; - if (op == PUSH) { - // The PUSH operation increase the SP before address resolution! + if (op == PUSH || op == CALL) { + // The PUSH and CALL operations increase the SP before + // address resolution! // store on stack - always move 2 steps (W) even if B./ sp = readRegister(SP) - 2; writeRegister(SP, sp); @@ -972,10 +973,7 @@ updateStatus = false; break; case CALL: - // store current PC on stack... (current PC points to next instr.) - sp = readRegister(SP) - 2; - writeRegister(SP, sp); - + // store current PC on stack. (current PC points to next instr.) pc = readRegister(PC); memory[sp] = pc & 0xff; memory[sp + 1] = pc >> 8; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2009-04-30 21:31:34
|
Revision: 518 http://mspsim.svn.sourceforge.net/mspsim/?rev=518&view=rev Author: nifi Date: 2009-04-30 21:31:13 +0000 (Thu, 30 Apr 2009) Log Message: ----------- fixed compiler warning for Sun API Modified Paths: -------------- mspsim/se/sics/mspsim/net/HC01PacketHandler.java Modified: mspsim/se/sics/mspsim/net/HC01PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01PacketHandler.java 2009-04-30 15:30:28 UTC (rev 517) +++ mspsim/se/sics/mspsim/net/HC01PacketHandler.java 2009-04-30 21:31:13 UTC (rev 518) @@ -42,11 +42,7 @@ */ package se.sics.mspsim.net; - -import org.jfree.util.ArrayUtilities; - import se.sics.mspsim.util.Utils; -import sun.java2d.SunGraphicsEnvironment.TTFilter; public class HC01PacketHandler extends AbstractPacketHandler { /* @@ -570,4 +566,4 @@ } return -1; } -} \ No newline at end of file +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-04-30 15:30:29
|
Revision: 517 http://mspsim.svn.sourceforge.net/mspsim/?rev=517&view=rev Author: joxe Date: 2009-04-30 15:30:28 +0000 (Thu, 30 Apr 2009) Log Message: ----------- added more ot changelog Modified Paths: -------------- mspsim/CHANGE_LOG.txt Modified: mspsim/CHANGE_LOG.txt =================================================================== --- mspsim/CHANGE_LOG.txt 2009-04-30 15:18:33 UTC (rev 516) +++ mspsim/CHANGE_LOG.txt 2009-04-30 15:30:28 UTC (rev 517) @@ -6,6 +6,7 @@ - added profiling of interrupts - added verification of MAGIC init bytes in ELF files - fixed multiplicator (submitted patch) +- added support for flash - several bugfixes for emulation core (instruction emulation) - made call logger configurable for hide of selected calls - fixed some cycle timing bugs of instruction set execution This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-04-30 15:18:34
|
Revision: 516 http://mspsim.svn.sourceforge.net/mspsim/?rev=516&view=rev Author: joxe Date: 2009-04-30 15:18:33 +0000 (Thu, 30 Apr 2009) Log Message: ----------- updated changelog for new release Modified Paths: -------------- mspsim/CHANGE_LOG.txt Modified: mspsim/CHANGE_LOG.txt =================================================================== --- mspsim/CHANGE_LOG.txt 2009-04-30 09:21:05 UTC (rev 515) +++ mspsim/CHANGE_LOG.txt 2009-04-30 15:18:33 UTC (rev 516) @@ -1,4 +1,13 @@ 0.97 +- fixed bug on SFR interrupt handling +- added initial support for printing IPv6 packets (HC01) from CC2420 +- added CLI commands for adding rflisteners and analyser +- added warning for too large packets in CC2420 +- added profiling of interrupts +- added verification of MAGIC init bytes in ELF files +- fixed multiplicator (submitted patch) +- several bugfixes for emulation core (instruction emulation) +- made call logger configurable for hide of selected calls - fixed some cycle timing bugs of instruction set execution - added stack trace for misalignment warnings if MSP430 Core is in log mode - added MSP430 Core as a loggable This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-04-30 09:21:17
|
Revision: 515 http://mspsim.svn.sourceforge.net/mspsim/?rev=515&view=rev Author: joxe Date: 2009-04-30 09:21:05 +0000 (Thu, 30 Apr 2009) Log Message: ----------- fixed bug on SFR based interrupts Modified Paths: -------------- mspsim/se/sics/mspsim/core/MSP430Core.java mspsim/se/sics/mspsim/core/SFR.java mspsim/se/sics/mspsim/core/USART.java Modified: mspsim/se/sics/mspsim/core/MSP430Core.java =================================================================== --- mspsim/se/sics/mspsim/core/MSP430Core.java 2009-04-29 17:35:15 UTC (rev 514) +++ mspsim/se/sics/mspsim/core/MSP430Core.java 2009-04-30 09:21:05 UTC (rev 515) @@ -330,6 +330,9 @@ reg[r] = value; if (r == SR) { boolean oldCpuOff = cpuOff; +// if (((value & GIE) == GIE) != interruptsEnabled) { +// System.out.println("InterruptEnabled changed: " + !interruptsEnabled); +// } interruptsEnabled = ((value & GIE) == GIE); cpuOff = ((value & CPUOFF) == CPUOFF); if (cpuOff != oldCpuOff) { @@ -568,7 +571,7 @@ if (triggerIR) { interruptSource[interrupt] = source; - if (debugInterrupts) { + if (debugInterrupts ) { if (source != null) { System.out.println("### Interrupt flagged ON by " + source.getName() + " prio: " + interrupt); } else { @@ -1352,4 +1355,8 @@ map.setEntry(function); return function; } + + public int getPC() { + return reg[PC]; + } } Modified: mspsim/se/sics/mspsim/core/SFR.java =================================================================== --- mspsim/se/sics/mspsim/core/SFR.java 2009-04-29 17:35:15 UTC (rev 514) +++ mspsim/se/sics/mspsim/core/SFR.java 2009-04-30 09:21:05 UTC (rev 515) @@ -67,6 +67,8 @@ private SFRModule[] sfrModule = new SFRModule[16]; private int[] irqVector = new int[16]; + private boolean[] irqTriggered = new boolean[16]; + private int[] irqTriggeredPos = new int[16]; public SFR(MSP430Core cpu, int[] memory) { super(memory, 0); @@ -81,6 +83,9 @@ ifg2 = 0; me1 = 0; me2 = 0; + for (int i = 0; i < irqTriggered.length; i++) { + irqTriggered[i] = false; + } } /* reg = 0/1 @@ -189,11 +194,17 @@ pos = pos * 8; for (int i = 0; i < 8; i++) { if ((change & 1) == 1) { - if (sfrModule[pos] != null) { + if (sfrModule[pos] != null && !irqTriggered[irqVector[pos]]) { /* interrupt goes directly to the module responsible */ if (DEBUG) System.out.println("SFR: flagging interrupt: " + - sfrModule[pos].getName() + " " + (ie & ifg & 1)); - cpu.flagInterrupt(irqVector[pos], sfrModule[pos], (ie & ifg & 1) > 0); + sfrModule[pos].getName() + " pos: " + pos + " " + (ie & ifg & 1) + " chg: " + change); + if ((ie & ifg & 1) > 0) { + int vector = irqVector[pos]; + irqTriggered[vector] = true; + irqTriggeredPos[vector] = pos; + cpu.flagInterrupt(irqVector[pos], this, true); + } + // cpu.flagInterrupt(irqVector[pos], sfrModule[pos], (ie & ifg & 1) > 0); } } pos++; @@ -231,8 +242,20 @@ else return ifg2; } - /* nothing should go here */ public void interruptServiced(int vector) { + irqTriggered[vector] = false; + /* clear the bits that correspond to this vector! */ + int pos = irqTriggeredPos[vector]; + int bit = pos & 7; + if (pos > 8) { + ifg1 &= ~(1 << bit); + } else { + ifg2 &= ~(1 << bit); + } + cpu.flagInterrupt(vector, this, false); + if (sfrModule[pos] != null) { + sfrModule[pos].interruptServiced(vector); + } } public String getName() { Modified: mspsim/se/sics/mspsim/core/USART.java =================================================================== --- mspsim/se/sics/mspsim/core/USART.java 2009-04-29 17:35:15 UTC (rev 514) +++ mspsim/se/sics/mspsim/core/USART.java 2009-04-30 09:21:05 UTC (rev 515) @@ -86,6 +86,7 @@ private int utxifg; private int urxifg; + private int rxVector; private int clockSource = 0; private int baudRate = 0; @@ -137,19 +138,21 @@ utxifg = UTXIFG0; urxifg = URXIFG0; txbit = USART0_TX_BIT; + rxVector = USART0_RX_VEC; } else { sfr.registerSFDModule(1, USART1_RX_BIT, this, USART1_RX_VEC); sfr.registerSFDModule(1, USART1_TX_BIT, this, USART1_TX_VEC); utxifg = UTXIFG1; urxifg = URXIFG1; txbit = USART1_TX_BIT; + rxVector = USART1_RX_VEC; } reset(0); } public void reset(int type) { - nextTXReady = cpu.cycles + 1000; + nextTXReady = cpu.cycles + 100; nextTXByte = -1; clrBitIFG(utxifg | urxifg); utctl |= UTCTL_TXEMPTY; @@ -287,7 +290,7 @@ // When byte is read - the interruptflag is cleared! // and error status should also be cleared later... if (MSP430Constants.DEBUGGING_LEVEL > 0) { - System.out.println(getName() + " clearing rx interrupt flag"); + System.out.println(getName() + " clearing rx interrupt flag " + cpu.getPC()); } clrBitIFG(urxifg); if (listener != null) { @@ -332,7 +335,8 @@ // We should add "Interrupt serviced..." to indicate that its latest // Interrupt was serviced... public void interruptServiced(int vector) { - cpu.flagInterrupt(vector, this, false); + /* NOTE: this is handled by SFR : clear IFG bit if interrupt is serviced */ +// System.out.println("SFR irq"); } private void handleTransmit(long cycles) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-04-29 17:35:30
|
Revision: 514 http://mspsim.svn.sourceforge.net/mspsim/?rev=514&view=rev Author: joxe Date: 2009-04-29 17:35:15 +0000 (Wed, 29 Apr 2009) Log Message: ----------- patch for multiplicator fixed Modified Paths: -------------- mspsim/se/sics/mspsim/core/Multiplier.java Modified: mspsim/se/sics/mspsim/core/Multiplier.java =================================================================== --- mspsim/se/sics/mspsim/core/Multiplier.java 2009-04-23 15:28:15 UTC (rev 513) +++ mspsim/se/sics/mspsim/core/Multiplier.java 2009-04-29 17:35:15 UTC (rev 514) @@ -161,15 +161,15 @@ op2 = op2 > 0x8000 ? op2 - 0x10000 : op2; } - long res = op1 * op2; + long res = (long) op1 * (long) op2; if (DEBUG) System.out.println("O1:" + op1 + " * " + op2 + " = " + res); if (signed) { sumext = res < 0 ? 0xffff : 0; } - if (accumulating) { - res += (resHi << 16) + resLo; + if (accumulating) { + res += ((long) resHi << 16) + resLo; if (!signed && res > 0xffffffff) { sumext = 1; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-04-23 15:28:45
|
Revision: 513 http://mspsim.svn.sourceforge.net/mspsim/?rev=513&view=rev Author: joxe Date: 2009-04-23 15:28:15 +0000 (Thu, 23 Apr 2009) Log Message: ----------- added check on negative profiler stack pointer Modified Paths: -------------- mspsim/se/sics/mspsim/util/SimpleProfiler.java Modified: mspsim/se/sics/mspsim/util/SimpleProfiler.java =================================================================== --- mspsim/se/sics/mspsim/util/SimpleProfiler.java 2009-04-20 16:15:46 UTC (rev 512) +++ mspsim/se/sics/mspsim/util/SimpleProfiler.java 2009-04-23 15:28:15 UTC (rev 513) @@ -129,6 +129,11 @@ } public void profileReturn(long cycles) { + if (cSP <= 0) { + /* the stack pointer might have been messed with? */ + logger.println("SimpleProfiler: Too many returns?"); + return; + } CallEntry cspEntry = callStack[--cSP]; MapEntry fkn = cspEntry.function; // System.out.println("Profiler: return / call stack: " + cSP + ", " + fkn); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |