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-06-09 22:27:59
|
Revision: 562 http://mspsim.svn.sourceforge.net/mspsim/?rev=562&view=rev Author: joxe Date: 2009-06-09 22:27:22 +0000 (Tue, 09 Jun 2009) Log Message: ----------- fixed debug printouts for easier debgging of ACK and seqno Modified Paths: -------------- mspsim/se/sics/mspsim/net/TCPConnection.java mspsim/se/sics/mspsim/net/TCPHandler.java mspsim/se/sics/mspsim/net/TCPInputStream.java mspsim/se/sics/mspsim/net/TCPPacket.java Modified: mspsim/se/sics/mspsim/net/TCPConnection.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPConnection.java 2009-06-07 21:56:32 UTC (rev 561) +++ mspsim/se/sics/mspsim/net/TCPConnection.java 2009-06-09 22:27:22 UTC (rev 562) @@ -20,6 +20,7 @@ public static final int TIME_WAIT = 10; public static final long TIME_WAIT_MILLIS = 1000; + private static final int OUT_BUFFER = 128; // my port & IP (IP can be null here...) int localPort; @@ -45,9 +46,11 @@ long lastSendTime; - private byte[] outgoingBuffer; - int bufFirst = 0; - int bufLast = 0; + private byte[] outgoingBuffer = new byte[OUT_BUFFER]; + int bufPos = 0; + int bufNextEmpty = 0; + /* sentUnack == bufPos */ + private TCPInputStream inputStream; private TCPOutputStream outputStream; @@ -103,26 +106,80 @@ IPv6Packet packet = new IPv6Packet(tcpPacket, localIP, externalIP); tcpPacket.seqNo = sendNext; if (tcpPacket.payload != null) { + copyToBuffer(tcpPacket.payload); sendNext += tcpPacket.payload.length; } lastSendTime = System.currentTimeMillis(); tcpPacket.printPacket(System.out); ipStack.sendPacket(packet, netInterface); } + + private int outSize() { + int bytesToSend = bufNextEmpty - bufPos; + if (bytesToSend < 0) bytesToSend = -bytesToSend; + return bytesToSend; + } - void receive(TCPPacket tcpPacket) { + private synchronized void copyToBuffer(byte[] data) { + int empty = outgoingBuffer.length - outSize(); + while (empty < data.length) { + /* need to block this tread until data is available...*/ + try { + wait(1000); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return; + } + empty = outgoingBuffer.length - outSize(); + } + } + + private synchronized void resend() { + int size = outSize(); + if (outSize() < size) size = outSize(); + byte[] data = new byte[size]; + int pos = bufPos; + for (int i = 0; i < data.length; i++) { + data[i] = outgoingBuffer[pos++]; + if (pos >= outgoingBuffer.length) { + pos = 0; + } + } + + System.out.println("**** TCPConnection resending data"); + + TCPPacket tcpPacket = createPacket(); + IPv6Packet packet = new IPv6Packet(tcpPacket, localIP, externalIP); + tcpPacket.seqNo = sentUnack; + tcpPacket.payload = data; + lastSendTime = System.currentTimeMillis(); + tcpPacket.printPacket(System.out); + ipStack.sendPacket(packet, netInterface); + } + + synchronized void receive(TCPPacket tcpPacket) { int plen = tcpPacket.payload == null ? 0 : tcpPacket.payload.length; if (tcpPacket.isAck()) { /* check if correct ack - we are only sending a packet a time... */ if (sendNext == tcpPacket.ackNo) { /* no more unacked data */ + int noAcked = tcpPacket.ackNo - sentUnack; sentUnack = tcpPacket.ackNo; + bufPos += noAcked; + System.out.println("ACK for " + noAcked + " bytes... pos: " + bufPos + + " nxtE:" + bufNextEmpty); + notify(); /* this means that we can send more data !!*/ } else { System.out.println("TCPHandler: Unexpected ACK no: " + Integer.toString(tcpPacket.ackNo, 16) + - " sendNext: " + Integer.toString(sendNext, 16)); + " sendNext: " + Integer.toString(sendNext, 16) + " sentUnack: " + + Integer.toString(sentUnack,16)); + if (tcpPacket.ackNo == sentUnack) { + resend(); + } } } @@ -144,18 +201,19 @@ tcpListener.connectionClosed(this); } } - - - /* ack the new data! - this could be done from the connection itself!!*/ - TCPPacket tcpReply = TCPHandler.createAck(tcpPacket, 0); - tcpReply.ackNo = tcpPacket.seqNo + plen; - tcpReply.seqNo = sendNext; - - send(tcpReply); - if (plen > 0) - if (tcpListener != null) { - tcpListener.tcpDataReceived(this, tcpPacket); + /* only ack if new data arrived! */ + if (plen > 0) { + /* ack the new data! - this could be done from the connection itself!!*/ + TCPPacket tcpReply = TCPHandler.createAck(tcpPacket, 0); + tcpReply.ackNo = tcpPacket.seqNo + plen; + tcpReply.seqNo = sendNext; + + send(tcpReply); + + if (tcpListener != null) { + tcpListener.tcpDataReceived(this, tcpPacket); + } } } Modified: mspsim/se/sics/mspsim/net/TCPHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPHandler.java 2009-06-07 21:56:32 UTC (rev 561) +++ mspsim/se/sics/mspsim/net/TCPHandler.java 2009-06-09 22:27:22 UTC (rev 562) @@ -73,12 +73,6 @@ } break; case TCPConnection.ESTABLISHED: - /* we should check if we have acked the last data from the other */ - if (tcpPacket.isAck() && - (tcpPacket.payload == null || tcpPacket.payload.length == 0)) { - return; - } - if (tcpPacket.isFin()) { connection.state = TCPConnection.CLOSE_WAIT; } @@ -142,7 +136,7 @@ switch (connection.state) { case TCPConnection.CLOSE_WAIT: /* if nothing in buffer - close it! */ - if (connection.bufFirst == connection.bufLast) { + if (connection.bufPos == connection.bufNextEmpty) { System.out.println("Closing - sending FIN"); TCPPacket packet = connection.createPacket(); packet.flags |= TCPPacket.FIN; Modified: mspsim/se/sics/mspsim/net/TCPInputStream.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPInputStream.java 2009-06-07 21:56:32 UTC (rev 561) +++ mspsim/se/sics/mspsim/net/TCPInputStream.java 2009-06-09 22:27:22 UTC (rev 562) @@ -44,7 +44,6 @@ } private synchronized void notifyReader() { - System.out.println("Notifying reader..."); notify(); } Modified: mspsim/se/sics/mspsim/net/TCPPacket.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPPacket.java 2009-06-07 21:56:32 UTC (rev 561) +++ mspsim/se/sics/mspsim/net/TCPPacket.java 2009-06-09 22:27:22 UTC (rev 562) @@ -159,7 +159,6 @@ } if (data.length - (offset * 4) > 0) { int len = data.length - (offset * 4); - System.out.println("TCPPacket: offset: " + offset + " => p-len: " + len); payload = new byte[len]; System.arraycopy(data, (offset * 4), payload, 0, len); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-06-07 21:56:45
|
Revision: 561 http://mspsim.svn.sourceforge.net/mspsim/?rev=561&view=rev Author: joxe Date: 2009-06-07 21:56:32 +0000 (Sun, 07 Jun 2009) Log Message: ----------- fixed better debug printout for TCP Modified Paths: -------------- mspsim/se/sics/mspsim/net/HC01Packeter.java mspsim/se/sics/mspsim/net/IPStack.java mspsim/se/sics/mspsim/net/TCPConnection.java mspsim/se/sics/mspsim/net/TCPHandler.java mspsim/se/sics/mspsim/net/TCPInputStream.java mspsim/se/sics/mspsim/net/TCPOutputStream.java mspsim/se/sics/mspsim/net/TCPPacket.java Modified: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-06-07 19:18:29 UTC (rev 560) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-06-07 21:56:32 UTC (rev 561) @@ -242,8 +242,8 @@ } /* destination compression */ - //System.out.print("isMulticastCompressable?: "); - IPv6Packet.printAddress(System.out, packet.destAddress); + // System.out.print("isMulticastCompressable?: "); + // IPv6Packet.printAddress(System.out, packet.destAddress); if(packet.isMulticastDestination()) { /* Address is multicast, try to compress */ Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-06-07 19:18:29 UTC (rev 560) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-06-07 21:56:32 UTC (rev 561) @@ -309,7 +309,6 @@ /* is the packet for me ? */ private boolean isForMe(byte[] address) { - IPv6Packet.printAddress(System.out, address); if (Utils.equals(myIPAddress, address) || Utils.equals(myLocalIPAddress, address) || Utils.equals(myLocalSolicited, address)) return true; Modified: mspsim/se/sics/mspsim/net/TCPConnection.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPConnection.java 2009-06-07 19:18:29 UTC (rev 560) +++ mspsim/se/sics/mspsim/net/TCPConnection.java 2009-06-07 21:56:32 UTC (rev 561) @@ -106,13 +106,12 @@ sendNext += tcpPacket.payload.length; } lastSendTime = System.currentTimeMillis(); - packet.printPacket(System.out); + tcpPacket.printPacket(System.out); ipStack.sendPacket(packet, netInterface); } void receive(TCPPacket tcpPacket) { int plen = tcpPacket.payload == null ? 0 : tcpPacket.payload.length; - receiveNext = tcpPacket.seqNo + plen; if (tcpPacket.isAck()) { /* check if correct ack - we are only sending a packet a time... */ @@ -130,10 +129,15 @@ if (receiveNext == tcpPacket.seqNo) { //System.out.println("TCPHandler: data received ok!!!"); } else { - System.out.println("TCPHandler: seqNo error: receiveNext: " + - receiveNext + " != seqNo: " + tcpPacket.seqNo); + /* error - did we miss a packet??? */ + System.out.println("TCPHandler: seq error: expSeq: " + + Integer.toString(receiveNext, 16) + " != seqNo: " + + Integer.toString(tcpPacket.seqNo, 16)); } + /* update what to expect next - after this packet! */ + receiveNext = tcpPacket.seqNo + plen; + if (tcpPacket.isFin()) { if (tcpListener != null && plen > 0) { /* notify app that the other side is closing... */ @@ -147,11 +151,6 @@ tcpReply.ackNo = tcpPacket.seqNo + plen; tcpReply.seqNo = sendNext; -// // just to test replying.... -// if (tcpPacket.payload != null && tcpPacket.payload.length > 2) { -// tcpReply.payload = "MSPSim>".getBytes(); -// } -// System.out.println("TCPHandler: Sending ACK"); send(tcpReply); if (plen > 0) @@ -180,6 +179,5 @@ tcpPacket.sourcePort = localPort; tcpPacket.destinationPort = externalPort; return tcpPacket; - } - -} + } +} \ No newline at end of file Modified: mspsim/se/sics/mspsim/net/TCPHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPHandler.java 2009-06-07 19:18:29 UTC (rev 560) +++ mspsim/se/sics/mspsim/net/TCPHandler.java 2009-06-07 21:56:32 UTC (rev 561) @@ -44,7 +44,6 @@ if (connection == null) { System.out.println("TCPHandler: can not find active or listen connection for this packet"); } else { - System.out.println("TCPHandler: found listen connection!!!"); if ((tcpPacket.flags & TCPPacket.SYN) > 0) { TCPPacket tcpReply = createAck(tcpPacket, TCPPacket.SYN); TCPConnection tc = new TCPConnection(ipStack, packet.netInterface); @@ -60,14 +59,12 @@ addConnection(tc); tcpReply.ackNo = tcpPacket.seqNo + 1; - System.out.println("TCPHandler: Sending: " + tcpReply); tc.send(tcpReply); tc.sentUnack = tc.sendNext = tc.sendNext + 1; connection.newConnection(tc); } } } else { - System.out.println("TCPHandler: found connection!!!"); switch(connection.state) { case TCPConnection.SYN_RECEIVED: if (tcpPacket.isAck()) { Modified: mspsim/se/sics/mspsim/net/TCPInputStream.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPInputStream.java 2009-06-07 19:18:29 UTC (rev 560) +++ mspsim/se/sics/mspsim/net/TCPInputStream.java 2009-06-07 21:56:32 UTC (rev 561) @@ -17,8 +17,6 @@ } public void newConnection(TCPConnection connection) {} public void tcpDataReceived(TCPConnection source, TCPPacket packet) { - System.out.println("TCP Data received to input stream "); - byte[] payload = packet.payload; if (payload == null || payload.length == 0) return; @@ -66,11 +64,9 @@ return -1; } if (firstByte == nextEmpty) { - System.out.println("InputStream Reader: Nothing in buffer while reading - going to wait..."); synchronized(this) { try { wait(); - System.out.println("InputStream Reader: Data in buffer: " + available()); } catch (InterruptedException e) { e.printStackTrace(); } Modified: mspsim/se/sics/mspsim/net/TCPOutputStream.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPOutputStream.java 2009-06-07 19:18:29 UTC (rev 560) +++ mspsim/se/sics/mspsim/net/TCPOutputStream.java 2009-06-07 21:56:32 UTC (rev 561) @@ -19,7 +19,7 @@ throw new IOException("TCP connection not open state: " + connection.state); } output[pos++] = (byte) (data & 0xff); - + /* oops, the buffer is full... - send packet immediately */ if (pos == output.length) { flush(); @@ -27,7 +27,6 @@ } public synchronized void flush() throws IOException { - System.out.println("TCP Output stream: Sending TCP buffer!!!!"); byte[] buffer = new byte[pos]; for (int i = 0; i < pos; i++) { buffer[i] = output[i]; Modified: mspsim/se/sics/mspsim/net/TCPPacket.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPPacket.java 2009-06-07 19:18:29 UTC (rev 560) +++ mspsim/se/sics/mspsim/net/TCPPacket.java 2009-06-07 21:56:32 UTC (rev 561) @@ -169,15 +169,19 @@ * @see se.sics.mspsim.net.IPPayload#printPacket(java.io.PrintStream) */ public void printPacket(PrintStream out) { - out.println("TCP Packet: srcPort: " + sourcePort + - " dstPort: " + destinationPort + " Flags: " + Utils.hex8(flags)); - out.println("SeqNo: " + seqNo + " AckNo: " + ackNo); + out.print("[TCP " + sourcePort + + " -> " + destinationPort + " Flag: " + Utils.hex8(flags) + + " seq: " + Integer.toString(seqNo, 16) + + " ack:" + Integer.toString(ackNo, 16)); if (payload != null) { - for (int i = 0; i < payload.length; i++) { + System.out.print("|"); + int len = 8; + if (payload.length < len) len = payload.length; + for (int i = 0; i < len; i++) { out.print((char) payload[i]); } - System.out.println(); } + System.out.println("]"); } public TCPPacket replyPacket() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-06-07 19:18:46
|
Revision: 560 http://mspsim.svn.sourceforge.net/mspsim/?rev=560&view=rev Author: joxe Date: 2009-06-07 19:18:29 +0000 (Sun, 07 Jun 2009) Log Message: ----------- TCPOutoutstream / inputstream Modified Paths: -------------- mspsim/se/sics/mspsim/net/HC01Packeter.java mspsim/se/sics/mspsim/net/IPStack.java mspsim/se/sics/mspsim/net/TCPConnection.java mspsim/se/sics/mspsim/net/TCPHandler.java mspsim/se/sics/mspsim/net/TCPPacket.java Added Paths: ----------- mspsim/se/sics/mspsim/net/TCPInputStream.java mspsim/se/sics/mspsim/net/TCPOutputStream.java Modified: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-06-07 13:12:32 UTC (rev 559) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-06-07 19:18:29 UTC (rev 560) @@ -242,7 +242,7 @@ } /* destination compression */ - System.out.print("isMulticastCompressable?: "); + //System.out.print("isMulticastCompressable?: "); IPv6Packet.printAddress(System.out, packet.destAddress); if(packet.isMulticastDestination()) { @@ -514,7 +514,7 @@ 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)); + //System.out.println("*** Multicast address!!! HC01: " + packet.getData(pos) + "," + packet.getData(pos + 1)); Utils.fill(packet.destAddress, 0, 16, (byte)0); packet.destAddress[0] = (byte) 0xff; packet.destAddress[1] = (byte)(((packet.getData(pos) & 0xff) >> 1) & 0x0F); Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-06-07 13:12:32 UTC (rev 559) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-06-07 19:18:29 UTC (rev 560) @@ -239,9 +239,11 @@ } public void receivePacket(IPv6Packet packet) { - System.out.println("IPv6 packet received!"); - packet.printPacket(System.out); - + if (DEBUG) { + System.out.println("IPv6 packet received!"); + packet.printPacket(System.out); + } + if (isForMe(packet.getDestinationAddress())){ if (DEBUG) System.out.println("#### PACKET FOR ME!!! " + packet.getDispatch()); switch (packet.nextHeader) { Modified: mspsim/se/sics/mspsim/net/TCPConnection.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPConnection.java 2009-06-07 13:12:32 UTC (rev 559) +++ mspsim/se/sics/mspsim/net/TCPConnection.java 2009-06-07 19:18:29 UTC (rev 560) @@ -1,5 +1,8 @@ package se.sics.mspsim.net; +import java.io.InputStream; +import java.io.OutputStream; + import se.sics.mspsim.util.Utils; public class TCPConnection { @@ -45,14 +48,36 @@ private byte[] outgoingBuffer; int bufFirst = 0; int bufLast = 0; + private TCPInputStream inputStream; + private TCPOutputStream outputStream; TCPConnection(IPStack stack, NetworkInterface nIf) { ipStack = stack; netInterface = nIf; } + public InputStream getInputStream() { + if (inputStream == null) { + inputStream = new TCPInputStream(this); + /* steal the listener... */ + tcpListener = inputStream.listener; + } + return inputStream; + } + + public OutputStream getOutputStream() { + if (outputStream == null) { + outputStream = new TCPOutputStream(this); + } + return outputStream; + } + public void setTCPListener(TCPListener listener) { - tcpListener = listener; + if (tcpListener == null) { + tcpListener = listener; + } else { + throw new IllegalStateException("TCPListener already set: " + tcpListener); + } } public void newConnection(TCPConnection c) { @@ -81,7 +106,6 @@ sendNext += tcpPacket.payload.length; } lastSendTime = System.currentTimeMillis(); - System.out.print("//// TCPConnection: Sending packet"); packet.printPacket(System.out); ipStack.sendPacket(packet, netInterface); } @@ -104,7 +128,7 @@ } if (receiveNext == tcpPacket.seqNo) { - System.out.println("TCPHandler: data received ok!!!"); + //System.out.println("TCPHandler: data received ok!!!"); } else { System.out.println("TCPHandler: seqNo error: receiveNext: " + receiveNext + " != seqNo: " + tcpPacket.seqNo); @@ -123,14 +147,15 @@ tcpReply.ackNo = tcpPacket.seqNo + plen; tcpReply.seqNo = sendNext; - // just to test replying.... - if (tcpPacket.payload != null && tcpPacket.payload.length > 2) { - tcpReply.payload = "MSPSim>".getBytes(); - } - System.out.println("TCPHandler: Sending ACK"); +// // just to test replying.... +// if (tcpPacket.payload != null && tcpPacket.payload.length > 2) { +// tcpReply.payload = "MSPSim>".getBytes(); +// } +// System.out.println("TCPHandler: Sending ACK"); send(tcpReply); - - if (tcpListener != null && plen > 0) { + + if (plen > 0) + if (tcpListener != null) { tcpListener.tcpDataReceived(this, tcpPacket); } } Modified: mspsim/se/sics/mspsim/net/TCPHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPHandler.java 2009-06-07 13:12:32 UTC (rev 559) +++ mspsim/se/sics/mspsim/net/TCPHandler.java 2009-06-07 19:18:29 UTC (rev 560) @@ -139,7 +139,6 @@ /* The run method for checking connections, etc */ public synchronized void run() { if (connectionNo > 0) { - System.out.println("Checking connections: " + connectionNo); long time = System.currentTimeMillis(); for (int i = 0; i < connectionNo; i++) { TCPConnection connection = activeConnections[i]; Added: mspsim/se/sics/mspsim/net/TCPInputStream.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPInputStream.java (rev 0) +++ mspsim/se/sics/mspsim/net/TCPInputStream.java 2009-06-07 19:18:29 UTC (rev 560) @@ -0,0 +1,88 @@ +package se.sics.mspsim.net; + +import java.io.IOException; +import java.io.InputStream; + +public class TCPInputStream extends InputStream { + + private TCPConnection connection; + /* buffer 128 bytes for input... */ + private byte[] inputBuffer = new byte[128]; + private int firstByte = 0; + private int nextEmpty = 0; + boolean closed = false; + + TCPListener listener = new TCPListener() { + public void connectionClosed(TCPConnection connection) { + } + public void newConnection(TCPConnection connection) {} + public void tcpDataReceived(TCPConnection source, TCPPacket packet) { + System.out.println("TCP Data received to input stream "); + + byte[] payload = packet.payload; + if (payload == null || payload.length == 0) return; + + /* add to cyclic buffer... */ + /* what if we can not accept all data??? */ + int pos = 0; + /* check if it fits!!! */ + if (inputBuffer.length - available() > payload.length) { + while (pos < payload.length) { + inputBuffer[nextEmpty++] = payload[pos++]; + if (nextEmpty >= inputBuffer.length) { + nextEmpty = 0; + } + } + /* notify the possibly sleeping threads that we have data!!! */ + notifyReader(); + } else { + System.out.println("ERROR!!!! packet does not fit buffer... should not ack!!!"); + } + } + }; + + TCPInputStream(TCPConnection connection) { + this.connection = connection; + } + + private synchronized void notifyReader() { + System.out.println("Notifying reader..."); + notify(); + } + + public int available() { + int ava = nextEmpty - firstByte; + if (ava < 0) ava += inputBuffer.length; + return ava; + } + + public void close() { + connection.close(); + closed = true; + } + + public int read() throws IOException { + if (closed) { + return -1; + } + if (firstByte == nextEmpty) { + System.out.println("InputStream Reader: Nothing in buffer while reading - going to wait..."); + synchronized(this) { + try { + wait(); + System.out.println("InputStream Reader: Data in buffer: " + available()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + if (!closed) { + int data = inputBuffer[firstByte++]; + if (firstByte >= inputBuffer.length) + firstByte = 0; + return (data & 0xff); + } else { + return -1; + } + } +} \ No newline at end of file Added: mspsim/se/sics/mspsim/net/TCPOutputStream.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPOutputStream.java (rev 0) +++ mspsim/se/sics/mspsim/net/TCPOutputStream.java 2009-06-07 19:18:29 UTC (rev 560) @@ -0,0 +1,38 @@ +package se.sics.mspsim.net; + +import java.io.IOException; +import java.io.OutputStream; + +public class TCPOutputStream extends OutputStream { + + /* a tiny output buffer for buffering to a TCP packet */ + byte[] output = new byte[40]; + int pos = 0; + TCPConnection connection; + + TCPOutputStream(TCPConnection connection) { + this.connection = connection; + } + + public synchronized void write(int data) throws IOException { + if (connection.state != TCPConnection.ESTABLISHED) { + throw new IOException("TCP connection not open state: " + connection.state); + } + output[pos++] = (byte) (data & 0xff); + + /* oops, the buffer is full... - send packet immediately */ + if (pos == output.length) { + flush(); + } + } + + public synchronized void flush() throws IOException { + System.out.println("TCP Output stream: Sending TCP buffer!!!!"); + byte[] buffer = new byte[pos]; + for (int i = 0; i < pos; i++) { + buffer[i] = output[i]; + } + pos = 0; + connection.send(buffer); + } +} Modified: mspsim/se/sics/mspsim/net/TCPPacket.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPPacket.java 2009-06-07 13:12:32 UTC (rev 559) +++ mspsim/se/sics/mspsim/net/TCPPacket.java 2009-06-07 19:18:29 UTC (rev 560) @@ -85,7 +85,7 @@ } /* no options, no padding for now */ if (payload != null) { - System.out.println("Adding payload to packet!!!" + payload.length); +// System.out.println("Adding payload to packet!!!" + payload.length); System.arraycopy(payload, 0, data, pos, payload.length); } @@ -152,7 +152,7 @@ sum = IPv6Packet.checkSum(sum, data, data.length); sum = (~sum) & 0xffff; if (sum == checksum) { - System.out.println("TCP: Checksum matches!!!"); + // System.out.println("TCP: Checksum matches!!!"); } else { System.out.println("TCP: Checksum error: " + Utils.hex16(checksum) + " <?> " + Utils.hex16(sum)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-06-07 13:13:18
|
Revision: 559 http://mspsim.svn.sourceforge.net/mspsim/?rev=559&view=rev Author: joxe Date: 2009-06-07 13:12:32 +0000 (Sun, 07 Jun 2009) Log Message: ----------- lots of small fixes to get TCP working better Modified Paths: -------------- mspsim/se/sics/mspsim/net/IPStack.java mspsim/se/sics/mspsim/net/TCPConnection.java mspsim/se/sics/mspsim/net/TCPHandler.java mspsim/se/sics/mspsim/net/TCPPacket.java Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-06-06 14:17:44 UTC (rev 558) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-06-07 13:12:32 UTC (rev 559) @@ -78,7 +78,7 @@ private PacketHandler linkLayerHandler; private IPPacketer defaultPacketer = new HC01Packeter(); private ICMP6PacketHandler icmp6Handler; - private TCPHandler tcpHandler = new TCPHandler(this); + private TCPHandler tcpHandler = null; /* is router -> router behavior */ private boolean isRouter = false; @@ -100,6 +100,7 @@ prefixSize = 64; /* link size */ configureIPAddress(); neighborManager = new NeighborManager(this, neighborTable); + tcpHandler = new TCPHandler(this); } public Timer getTimer() { Modified: mspsim/se/sics/mspsim/net/TCPConnection.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPConnection.java 2009-06-06 14:17:44 UTC (rev 558) +++ mspsim/se/sics/mspsim/net/TCPConnection.java 2009-06-07 13:12:32 UTC (rev 559) @@ -15,6 +15,8 @@ public static final int FIN_WAIT_2 = 8; public static final int CLOSING = 9; public static final int TIME_WAIT = 10; + + public static final long TIME_WAIT_MILLIS = 1000; // my port & IP (IP can be null here...) int localPort; @@ -38,6 +40,12 @@ private NetworkInterface netInterface; private TCPListener tcpListener; + long lastSendTime; + + private byte[] outgoingBuffer; + int bufFirst = 0; + int bufLast = 0; + TCPConnection(IPStack stack, NetworkInterface nIf) { ipStack = stack; netInterface = nIf; @@ -72,14 +80,16 @@ if (tcpPacket.payload != null) { sendNext += tcpPacket.payload.length; } + lastSendTime = System.currentTimeMillis(); System.out.print("//// TCPConnection: Sending packet"); packet.printPacket(System.out); ipStack.sendPacket(packet, netInterface); } - public void receive(TCPPacket tcpPacket) { + void receive(TCPPacket tcpPacket) { int plen = tcpPacket.payload == null ? 0 : tcpPacket.payload.length; receiveNext = tcpPacket.seqNo + plen; + if (tcpPacket.isAck()) { /* check if correct ack - we are only sending a packet a time... */ if (sendNext == tcpPacket.ackNo) { @@ -100,6 +110,14 @@ receiveNext + " != seqNo: " + tcpPacket.seqNo); } + if (tcpPacket.isFin()) { + if (tcpListener != null && plen > 0) { + /* notify app that the other side is closing... */ + tcpListener.connectionClosed(this); + } + } + + /* ack the new data! - this could be done from the connection itself!!*/ TCPPacket tcpReply = TCPHandler.createAck(tcpPacket, 0); tcpReply.ackNo = tcpPacket.seqNo + plen; @@ -118,11 +136,25 @@ } public void send(byte[] bytes) { + TCPPacket tcpPacket = createPacket(); + tcpPacket.payload = bytes; + send(tcpPacket); + } + + public void close() { + if (state == ESTABLISHED) { + TCPPacket packet = createPacket(); + packet.flags |= TCPPacket.FIN; + state = FIN_WAIT_1; + send(packet); + } + } + + public TCPPacket createPacket() { TCPPacket tcpPacket = new TCPPacket(); tcpPacket.sourcePort = localPort; tcpPacket.destinationPort = externalPort; - tcpPacket.payload = bytes; - send(tcpPacket); + return tcpPacket; } } Modified: mspsim/se/sics/mspsim/net/TCPHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPHandler.java 2009-06-06 14:17:44 UTC (rev 558) +++ mspsim/se/sics/mspsim/net/TCPHandler.java 2009-06-07 13:12:32 UTC (rev 559) @@ -1,7 +1,9 @@ package se.sics.mspsim.net; +import java.util.Timer; +import java.util.TimerTask; -public class TCPHandler { +public class TCPHandler extends TimerTask { /* MAX 16 simult. connections for now */ private static final int MAX_CONNECTIONS = 16; private static final int MAX_LISTEN = 16; @@ -12,9 +14,12 @@ int connectionNo = 0; int listenNo = 0; IPStack ipStack; + Timer timer; public TCPHandler(IPStack stack) { this.ipStack = stack; + timer = ipStack.getTimer(); + timer.schedule(this, 100, 100); } public synchronized TCPConnection addListenConnection(int port) { @@ -25,6 +30,10 @@ conn.state = TCPConnection.LISTEN; return conn; } + + private synchronized void addConnection(TCPConnection c) { + activeConnections[connectionNo++] = c; + } public void handlePacket(IPv6Packet packet) { TCPPacket tcpPacket = (TCPPacket) packet.getIPPayload(); @@ -47,7 +56,9 @@ tc.state = TCPConnection.SYN_RECEIVED; tc.receiveNext = tcpPacket.seqNo + 1; tc.sentUnack = tc.sendNext = tcpReply.seqNo = (int) (System.currentTimeMillis() * 7); - activeConnections[connectionNo++] = tc; + + addConnection(tc); + tcpReply.ackNo = tcpPacket.seqNo + 1; System.out.println("TCPHandler: Sending: " + tcpReply); tc.send(tcpReply); @@ -56,33 +67,48 @@ } } } else { - System.out.println("TCPHandler: found connection!!!"); - + System.out.println("TCPHandler: found connection!!!"); switch(connection.state) { case TCPConnection.SYN_RECEIVED: - if ((tcpPacket.flags & TCPPacket.ACK) > 0) { + if (tcpPacket.isAck()) { System.out.println("TCPConnection: gotten ACK on syn! => ESTABLISHED!!"); connection.state = TCPConnection.ESTABLISHED; } break; - case TCPConnection.ESTABLISHED: - System.out.println("Gotten packet of real data!!!"); - int plen = 0; - if (tcpPacket.payload != null) { - /* payload received !!! */ - System.out.println("Payload of: " + tcpPacket.payload.length); - plen = tcpPacket.payload.length; - } - + case TCPConnection.ESTABLISHED: /* we should check if we have acked the last data from the other */ if (tcpPacket.isAck() && (tcpPacket.payload == null || tcpPacket.payload.length == 0)) { return; } + if (tcpPacket.isFin()) { + connection.state = TCPConnection.CLOSE_WAIT; + } + connection.receive(tcpPacket); break; - } + case TCPConnection.LAST_ACK: + if (tcpPacket.isAck()) { + connection.state = TCPConnection.CLOSED; + } + break; + case TCPConnection.FIN_WAIT_1: + if (tcpPacket.isAck()) { + connection.state = TCPConnection.FIN_WAIT_2; + } + break; + case TCPConnection.FIN_WAIT_2: + if (tcpPacket.isFin()) { + System.out.println("TCPHandler: setting connection in TIME_WAIT..."); + connection.state = TCPConnection.TIME_WAIT; + connection.lastSendTime = System.currentTimeMillis(); + } + break; + case TCPConnection.CLOSE_WAIT: + /* ignore... */ + break; + } } } @@ -110,4 +136,44 @@ return null; } + /* The run method for checking connections, etc */ + public synchronized void run() { + if (connectionNo > 0) { + System.out.println("Checking connections: " + connectionNo); + long time = System.currentTimeMillis(); + for (int i = 0; i < connectionNo; i++) { + TCPConnection connection = activeConnections[i]; + switch (connection.state) { + case TCPConnection.CLOSE_WAIT: + /* if nothing in buffer - close it! */ + if (connection.bufFirst == connection.bufLast) { + System.out.println("Closing - sending FIN"); + TCPPacket packet = connection.createPacket(); + packet.flags |= TCPPacket.FIN; + connection.state = TCPConnection.LAST_ACK; + connection.send(packet); + } else { + /* send something from the buffer */ + } + break; + case TCPConnection.TIME_WAIT: + /* wait for a while ... */ + if (connection.lastSendTime < time + TCPConnection.TIME_WAIT_MILLIS) { + System.out.println("TCPHandler: Connection is closed..."); + connection.state = TCPConnection.CLOSED; + + connectionNo--; + if (i > 0) { + /* move the last connection to this position - we do not need + * this any more ??!! + */ + activeConnections[i] = activeConnections[connectionNo]; + i--; /* allow processing of that connection too */ + } + } + break; + } + } + } + } } Modified: mspsim/se/sics/mspsim/net/TCPPacket.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPPacket.java 2009-06-06 14:17:44 UTC (rev 558) +++ mspsim/se/sics/mspsim/net/TCPPacket.java 2009-06-07 13:12:32 UTC (rev 559) @@ -108,6 +108,14 @@ return (flags & PSH) > 0; } + public boolean isSyn() { + return (flags & SYN) > 0; + } + + public boolean isFin() { + return (flags & FIN) > 0; + } + public boolean isReset() { return (flags & RST) > 0; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-06-06 14:18:09
|
Revision: 558 http://mspsim.svn.sourceforge.net/mspsim/?rev=558&view=rev Author: joxe Date: 2009-06-06 14:17:44 +0000 (Sat, 06 Jun 2009) Log Message: ----------- working but unreliable TCP... Modified Paths: -------------- mspsim/se/sics/mspsim/net/HC01Packeter.java mspsim/se/sics/mspsim/net/ICMP6Packet.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/NeighborManager.java mspsim/se/sics/mspsim/net/TCPConnection.java mspsim/se/sics/mspsim/net/TCPHandler.java mspsim/se/sics/mspsim/net/TCPPacket.java Added Paths: ----------- mspsim/se/sics/mspsim/net/TCPListener.java Modified: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-06-05 05:23:39 UTC (rev 557) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-06-06 14:17:44 UTC (rev 558) @@ -543,7 +543,7 @@ 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!"); + if (DEBUG) System.out.println("HC01: Next header UDP!"); packet.nextHeader = PROTO_UDP; int srcPort = 0; int destPort = 0; @@ -583,15 +583,16 @@ } else { } - System.out.println("Encoding 0: " + Utils.hex8(enc1) + - " Encoding 1: " + Utils.hex8(enc2)); - - System.out.println("TTL: " + packet.hopLimit); - System.out.print("Src Addr: "); - IPv6Packet.printAddress(System.out, packet.sourceAddress); - System.out.print("Dst Addr: "); - IPv6Packet.printAddress(System.out, packet.destAddress); - System.out.println(); + if (DEBUG) { + System.out.println("Encoding 0: " + Utils.hex8(enc1) + + " Encoding 1: " + Utils.hex8(enc2)); + System.out.println("TTL: " + packet.hopLimit); + System.out.print("Src Addr: "); + IPv6Packet.printAddress(System.out, packet.sourceAddress); + System.out.print("Dst Addr: "); + IPv6Packet.printAddress(System.out, packet.destAddress); + System.out.println(); + } // packet.setPayload(data, 40, ???); packet.payloadLen = packet.getPayloadLength(); Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-06-05 05:23:39 UTC (rev 557) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-06-06 14:17:44 UTC (rev 558) @@ -71,6 +71,12 @@ /* default MTU is 1280 (5x256) which also is the smallest allowed */ byte[] mtuOption = new byte[] {5, 1, 0, 0, 0, 0, 5, 0}; + public ICMP6Packet() { + } + public ICMP6Packet(int type) { + this.type = type; + } + void updateRA(IPStack stack) { byte[] llAddr = stack.getLinkLayerAddress(); options.removeAllElements(); Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-06-05 05:23:39 UTC (rev 557) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-06-06 14:17:44 UTC (rev 558) @@ -42,11 +42,13 @@ */ package se.sics.mspsim.net; - +import java.util.Timer; import se.sics.mspsim.util.Utils; public class IPStack { + private static final boolean DEBUG = false; + 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, @@ -89,7 +91,7 @@ private NeighborTable neighborTable = new NeighborTable(); private NeighborManager neighborManager; private NetworkEventListener networkEventListener; - + private Timer timer = new Timer(); // TODO: read from configfile... public IPStack() { @@ -100,6 +102,15 @@ neighborManager = new NeighborManager(this, neighborTable); } + public Timer getTimer() { + return timer; + } + + /* this needs some error handling!!! */ + public TCPConnection listen(int port) { + return tcpHandler.addListenConnection(port); + } + public NeighborTable getNeighborTable() { return neighborTable; } @@ -231,7 +242,7 @@ packet.printPacket(System.out); if (isForMe(packet.getDestinationAddress())){ - System.out.println("#### PACKET FOR ME!!! " + packet.getDispatch()); + if (DEBUG) System.out.println("#### PACKET FOR ME!!! " + packet.getDispatch()); switch (packet.nextHeader) { case ICMP6Packet.DISPATCH: icmp6Handler.handlePacket(packet); @@ -250,7 +261,6 @@ packet.setIPPayload(p); } if (networkEventListener != null) { - System.out.println("UDP: Notifying event listener..."); networkEventListener.packetHandled(packet); } break; @@ -261,7 +271,6 @@ packet.setIPPayload(p); tcpHandler.handlePacket(packet); if (networkEventListener != null) { - System.out.println("TCP: Notifying event listener..."); networkEventListener.packetHandled(packet); } break; @@ -297,7 +306,6 @@ /* is the packet for me ? */ private boolean isForMe(byte[] address) { - System.out.print("=== is for me? "); IPv6Packet.printAddress(System.out, address); if (Utils.equals(myIPAddress, address) || Utils.equals(myLocalIPAddress, address) || @@ -343,6 +351,5 @@ public boolean isRouter() { return isRouter ; - } - + } } \ No newline at end of file Modified: mspsim/se/sics/mspsim/net/IPv6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-06-05 05:23:39 UTC (rev 557) +++ mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-06-06 14:17:44 UTC (rev 558) @@ -85,12 +85,16 @@ public IPv6Packet(IPPayload pl) { this(); - // copy over all the data from the packet... - // is this the right way to do this??? nextHeader = pl.getDispatch(); ipPayload = pl; } + public IPv6Packet(IPPayload pl, byte[] source, byte[] dest) { + this(pl); + this.sourceAddress = source; + this.destAddress = dest; + } + public IPv6Packet replyPacket(IPPayload payload) { IPv6Packet ipPacket = new IPv6Packet(); Modified: mspsim/se/sics/mspsim/net/LoWPANHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/LoWPANHandler.java 2009-06-05 05:23:39 UTC (rev 557) +++ mspsim/se/sics/mspsim/net/LoWPANHandler.java 2009-06-06 14:17:44 UTC (rev 558) @@ -41,6 +41,8 @@ public class LoWPANHandler extends AbstractPacketHandler implements NetworkInterface { + private final static boolean DEBUG = false; + private IPStack ipStack; public LoWPANHandler() { Modified: mspsim/se/sics/mspsim/net/NeighborManager.java =================================================================== --- mspsim/se/sics/mspsim/net/NeighborManager.java 2009-06-05 05:23:39 UTC (rev 557) +++ mspsim/se/sics/mspsim/net/NeighborManager.java 2009-06-06 14:17:44 UTC (rev 558) @@ -1,7 +1,7 @@ package se.sics.mspsim.net; +import java.util.TimerTask; +public class NeighborManager extends TimerTask { -public class NeighborManager implements Runnable { - private NeighborTable neigborTable; private IPStack ipStack; private long nextRS = 0; @@ -10,40 +10,27 @@ public NeighborManager(IPStack stack, NeighborTable table) { neigborTable = table; ipStack = stack; - new Thread(this).start(); + stack.getTimer().schedule(this, 1000, 1000); } public void run() { - while(true) { - try { - Thread.sleep(1000); - long time = System.currentTimeMillis(); - if (!duplicateDetectionNS) { - /* send a duplicate detection message */ - System.out.println("NeighborManager: sending neighbor solicitation (DAD)"); - duplicateDetectionNS = true; - ICMP6Packet icmp = new ICMP6Packet(); - icmp.setType(ICMP6Packet.NEIGHBOR_SOLICITATION); - icmp.targetAddress = ipStack.myLinkAddress; - IPv6Packet ipp = new IPv6Packet(icmp); - ipp.setDestinationAddress(ipStack.myLocalSolicited); - ipp.setSourceAddress(ipStack.myLocalIPAddress); - ipStack.sendPacket(ipp, null); - } else if (!ipStack.isRouter() && neigborTable.getDefrouter() == null && nextRS < time) { - System.out.println("NeighborManager: sending router solicitation"); - nextRS = time + 10000; - ICMP6Packet icmp = new ICMP6Packet(); - icmp.setType(ICMP6Packet.ROUTER_SOLICITATION); - icmp.addLinkOption(ICMP6Packet.SOURCE_LINKADDR, - ipStack.getLinkLayerAddress()); - IPv6Packet ipp = new IPv6Packet(icmp); - ipp.setDestinationAddress(IPStack.ALL_ROUTERS); - ipp.setSourceAddress(ipStack.myLocalIPAddress); - ipStack.sendPacket(ipp, null); - } - } catch (InterruptedException e) { - e.printStackTrace(); - } + long time = System.currentTimeMillis(); + if (!duplicateDetectionNS) { + /* send a duplicate detection message */ + System.out.println("NeighborManager: sending neighbor solicitation (DAD)"); + duplicateDetectionNS = true; + ICMP6Packet icmp = new ICMP6Packet(ICMP6Packet.NEIGHBOR_SOLICITATION); + icmp.targetAddress = ipStack.myLinkAddress; + IPv6Packet ipp = new IPv6Packet(icmp, ipStack.myLocalIPAddress, ipStack.myLocalSolicited); + ipStack.sendPacket(ipp, null); + } else if (!ipStack.isRouter() && neigborTable.getDefrouter() == null && nextRS < time) { + System.out.println("NeighborManager: sending router solicitation"); + nextRS = time + 10000; + ICMP6Packet icmp = new ICMP6Packet(ICMP6Packet.ROUTER_SOLICITATION); + icmp.addLinkOption(ICMP6Packet.SOURCE_LINKADDR, + ipStack.getLinkLayerAddress()); + IPv6Packet ipp = new IPv6Packet(icmp, ipStack.myLocalIPAddress, IPStack.ALL_ROUTERS); + ipStack.sendPacket(ipp, null); } } Modified: mspsim/se/sics/mspsim/net/TCPConnection.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPConnection.java 2009-06-05 05:23:39 UTC (rev 557) +++ mspsim/se/sics/mspsim/net/TCPConnection.java 2009-06-06 14:17:44 UTC (rev 558) @@ -34,6 +34,25 @@ int receiveNext; int receiveWindow = TCPPacket.DEFAULT_WINDOW; + private IPStack ipStack; + private NetworkInterface netInterface; + private TCPListener tcpListener; + + TCPConnection(IPStack stack, NetworkInterface nIf) { + ipStack = stack; + netInterface = nIf; + } + + public void setTCPListener(TCPListener listener) { + tcpListener = listener; + } + + public void newConnection(TCPConnection c) { + if (tcpListener != null) { + tcpListener.newConnection(c); + } + } + /* check if incoming packet matches */ public boolean matches(IPv6Packet packet, TCPPacket tcpPacket) { if ((externalPort == -1 || tcpPacket.sourcePort == externalPort) && @@ -45,15 +64,65 @@ return false; } - public void updateOnSend(TCPPacket tcpPacket) { - sendNext += tcpPacket.payload.length; + /* send packet + update sendNext - this should take into account ext window */ + /* is this what mess up the stuff */ + public void send(TCPPacket tcpPacket) { + IPv6Packet packet = new IPv6Packet(tcpPacket, localIP, externalIP); + tcpPacket.seqNo = sendNext; + if (tcpPacket.payload != null) { + sendNext += tcpPacket.payload.length; + } + System.out.print("//// TCPConnection: Sending packet"); + packet.printPacket(System.out); + ipStack.sendPacket(packet, netInterface); } - - public void updateOnReceive(TCPPacket tcpPacket) { + + public void receive(TCPPacket tcpPacket) { int plen = tcpPacket.payload == null ? 0 : tcpPacket.payload.length; receiveNext = tcpPacket.seqNo + plen; + if (tcpPacket.isAck()) { + /* check if correct ack - we are only sending a packet a time... */ + if (sendNext == tcpPacket.ackNo) { + /* no more unacked data */ + sentUnack = tcpPacket.ackNo; + /* this means that we can send more data !!*/ + } else { + System.out.println("TCPHandler: Unexpected ACK no: " + + Integer.toString(tcpPacket.ackNo, 16) + + " sendNext: " + Integer.toString(sendNext, 16)); + } + } + + if (receiveNext == tcpPacket.seqNo) { + System.out.println("TCPHandler: data received ok!!!"); + } else { + System.out.println("TCPHandler: seqNo error: receiveNext: " + + receiveNext + " != seqNo: " + tcpPacket.seqNo); + } + + /* ack the new data! - this could be done from the connection itself!!*/ + TCPPacket tcpReply = TCPHandler.createAck(tcpPacket, 0); + tcpReply.ackNo = tcpPacket.seqNo + plen; + tcpReply.seqNo = sendNext; + + // just to test replying.... + if (tcpPacket.payload != null && tcpPacket.payload.length > 2) { + tcpReply.payload = "MSPSim>".getBytes(); + } + System.out.println("TCPHandler: Sending ACK"); + send(tcpReply); + + if (tcpListener != null && plen > 0) { + tcpListener.tcpDataReceived(this, tcpPacket); + } } - + public void send(byte[] bytes) { + TCPPacket tcpPacket = new TCPPacket(); + tcpPacket.sourcePort = localPort; + tcpPacket.destinationPort = externalPort; + tcpPacket.payload = bytes; + send(tcpPacket); + } } Modified: mspsim/se/sics/mspsim/net/TCPHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPHandler.java 2009-06-05 05:23:39 UTC (rev 557) +++ mspsim/se/sics/mspsim/net/TCPHandler.java 2009-06-06 14:17:44 UTC (rev 558) @@ -15,11 +15,15 @@ public TCPHandler(IPStack stack) { this.ipStack = stack; - TCPConnection conn = listenConnections[0] = new TCPConnection(); - /* fake a port 23 - telnet */ - conn.localPort = 23; + } + + public synchronized TCPConnection addListenConnection(int port) { + TCPConnection conn = listenConnections[listenNo++] = + new TCPConnection(ipStack, null); + + conn.localPort = port; conn.state = TCPConnection.LISTEN; - listenNo++; + return conn; } public void handlePacket(IPv6Packet packet) { @@ -33,9 +37,8 @@ } else { System.out.println("TCPHandler: found listen connection!!!"); if ((tcpPacket.flags & TCPPacket.SYN) > 0) { - IPv6Packet reply = createAck(packet, tcpPacket, TCPPacket.SYN); - TCPPacket tcpReply = (TCPPacket) reply.getIPPayload(); - TCPConnection tc = new TCPConnection(); + TCPPacket tcpReply = createAck(tcpPacket, TCPPacket.SYN); + TCPConnection tc = new TCPConnection(ipStack, packet.netInterface); /* setup the connection */ tc.externalIP = packet.sourceAddress; tc.externalPort = tcpPacket.sourcePort; @@ -47,8 +50,9 @@ activeConnections[connectionNo++] = tc; tcpReply.ackNo = tcpPacket.seqNo + 1; System.out.println("TCPHandler: Sending: " + tcpReply); - ipStack.sendPacket(reply, packet.netInterface); + tc.send(tcpReply); tc.sentUnack = tc.sendNext = tc.sendNext + 1; + connection.newConnection(tc); } } } else { @@ -63,27 +67,6 @@ break; case TCPConnection.ESTABLISHED: System.out.println("Gotten packet of real data!!!"); - int flag = 0; - if (tcpPacket.isAck()) { - /* check if correct ack - we are only sending a packet a time... */ - if (connection.sendNext == tcpPacket.ackNo) { - /* no more unacked data */ - connection.sentUnack = tcpPacket.ackNo; - /* this means that we can send more data !!*/ - } else { - System.out.println("TCPHandler: Unexpected ACK no: " + - Integer.toString(tcpPacket.ackNo, 16) + - " sendNext: " + Integer.toString(connection.sendNext, 16)); - } - } - - if (connection.receiveNext == tcpPacket.seqNo) { - System.out.println("TCPHandler: data received ok!!!"); - } else { - System.out.println("TCPHandler: seqNo error: receiveNext: " + - connection + " != seqNo: " + tcpPacket.seqNo); - } - int plen = 0; if (tcpPacket.payload != null) { /* payload received !!! */ @@ -91,37 +74,22 @@ plen = tcpPacket.payload.length; } - connection.updateOnReceive(tcpPacket); - /* we should check if we have acked the last data from the other */ if (tcpPacket.isAck() && (tcpPacket.payload == null || tcpPacket.payload.length == 0)) { return; } - IPv6Packet reply = createAck(packet, tcpPacket, flag); - TCPPacket tcpReply = (TCPPacket) reply.getIPPayload(); - tcpReply.ackNo = tcpPacket.seqNo + plen; - tcpReply.seqNo = connection.sendNext; - - // just to test replying.... - if (tcpPacket.payload != null && tcpPacket.payload.length > 4) { - tcpReply.payload = "MSPSim>".getBytes(); - connection.updateOnSend(tcpReply); - } - System.out.println("TCPHandler: Sending ACK"); - ipStack.sendPacket(reply, packet.netInterface); + connection.receive(tcpPacket); break; } } } - private IPv6Packet createAck(IPv6Packet packet, TCPPacket tcpPacket, int flags) { + static TCPPacket createAck(TCPPacket tcpPacket, int flags) { TCPPacket tcpReply = tcpPacket.replyPacket(); - IPv6Packet reply = packet.replyPacket(tcpReply); - reply.sourceAddress = ipStack.myIPAddress; tcpReply.flags |= flags | TCPPacket.ACK; - return reply; + return tcpReply; } private TCPConnection findConnection(IPv6Packet packet, TCPPacket tcpPacket) { Added: mspsim/se/sics/mspsim/net/TCPListener.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPListener.java (rev 0) +++ mspsim/se/sics/mspsim/net/TCPListener.java 2009-06-06 14:17:44 UTC (rev 558) @@ -0,0 +1,10 @@ +package se.sics.mspsim.net; + +public interface TCPListener { + /* only for notifying if this is a listen connection and someone connect... */ + public void newConnection(TCPConnection connection); + /* called whenever this connection was disconnected/closed */ + public void connectionClosed(TCPConnection connection); + /* called when there is new TCP data on the connection */ + public void tcpDataReceived(TCPConnection source, TCPPacket packet); +} Modified: mspsim/se/sics/mspsim/net/TCPPacket.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPPacket.java 2009-06-05 05:23:39 UTC (rev 557) +++ mspsim/se/sics/mspsim/net/TCPPacket.java 2009-06-06 14:17:44 UTC (rev 558) @@ -119,6 +119,9 @@ return DISPATCH; } + public byte[] getPayload() { + return payload; + } /* (non-Javadoc) * @see se.sics.mspsim.net.IPPayload#parsePacketData(se.sics.mspsim.net.IPv6Packet) */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-06-05 05:23:57
|
Revision: 557 http://mspsim.svn.sourceforge.net/mspsim/?rev=557&view=rev Author: joxe Date: 2009-06-05 05:23:39 +0000 (Fri, 05 Jun 2009) Log Message: ----------- replies on TCP packet Modified Paths: -------------- mspsim/se/sics/mspsim/net/TCPConnection.java mspsim/se/sics/mspsim/net/TCPHandler.java mspsim/se/sics/mspsim/net/TCPPacket.java Modified: mspsim/se/sics/mspsim/net/TCPConnection.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPConnection.java 2009-06-03 22:22:00 UTC (rev 556) +++ mspsim/se/sics/mspsim/net/TCPConnection.java 2009-06-05 05:23:39 UTC (rev 557) @@ -30,7 +30,7 @@ int sendNext; int sendWindow = TCPPacket.DEFAULT_WINDOW; - /* last received seqNo + 1 */ + /* last received seqNo + payloadLen*/ int receiveNext; int receiveWindow = TCPPacket.DEFAULT_WINDOW; @@ -45,4 +45,15 @@ return false; } + public void updateOnSend(TCPPacket tcpPacket) { + sendNext += tcpPacket.payload.length; + } + + public void updateOnReceive(TCPPacket tcpPacket) { + int plen = tcpPacket.payload == null ? 0 : tcpPacket.payload.length; + receiveNext = tcpPacket.seqNo + plen; + } + + + } Modified: mspsim/se/sics/mspsim/net/TCPHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPHandler.java 2009-06-03 22:22:00 UTC (rev 556) +++ mspsim/se/sics/mspsim/net/TCPHandler.java 2009-06-05 05:23:39 UTC (rev 557) @@ -76,6 +76,14 @@ " sendNext: " + Integer.toString(connection.sendNext, 16)); } } + + if (connection.receiveNext == tcpPacket.seqNo) { + System.out.println("TCPHandler: data received ok!!!"); + } else { + System.out.println("TCPHandler: seqNo error: receiveNext: " + + connection + " != seqNo: " + tcpPacket.seqNo); + } + int plen = 0; if (tcpPacket.payload != null) { /* payload received !!! */ @@ -83,27 +91,31 @@ plen = tcpPacket.payload.length; } - if (connection.receiveNext == tcpPacket.seqNo) { - System.out.println("TCPHandler: data received ok!!!"); - } else { - System.out.println("TCPHandler: seqNo error: receiveNext: " + - connection + " != seqNo: " + tcpPacket.seqNo); + connection.updateOnReceive(tcpPacket); + + /* we should check if we have acked the last data from the other */ + if (tcpPacket.isAck() && + (tcpPacket.payload == null || tcpPacket.payload.length == 0)) { + return; } - - connection.receiveNext = tcpPacket.seqNo + plen; - + IPv6Packet reply = createAck(packet, tcpPacket, flag); TCPPacket tcpReply = (TCPPacket) reply.getIPPayload(); tcpReply.ackNo = tcpPacket.seqNo + plen; tcpReply.seqNo = connection.sendNext; - System.out.println("TCPHandler: Sending ACK: "); + + // just to test replying.... + if (tcpPacket.payload != null && tcpPacket.payload.length > 4) { + tcpReply.payload = "MSPSim>".getBytes(); + connection.updateOnSend(tcpReply); + } + System.out.println("TCPHandler: Sending ACK"); ipStack.sendPacket(reply, packet.netInterface); break; - } - + } } } - + private IPv6Packet createAck(IPv6Packet packet, TCPPacket tcpPacket, int flags) { TCPPacket tcpReply = tcpPacket.replyPacket(); IPv6Packet reply = packet.replyPacket(tcpReply); Modified: mspsim/se/sics/mspsim/net/TCPPacket.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPPacket.java 2009-06-03 22:22:00 UTC (rev 556) +++ mspsim/se/sics/mspsim/net/TCPPacket.java 2009-06-05 05:23:39 UTC (rev 557) @@ -51,9 +51,9 @@ /* offset to the first payload byte div. by 4 */ offset = size / 4; - if (payload != null) + if (payload != null) { size += payload.length; - + } byte[] data = new byte[size]; int pos = 0; data[pos++] = (byte)(sourcePort >> 8); @@ -85,9 +85,10 @@ } /* no options, no padding for now */ if (payload != null) { + System.out.println("Adding payload to packet!!!" + payload.length); System.arraycopy(payload, 0, data, pos, payload.length); } - + packet.payloadLen = size; int sum = packet.upperLayerHeaderChecksum(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-06-03 22:22:17
|
Revision: 556 http://mspsim.svn.sourceforge.net/mspsim/?rev=556&view=rev Author: joxe Date: 2009-06-03 22:22:00 +0000 (Wed, 03 Jun 2009) Log Message: ----------- added TCP - working receive no send Modified Paths: -------------- mspsim/se/sics/mspsim/net/HC01Packeter.java mspsim/se/sics/mspsim/net/IPStack.java mspsim/se/sics/mspsim/net/IPv6Packet.java mspsim/se/sics/mspsim/net/UDPPacket.java Added Paths: ----------- mspsim/se/sics/mspsim/net/TCPConnection.java mspsim/se/sics/mspsim/net/TCPHandler.java mspsim/se/sics/mspsim/net/TCPPacket.java Modified: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-06-01 22:30:32 UTC (rev 555) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-06-03 22:22:00 UTC (rev 556) @@ -48,7 +48,7 @@ public class HC01Packeter implements IPPacketer { - private boolean DEBUG = true; + private boolean DEBUG = false;//true; /* * Values of fields within the IPHC encoding first byte * (C stands for compressed and I for inline) Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-06-01 22:30:32 UTC (rev 555) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-06-03 22:22:00 UTC (rev 556) @@ -76,7 +76,8 @@ private PacketHandler linkLayerHandler; private IPPacketer defaultPacketer = new HC01Packeter(); private ICMP6PacketHandler icmp6Handler; - + private TCPHandler tcpHandler = new TCPHandler(this); + /* is router -> router behavior */ private boolean isRouter = false; @@ -253,6 +254,17 @@ networkEventListener.packetHandled(packet); } break; + case TCPPacket.DISPATCH: + TCPPacket p = new TCPPacket(); + p.parsePacketData(packet); + p.printPacket(System.out); + packet.setIPPayload(p); + tcpHandler.handlePacket(packet); + if (networkEventListener != null) { + System.out.println("TCP: Notifying event listener..."); + networkEventListener.packetHandled(packet); + } + break; } } else if (!isOnLink(packet.getDestinationAddress()) && packet.netInterface != tunnel) { Modified: mspsim/se/sics/mspsim/net/IPv6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-06-01 22:30:32 UTC (rev 555) +++ mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-06-03 22:22:00 UTC (rev 556) @@ -288,4 +288,5 @@ packet.parsePacketData(packet); packet.printPacket(System.out); } + } \ No newline at end of file Added: mspsim/se/sics/mspsim/net/TCPConnection.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPConnection.java (rev 0) +++ mspsim/se/sics/mspsim/net/TCPConnection.java 2009-06-03 22:22:00 UTC (rev 556) @@ -0,0 +1,48 @@ +package se.sics.mspsim.net; + +import se.sics.mspsim.util.Utils; + +public class TCPConnection { + // States of the connection + public static final int CLOSED = 0; + public static final int LISTEN = 1; + public static final int SYN_SENT = 2; + public static final int SYN_RECEIVED = 3; + public static final int ESTABLISHED = 4; + public static final int CLOSE_WAIT = 5; + public static final int LAST_ACK = 6; + public static final int FIN_WAIT_1 = 7; + public static final int FIN_WAIT_2 = 8; + public static final int CLOSING = 9; + public static final int TIME_WAIT = 10; + + // my port & IP (IP can be null here...) + int localPort; + byte[] localIP; + // other port + int externalPort = -1; + byte[] externalIP; + + int state; + + /* sent unacked and nextSend byte */ + int sentUnack; + int sendNext; + int sendWindow = TCPPacket.DEFAULT_WINDOW; + + /* last received seqNo + 1 */ + int receiveNext; + int receiveWindow = TCPPacket.DEFAULT_WINDOW; + + /* check if incoming packet matches */ + public boolean matches(IPv6Packet packet, TCPPacket tcpPacket) { + if ((externalPort == -1 || tcpPacket.sourcePort == externalPort) && + tcpPacket.destinationPort == localPort && + (localIP == null || Utils.equals(localIP, packet.destAddress)) && + (externalIP == null || Utils.equals(externalIP, packet.sourceAddress))) { + return true; + } + return false; + } + +} Added: mspsim/se/sics/mspsim/net/TCPHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPHandler.java (rev 0) +++ mspsim/se/sics/mspsim/net/TCPHandler.java 2009-06-03 22:22:00 UTC (rev 556) @@ -0,0 +1,133 @@ +package se.sics.mspsim.net; + + +public class TCPHandler { + /* MAX 16 simult. connections for now */ + private static final int MAX_CONNECTIONS = 16; + private static final int MAX_LISTEN = 16; + + TCPConnection[] activeConnections = new TCPConnection[MAX_CONNECTIONS]; + TCPConnection[] listenConnections = new TCPConnection[MAX_LISTEN]; + + int connectionNo = 0; + int listenNo = 0; + IPStack ipStack; + + public TCPHandler(IPStack stack) { + this.ipStack = stack; + TCPConnection conn = listenConnections[0] = new TCPConnection(); + /* fake a port 23 - telnet */ + conn.localPort = 23; + conn.state = TCPConnection.LISTEN; + listenNo++; + } + + public void handlePacket(IPv6Packet packet) { + TCPPacket tcpPacket = (TCPPacket) packet.getIPPayload(); + + TCPConnection connection = findConnection(packet, tcpPacket); + if (connection == null) { + connection = findListenConnection(packet, tcpPacket); + if (connection == null) { + System.out.println("TCPHandler: can not find active or listen connection for this packet"); + } else { + System.out.println("TCPHandler: found listen connection!!!"); + if ((tcpPacket.flags & TCPPacket.SYN) > 0) { + IPv6Packet reply = createAck(packet, tcpPacket, TCPPacket.SYN); + TCPPacket tcpReply = (TCPPacket) reply.getIPPayload(); + TCPConnection tc = new TCPConnection(); + /* setup the connection */ + tc.externalIP = packet.sourceAddress; + tc.externalPort = tcpPacket.sourcePort; + tc.localIP = ipStack.myIPAddress; + tc.localPort = tcpPacket.destinationPort; + tc.state = TCPConnection.SYN_RECEIVED; + tc.receiveNext = tcpPacket.seqNo + 1; + tc.sentUnack = tc.sendNext = tcpReply.seqNo = (int) (System.currentTimeMillis() * 7); + activeConnections[connectionNo++] = tc; + tcpReply.ackNo = tcpPacket.seqNo + 1; + System.out.println("TCPHandler: Sending: " + tcpReply); + ipStack.sendPacket(reply, packet.netInterface); + tc.sentUnack = tc.sendNext = tc.sendNext + 1; + } + } + } else { + System.out.println("TCPHandler: found connection!!!"); + + switch(connection.state) { + case TCPConnection.SYN_RECEIVED: + if ((tcpPacket.flags & TCPPacket.ACK) > 0) { + System.out.println("TCPConnection: gotten ACK on syn! => ESTABLISHED!!"); + connection.state = TCPConnection.ESTABLISHED; + } + break; + case TCPConnection.ESTABLISHED: + System.out.println("Gotten packet of real data!!!"); + int flag = 0; + if (tcpPacket.isAck()) { + /* check if correct ack - we are only sending a packet a time... */ + if (connection.sendNext == tcpPacket.ackNo) { + /* no more unacked data */ + connection.sentUnack = tcpPacket.ackNo; + /* this means that we can send more data !!*/ + } else { + System.out.println("TCPHandler: Unexpected ACK no: " + + Integer.toString(tcpPacket.ackNo, 16) + + " sendNext: " + Integer.toString(connection.sendNext, 16)); + } + } + int plen = 0; + if (tcpPacket.payload != null) { + /* payload received !!! */ + System.out.println("Payload of: " + tcpPacket.payload.length); + plen = tcpPacket.payload.length; + } + + if (connection.receiveNext == tcpPacket.seqNo) { + System.out.println("TCPHandler: data received ok!!!"); + } else { + System.out.println("TCPHandler: seqNo error: receiveNext: " + + connection + " != seqNo: " + tcpPacket.seqNo); + } + + connection.receiveNext = tcpPacket.seqNo + plen; + + IPv6Packet reply = createAck(packet, tcpPacket, flag); + TCPPacket tcpReply = (TCPPacket) reply.getIPPayload(); + tcpReply.ackNo = tcpPacket.seqNo + plen; + tcpReply.seqNo = connection.sendNext; + System.out.println("TCPHandler: Sending ACK: "); + ipStack.sendPacket(reply, packet.netInterface); + break; + } + + } + } + + private IPv6Packet createAck(IPv6Packet packet, TCPPacket tcpPacket, int flags) { + TCPPacket tcpReply = tcpPacket.replyPacket(); + IPv6Packet reply = packet.replyPacket(tcpReply); + reply.sourceAddress = ipStack.myIPAddress; + tcpReply.flags |= flags | TCPPacket.ACK; + return reply; + } + + private TCPConnection findConnection(IPv6Packet packet, TCPPacket tcpPacket) { + for (int i = 0; i < connectionNo; i++) { + if (activeConnections[i].matches(packet, tcpPacket)) { + return activeConnections[i]; + } + } + return null; + } + + private TCPConnection findListenConnection(IPv6Packet packet, TCPPacket tcpPacket) { + for (int i = 0; i < listenNo; i++) { + if (listenConnections[i].matches(packet, tcpPacket)) { + return listenConnections[i]; + } + } + return null; + } + +} Added: mspsim/se/sics/mspsim/net/TCPPacket.java =================================================================== --- mspsim/se/sics/mspsim/net/TCPPacket.java (rev 0) +++ mspsim/se/sics/mspsim/net/TCPPacket.java 2009-06-03 22:22:00 UTC (rev 556) @@ -0,0 +1,177 @@ +/** + * + */ +package se.sics.mspsim.net; + +import java.io.PrintStream; + +import se.sics.mspsim.util.Utils; + +/** + * @author joakim + * + */ +public class TCPPacket implements IPPayload { + + public static final int DEFAULT_WINDOW = 60; + public static final int DEFAULT_MSS = 60; + + public static final int DISPATCH = 6; + + public static final int OPT_MSS = 2; + public static final int OPT_MSS_LEN = 4; + + public static final int URG = 0x20; + public static final int ACK = 0x10; + public static final int PSH = 0x08; + public static final int RST = 0x04; + public static final int SYN = 0x02; + public static final int FIN = 0x01; + + int sourcePort; + int destinationPort; + int seqNo; + int ackNo; + int offset = 5; /* no options, no padding => 5 x 4 = 20 bytes header */ + int flags; + int window = DEFAULT_WINDOW; + int checksum; + int urgentPointer; + + byte[] payload; + + /* (non-Javadoc) + * @see se.sics.mspsim.net.IPPayload#generatePacketData(se.sics.mspsim.net.IPv6Packet) + */ + public byte[] generatePacketData(IPv6Packet packet) { + int size = 20; + if ((flags & SYN) > 0) { + size += 4; + } + /* offset to the first payload byte div. by 4 */ + offset = size / 4; + + if (payload != null) + size += payload.length; + + byte[] data = new byte[size]; + int pos = 0; + data[pos++] = (byte)(sourcePort >> 8); + data[pos++] = (byte)(sourcePort & 0xff); + data[pos++] = (byte)(destinationPort >> 8); + data[pos++] = (byte)(destinationPort & 0xff); + IPv6Packet.set32(data, pos, seqNo); + pos += 4; + IPv6Packet.set32(data, pos, ackNo); + pos += 4; + data[pos++] = (byte)(offset << 4); + data[pos++] = (byte) flags; + + data[pos++] = (byte)(window >> 8); + data[pos++] = (byte)(window & 0xff); + + data[pos++] = 0; /* checksum */ + data[pos++] = 0; + + data[pos++] = (byte)(urgentPointer >> 8); + data[pos++] = (byte)(urgentPointer & 0xff); + + /* if this is a syn then send MSS */ + if ((flags & SYN) > 0) { + data[pos++] = OPT_MSS; + data[pos++] = OPT_MSS_LEN; + data[pos++] = (byte)(DEFAULT_MSS >> 8); + data[pos++] = (byte)(DEFAULT_MSS & 0xff); + } + /* no options, no padding for now */ + if (payload != null) { + System.arraycopy(payload, 0, data, pos, payload.length); + } + + packet.payloadLen = size; + int sum = packet.upperLayerHeaderChecksum(); + + sum = IPv6Packet.checkSum(sum, data, size); + sum = (~sum) & 0xffff; + data[16] = (byte) (sum >> 8); + data[17] = (byte) (sum & 0xff); + + return data; + } + + public boolean isAck() { + return (flags & ACK) > 0; + } + + public boolean isPush() { + return (flags & PSH) > 0; + } + + public boolean isReset() { + return (flags & RST) > 0; + } + + /* (non-Javadoc) + * @see se.sics.mspsim.net.IPPayload#getDispatch() + */ + public byte getDispatch() { + return DISPATCH; + } + + /* (non-Javadoc) + * @see se.sics.mspsim.net.IPPayload#parsePacketData(se.sics.mspsim.net.IPv6Packet) + */ + public void parsePacketData(IPv6Packet packet) { + sourcePort = packet.get16(0); + destinationPort = packet.get16(2); + seqNo = packet.get32(4); + ackNo = packet.get32(8); + offset = (packet.getData(12) & 0xff) >> 4; + flags = packet.getData(13); + window = packet.get16(14); + checksum = packet.get16(16); + urgentPointer = packet.get16(18); + + /* checksum */ + packet.setData(16, (byte) 0); + packet.setData(17, (byte) 0); + byte[] data = packet.getPayload(); + int sum = packet.upperLayerHeaderChecksum(); + sum = IPv6Packet.checkSum(sum, data, data.length); + sum = (~sum) & 0xffff; + if (sum == checksum) { + System.out.println("TCP: Checksum matches!!!"); + } else { + System.out.println("TCP: Checksum error: " + + Utils.hex16(checksum) + " <?> " + Utils.hex16(sum)); + } + if (data.length - (offset * 4) > 0) { + int len = data.length - (offset * 4); + System.out.println("TCPPacket: offset: " + offset + " => p-len: " + len); + payload = new byte[len]; + System.arraycopy(data, (offset * 4), payload, 0, len); + } + } + + /* (non-Javadoc) + * @see se.sics.mspsim.net.IPPayload#printPacket(java.io.PrintStream) + */ + public void printPacket(PrintStream out) { + out.println("TCP Packet: srcPort: " + sourcePort + + " dstPort: " + destinationPort + " Flags: " + Utils.hex8(flags)); + out.println("SeqNo: " + seqNo + " AckNo: " + ackNo); + if (payload != null) { + for (int i = 0; i < payload.length; i++) { + out.print((char) payload[i]); + } + System.out.println(); + } + } + + public TCPPacket replyPacket() { + TCPPacket packet = new TCPPacket(); + packet.sourcePort = destinationPort; + packet.destinationPort = sourcePort; + return packet; + } +} \ No newline at end of file Modified: mspsim/se/sics/mspsim/net/UDPPacket.java =================================================================== --- mspsim/se/sics/mspsim/net/UDPPacket.java 2009-06-01 22:30:32 UTC (rev 555) +++ mspsim/se/sics/mspsim/net/UDPPacket.java 2009-06-03 22:22:00 UTC (rev 556) @@ -46,6 +46,7 @@ } public byte[] generatePacketData(IPv6Packet packet) { + /* TODO: needs to be done!!! */ return null; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-06-01 22:30:34
|
Revision: 555 http://mspsim.svn.sourceforge.net/mspsim/?rev=555&view=rev Author: joxe Date: 2009-06-01 22:30:32 +0000 (Mon, 01 Jun 2009) Log Message: ----------- implemented input for ACLK on TCCTL registers Modified Paths: -------------- mspsim/se/sics/mspsim/core/Timer.java Modified: mspsim/se/sics/mspsim/core/Timer.java =================================================================== --- mspsim/se/sics/mspsim/core/Timer.java 2009-06-01 20:19:36 UTC (rev 554) +++ mspsim/se/sics/mspsim/core/Timer.java 2009-06-01 22:30:32 UTC (rev 555) @@ -123,6 +123,7 @@ public static final int SRC_VCC = 0x201; public static final int SRC_CAOUT = 0x202; // Internal ??? What is this? + public static final int CC_I = 0x08; public static final int CC_IFG = 0x01; // Bit 0 public static final int CC_IE = 0x10; // Bit 4 public static final int CC_TRIGGER_INT = CC_IE | CC_IFG; @@ -183,6 +184,7 @@ private double cyclesMultiplicator = 1; private int clockSource; + private int clockSpeed; private int mode; // The IO registers @@ -357,6 +359,17 @@ private void updateTCCTL(int cctl, long cycles) { // TODO Auto-generated method stub // update the CCI depending on speed of clocks... + boolean input = false; + /* if ACLK we can calculate edge... */ + if (inputSrc[cctl] == SRC_ACLK) { + /* needs the TimerA clock speed here... */ + int aTicks = clockSpeed / core.aclkFrq; + updateCounter(cycles); + if (counter % aTicks > aTicks / 2) { + input = true; + } + } + tcctl[cctl] = (tcctl[cctl] & ~CC_I) | (input ? CC_I : 0); } private void resetTIV(long cycles) { @@ -555,6 +568,7 @@ System.out.println(getName() + " setting multiplicator to: " + cyclesMultiplicator); } } + clockSpeed = (int) (core.smclkFrq / cyclesMultiplicator); } void resetCounter(long cycles) { @@ -637,6 +651,7 @@ // Needs to be non-integer since smclk Frq can be lower // than aclk + /* this should be cached and changed whenever clockSource change!!! */ double divider = 1; if (clockSource == SRC_ACLK) { // Should later be divided with DCO clock? This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-06-01 20:20:21
|
Revision: 554 http://mspsim.svn.sourceforge.net/mspsim/?rev=554&view=rev Author: joxe Date: 2009-06-01 20:19:36 +0000 (Mon, 01 Jun 2009) Log Message: ----------- small modifications to neighbor management Modified Paths: -------------- mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java mspsim/se/sics/mspsim/net/IPStack.java mspsim/se/sics/mspsim/net/Neighbor.java mspsim/se/sics/mspsim/net/NeighborManager.java mspsim/se/sics/mspsim/net/NeighborTable.java Modified: mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-31 21:41:03 UTC (rev 553) +++ mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-06-01 20:19:36 UTC (rev 554) @@ -82,7 +82,10 @@ IPv6Packet.printAddress(System.out, ipp.destAddress); packet.printPacket(System.out); + ipStack.getNeighborManager().receiveNDMessage(packet); + ipStack.sendPacket(ipp, packet.netInterface); + } break; case ICMP6Packet.ROUTER_ADVERTISEMENT: @@ -94,10 +97,7 @@ int size = prefixInfo[2]; ipStack.setPrefix(prefix, size); - NeighborTable nt = ipStack.getNeighborTable(); - Neighbor nei = nt.addNeighbor(packet.sourceAddress, packet.getLinkSource()); - nt.setDefrouter(nei); - nei.setState(Neighbor.REACHABLE); + ipStack.getNeighborManager().receiveNDMessage(packet); } } break; Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-05-31 21:41:03 UTC (rev 553) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-06-01 20:19:36 UTC (rev 554) @@ -86,6 +86,7 @@ //private HC01Packeter ipPacketer = new HC01Packeter(); private NeighborTable neighborTable = new NeighborTable(); + private NeighborManager neighborManager; private NetworkEventListener networkEventListener; // TODO: read from configfile... @@ -95,12 +96,16 @@ prefix = new byte[] {(byte) 0xaa, (byte)0xaa, 0, 0, 0, 0, 0, 0}; prefixSize = 64; /* link size */ configureIPAddress(); - new NeighborManager(this, neighborTable); + neighborManager = new NeighborManager(this, neighborTable); } public NeighborTable getNeighborTable() { return neighborTable; } + + public NeighborManager getNeighborManager() { + return neighborManager; + } public void setLinkLayerHandler(PacketHandler handler) { linkLayerHandler = handler; Modified: mspsim/se/sics/mspsim/net/Neighbor.java =================================================================== --- mspsim/se/sics/mspsim/net/Neighbor.java 2009-05-31 21:41:03 UTC (rev 553) +++ mspsim/se/sics/mspsim/net/Neighbor.java 2009-06-01 20:19:36 UTC (rev 554) @@ -1,6 +1,30 @@ package se.sics.mspsim.net; public class Neighbor { + /* From the RFC - States of the neighbors: + * + * INCOMPLETE Address resolution is in progress and the link-layer + * address of the neighbor has not yet been determined. + * + * REACHABLE Roughly speaking, the neighbor is known to have been + * reachable recently (within tens of seconds ago). + * + * STALE The neighbor is no longer known to be reachable but + * until traffic is sent to the neighbor, no attempt + * should be made to verify its reachability. + * + * DELAY The neighbor is no longer known to be reachable, and + * traffic has recently been sent to the neighbor. + * Rather than probe the neighbor immediately, however, + * delay sending probes for a short while in order to + * give upper-layer protocols a chance to provide + * reachability confirmation. + * + * PROBE The neighbor is no longer known to be reachable, and + * unicast Neighbor Solicitation probes are being sent to + * verify reachability. + * + */ public static final int INCOMPLETE = 0; public static final int REACHABLE = 1; @@ -13,6 +37,8 @@ byte[] ipAddress; byte[] linkAddress; NetworkInterface netInterface; + long reachableUntil; + long lastNDSent; int state = INCOMPLETE; public byte[] getIpAddress() { Modified: mspsim/se/sics/mspsim/net/NeighborManager.java =================================================================== --- mspsim/se/sics/mspsim/net/NeighborManager.java 2009-05-31 21:41:03 UTC (rev 553) +++ mspsim/se/sics/mspsim/net/NeighborManager.java 2009-06-01 20:19:36 UTC (rev 554) @@ -29,7 +29,7 @@ ipp.setDestinationAddress(ipStack.myLocalSolicited); ipp.setSourceAddress(ipStack.myLocalIPAddress); ipStack.sendPacket(ipp, null); - } else if (neigborTable.getDefrouter() == null && nextRS < time) { + } else if (!ipStack.isRouter() && neigborTable.getDefrouter() == null && nextRS < time) { System.out.println("NeighborManager: sending router solicitation"); nextRS = time + 10000; ICMP6Packet icmp = new ICMP6Packet(); @@ -46,4 +46,24 @@ } } } + + public void receiveNDMessage(IPv6Packet packet) { + /* payload is a ICMP6 packet */ + ICMP6Packet payload = (ICMP6Packet) packet.getIPPayload(); + Neighbor nei = null; + switch (payload.type) { + case ICMP6Packet.ROUTER_SOLICITATION: + nei = neigborTable.addNeighbor(packet.sourceAddress, packet.getLinkSource()); + if (nei != null) { + nei.setState(Neighbor.REACHABLE); + } + break; + case ICMP6Packet.ROUTER_ADVERTISEMENT: + nei = neigborTable.addNeighbor(packet.sourceAddress, packet.getLinkSource()); + neigborTable.setDefrouter(nei); + nei.setState(Neighbor.REACHABLE); + break; + } + + } } Modified: mspsim/se/sics/mspsim/net/NeighborTable.java =================================================================== --- mspsim/se/sics/mspsim/net/NeighborTable.java 2009-05-31 21:41:03 UTC (rev 553) +++ mspsim/se/sics/mspsim/net/NeighborTable.java 2009-06-01 20:19:36 UTC (rev 554) @@ -18,15 +18,17 @@ public synchronized Neighbor addNeighbor(byte[] ipAddress, byte[] linkAddress) { Neighbor nb = getNeighbor(ipAddress); if (nb == null) { - nb = new Neighbor(); - nb.ipAddress = ipAddress; - nb.linkAddress = linkAddress; - nb.state = Neighbor.INCOMPLETE; - if (neighborCount < neighbors.length) { - neighbors[neighborCount++] = nb; - } else { - // TODO select suitable neighbor to replace - neighbors[0] = nb; + if (checkIPAddress(ipAddress)) { + nb = new Neighbor(); + nb.ipAddress = ipAddress; + nb.linkAddress = linkAddress; + nb.state = checkLinkAddress(linkAddress) ? Neighbor.STALE : Neighbor.INCOMPLETE; + if (neighborCount < neighbors.length) { + neighbors[neighborCount++] = nb; + } else { + // TODO select suitable neighbor to replace + neighbors[0] = nb; + } } } else { /* Neighbor already in neighbor table */ @@ -36,6 +38,18 @@ return nb; } + private boolean checkLinkAddress(byte[] link) { + if (link == null) return false; + /* is there any other non-ok address ?? */ + return true; + } + private boolean checkIPAddress(byte[] ipAddress) { + /* can not add unspecified IP addresses */ + if (Utils.equals(ipAddress, IPStack.UNSPECIFIED)) return false; + /* are all other ok? */ + return true; + } + public Neighbor getDefrouter() { return defrouter; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-31 21:41:31
|
Revision: 553 http://mspsim.svn.sourceforge.net/mspsim/?rev=553&view=rev Author: joxe Date: 2009-05-31 21:41:03 +0000 (Sun, 31 May 2009) Log Message: ----------- minor update of timers - todo for fixing timer bug Modified Paths: -------------- mspsim/se/sics/mspsim/core/Timer.java mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java Modified: mspsim/se/sics/mspsim/core/Timer.java =================================================================== --- mspsim/se/sics/mspsim/core/Timer.java 2009-05-30 21:48:58 UTC (rev 552) +++ mspsim/se/sics/mspsim/core/Timer.java 2009-05-31 21:41:03 UTC (rev 553) @@ -325,6 +325,7 @@ case TCCTL5: case TCCTL6: int i = (index - TCCTL0) / 2; + updateTCCTL(i, cycles); val = tcctl[i]; break; case TCCR0: @@ -350,6 +351,14 @@ return val & 0xffff; } + /* here we need to update things such as CCI / Capture/Compare Input value + * and other dynamic values + */ + private void updateTCCTL(int cctl, long cycles) { + // TODO Auto-generated method stub + // update the CCI depending on speed of clocks... + } + private void resetTIV(long cycles) { if (lastTIV == timerOverflow) { interruptPending = false; Modified: mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-30 21:48:58 UTC (rev 552) +++ mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-31 21:41:03 UTC (rev 553) @@ -94,7 +94,6 @@ int size = prefixInfo[2]; ipStack.setPrefix(prefix, size); - System.out.println("Adding router as neighbor!!!"); NeighborTable nt = ipStack.getNeighborTable(); Neighbor nei = nt.addNeighbor(packet.sourceAddress, packet.getLinkSource()); nt.setDefrouter(nei); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ni...@us...> - 2009-05-30 21:49:53
|
Revision: 552 http://mspsim.svn.sourceforge.net/mspsim/?rev=552&view=rev Author: nifi Date: 2009-05-30 21:48:58 +0000 (Sat, 30 May 2009) Log Message: ----------- handle update of existing neighbors Modified Paths: -------------- mspsim/se/sics/mspsim/net/NeighborTable.java Modified: mspsim/se/sics/mspsim/net/NeighborTable.java =================================================================== --- mspsim/se/sics/mspsim/net/NeighborTable.java 2009-05-30 11:23:51 UTC (rev 551) +++ mspsim/se/sics/mspsim/net/NeighborTable.java 2009-05-30 21:48:58 UTC (rev 552) @@ -2,8 +2,6 @@ * */ package se.sics.mspsim.net; - -import java.util.Vector; import se.sics.mspsim.util.Utils; /** @@ -18,11 +16,23 @@ Neighbor defrouter; public synchronized Neighbor addNeighbor(byte[] ipAddress, byte[] linkAddress) { - Neighbor nb = new Neighbor(); - nb.ipAddress = ipAddress; - nb.linkAddress = linkAddress; - nb.state = Neighbor.INCOMPLETE; - neighbors[neighborCount++] = nb; + Neighbor nb = getNeighbor(ipAddress); + if (nb == null) { + nb = new Neighbor(); + nb.ipAddress = ipAddress; + nb.linkAddress = linkAddress; + nb.state = Neighbor.INCOMPLETE; + if (neighborCount < neighbors.length) { + neighbors[neighborCount++] = nb; + } else { + // TODO select suitable neighbor to replace + neighbors[0] = nb; + } + } else { + /* Neighbor already in neighbor table */ + nb.linkAddress = linkAddress; + nb.state = Neighbor.INCOMPLETE; + } return nb; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-30 11:23:52
|
Revision: 551 http://mspsim.svn.sourceforge.net/mspsim/?rev=551&view=rev Author: joxe Date: 2009-05-30 11:23:51 +0000 (Sat, 30 May 2009) Log Message: ----------- added NS and RS Modified Paths: -------------- mspsim/se/sics/mspsim/net/ICMP6Packet.java mspsim/se/sics/mspsim/net/NeighborManager.java Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-29 23:20:36 UTC (rev 550) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-30 11:23:51 UTC (rev 551) @@ -273,6 +273,13 @@ } pos = addOptions(buffer, pos); break; + case ROUTER_SOLICITATION: + buffer[pos++] = 0; + buffer[pos++] = 0; + buffer[pos++] = 0; + buffer[pos++] = 0; + pos = addOptions(buffer, pos); + break; case ROUTER_ADVERTISEMENT: buffer[pos++] = hopLimit; buffer[pos++] = autoConfigFlags; Modified: mspsim/se/sics/mspsim/net/NeighborManager.java =================================================================== --- mspsim/se/sics/mspsim/net/NeighborManager.java 2009-05-29 23:20:36 UTC (rev 550) +++ mspsim/se/sics/mspsim/net/NeighborManager.java 2009-05-30 11:23:51 UTC (rev 551) @@ -4,6 +4,8 @@ private NeighborTable neigborTable; private IPStack ipStack; + private long nextRS = 0; + private boolean duplicateDetectionNS; public NeighborManager(IPStack stack, NeighborTable table) { neigborTable = table; @@ -15,13 +17,28 @@ while(true) { try { Thread.sleep(1000); - if (neigborTable.getDefrouter() == null) { - IPv6Packet ipp = new IPv6Packet(); - ipp.setDestinationAddress(IPStack.ALL_ROUTERS); + long time = System.currentTimeMillis(); + if (!duplicateDetectionNS) { + /* send a duplicate detection message */ + System.out.println("NeighborManager: sending neighbor solicitation (DAD)"); + duplicateDetectionNS = true; ICMP6Packet icmp = new ICMP6Packet(); + icmp.setType(ICMP6Packet.NEIGHBOR_SOLICITATION); + icmp.targetAddress = ipStack.myLinkAddress; + IPv6Packet ipp = new IPv6Packet(icmp); + ipp.setDestinationAddress(ipStack.myLocalSolicited); + ipp.setSourceAddress(ipStack.myLocalIPAddress); + ipStack.sendPacket(ipp, null); + } else if (neigborTable.getDefrouter() == null && nextRS < time) { + System.out.println("NeighborManager: sending router solicitation"); + nextRS = time + 10000; + ICMP6Packet icmp = new ICMP6Packet(); icmp.setType(ICMP6Packet.ROUTER_SOLICITATION); icmp.addLinkOption(ICMP6Packet.SOURCE_LINKADDR, ipStack.getLinkLayerAddress()); + IPv6Packet ipp = new IPv6Packet(icmp); + ipp.setDestinationAddress(IPStack.ALL_ROUTERS); + ipp.setSourceAddress(ipStack.myLocalIPAddress); ipStack.sendPacket(ipp, null); } } catch (InterruptedException e) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-29 23:21:21
|
Revision: 550 http://mspsim.svn.sourceforge.net/mspsim/?rev=550&view=rev Author: joxe Date: 2009-05-29 23:20:36 +0000 (Fri, 29 May 2009) Log Message: ----------- added neighbor manager Modified Paths: -------------- mspsim/se/sics/mspsim/net/IPStack.java mspsim/se/sics/mspsim/net/IPv6Packet.java mspsim/se/sics/mspsim/net/UDPPacket.java Added Paths: ----------- mspsim/se/sics/mspsim/net/NeighborManager.java Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-05-29 13:08:40 UTC (rev 549) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-05-29 23:20:36 UTC (rev 550) @@ -95,6 +95,7 @@ prefix = new byte[] {(byte) 0xaa, (byte)0xaa, 0, 0, 0, 0, 0, 0}; prefixSize = 64; /* link size */ configureIPAddress(); + new NeighborManager(this, neighborTable); } public NeighborTable getNeighborTable() { @@ -202,8 +203,8 @@ /* 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 ((nIf == linkLayerHandler || - (nIf == null)) && isOnLink(packet.getDestinationAddress())) { + if (nIf == linkLayerHandler || + (nIf == null && isOnLink(packet.getDestinationAddress()))) { if (findRoute(packet)) { linkLayerHandler.sendPacket(packet); } Modified: mspsim/se/sics/mspsim/net/IPv6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-29 13:08:40 UTC (rev 549) +++ mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-29 23:20:36 UTC (rev 550) @@ -83,6 +83,15 @@ ipLen = packetData.length - currentPos; } + public IPv6Packet(IPPayload pl) { + this(); + // copy over all the data from the packet... + // is this the right way to do this??? + nextHeader = pl.getDispatch(); + ipPayload = pl; + } + + public IPv6Packet replyPacket(IPPayload payload) { IPv6Packet ipPacket = new IPv6Packet(); ipPacket.destAddress = sourceAddress; Added: mspsim/se/sics/mspsim/net/NeighborManager.java =================================================================== --- mspsim/se/sics/mspsim/net/NeighborManager.java (rev 0) +++ mspsim/se/sics/mspsim/net/NeighborManager.java 2009-05-29 23:20:36 UTC (rev 550) @@ -0,0 +1,32 @@ +package se.sics.mspsim.net; + +public class NeighborManager implements Runnable { + + private NeighborTable neigborTable; + private IPStack ipStack; + + public NeighborManager(IPStack stack, NeighborTable table) { + neigborTable = table; + ipStack = stack; + new Thread(this).start(); + } + + public void run() { + while(true) { + try { + Thread.sleep(1000); + if (neigborTable.getDefrouter() == null) { + IPv6Packet ipp = new IPv6Packet(); + ipp.setDestinationAddress(IPStack.ALL_ROUTERS); + ICMP6Packet icmp = new ICMP6Packet(); + icmp.setType(ICMP6Packet.ROUTER_SOLICITATION); + icmp.addLinkOption(ICMP6Packet.SOURCE_LINKADDR, + ipStack.getLinkLayerAddress()); + ipStack.sendPacket(ipp, null); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } +} Modified: mspsim/se/sics/mspsim/net/UDPPacket.java =================================================================== --- mspsim/se/sics/mspsim/net/UDPPacket.java 2009-05-29 13:08:40 UTC (rev 549) +++ mspsim/se/sics/mspsim/net/UDPPacket.java 2009-05-29 23:20:36 UTC (rev 550) @@ -12,7 +12,7 @@ int destinationPort; int length; int checkSum; - public byte[] payload; + byte[] payload; public UDPPacket replyPacket() { UDPPacket udp = new UDPPacket(); @@ -20,7 +20,31 @@ udp.sourcePort = destinationPort; return udp; } - + + public byte[] getPayload() { + return payload; + } + + public void setPayload(byte[] payload) { + this.payload = payload; + } + + public int getSourcePort() { + return sourcePort; + } + + public void setSourcePort(int sourcePort) { + this.sourcePort = sourcePort; + } + + public int getDestinationPort() { + return destinationPort; + } + + public void setDestinationPort(int destinationPort) { + this.destinationPort = destinationPort; + } + public byte[] generatePacketData(IPv6Packet packet) { return null; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-29 13:09:04
|
Revision: 549 http://mspsim.svn.sourceforge.net/mspsim/?rev=549&view=rev Author: joxe Date: 2009-05-29 13:08:40 +0000 (Fri, 29 May 2009) Log Message: ----------- added tunnel testing utility Modified Paths: -------------- mspsim/se/sics/mspsim/cli/NetCommands.java mspsim/se/sics/mspsim/net/IPStack.java mspsim/se/sics/mspsim/net/TSPClient.java Added Paths: ----------- mspsim/se/sics/mspsim/util/TSPTest.java Modified: mspsim/se/sics/mspsim/cli/NetCommands.java =================================================================== --- mspsim/se/sics/mspsim/cli/NetCommands.java 2009-05-28 23:13:27 UTC (rev 548) +++ mspsim/se/sics/mspsim/cli/NetCommands.java 2009-05-29 13:08:40 UTC (rev 549) @@ -59,6 +59,7 @@ public int executeCommand(CommandContext context) { TSPClient tunnel = TSPClient.startTSPTunnel(ipStack, context.getArgument(0), context.getArgument(1), context.getArgument(2)); + ipStack.setTunnel(tunnel); if (tunnel != null) { context.out.print("TSP Tunnel started"); return 0; Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-05-28 23:13:27 UTC (rev 548) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-05-29 13:08:40 UTC (rev 549) @@ -202,13 +202,13 @@ /* 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 (nIf == linkLayerHandler || - (nIf == null) && isOnLink(packet.getDestinationAddress())) { + 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.println("*** Should go out on tunnel: " + tunnel); System.out.print("MyAddress: "); IPv6Packet.printAddress(System.out, myIPAddress); System.out.print(", Dest: "); @@ -223,21 +223,7 @@ System.out.println("IPv6 packet received!"); packet.printPacket(System.out); - 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 != null && tunnel.isReady()) { - tunnel.sendPacket(packet); - } - } else if (isForMe(packet.getDestinationAddress())){ + if (isForMe(packet.getDestinationAddress())){ System.out.println("#### PACKET FOR ME!!! " + packet.getDispatch()); switch (packet.nextHeader) { case ICMP6Packet.DISPATCH: @@ -262,6 +248,20 @@ } break; } + } else if (!isOnLink(packet.getDestinationAddress()) && + packet.netInterface != tunnel) { + System.out.println("**** Should go out on tunnel!!!!" + 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 != null && tunnel.isReady()) { + tunnel.sendPacket(packet); + } } else if (packet.netInterface != linkLayerHandler) { /* Can not be from link layer (default) -- */ /* if HC01 - we need to handle UDP at least... */ Modified: mspsim/se/sics/mspsim/net/TSPClient.java =================================================================== --- mspsim/se/sics/mspsim/net/TSPClient.java 2009-05-28 23:13:27 UTC (rev 548) +++ mspsim/se/sics/mspsim/net/TSPClient.java 2009-05-29 13:08:40 UTC (rev 549) @@ -22,7 +22,9 @@ private static final Pattern prefixPattern = Pattern.compile("(?m).+?<prefix (.+?)>(.+?)</prefix>"); - + private static final Pattern myIPPattern = + Pattern.compile("(?s).+?<client>.+?ipv6\">(.+?)</address>"); + private IPStack ipStack; WriterState writerState = WriterState.STARTED; @@ -230,6 +232,20 @@ ipStack.setPrefix(prefix, 64); } } + } else { + Matcher m = myIPPattern.matcher(sData); + if (m.find()) { + if (ipStack != null) { + System.out.println("### Got IP address: " + m.group(1)); + byte[] prefix = getPrefix(m.group(1)); + byte[] macAddr = new byte[8]; + ipStack.makeLLAddress(prefix, macAddr); + ipStack.setLinkLayerAddress(macAddr); + ipStack.setIPAddress(prefix); + } + } else { + System.out.println("NOT MATCH!!!"); + } } writerState = WriterState.TUNNEL_CONF_RECEIVED; break; Added: mspsim/se/sics/mspsim/util/TSPTest.java =================================================================== --- mspsim/se/sics/mspsim/util/TSPTest.java (rev 0) +++ mspsim/se/sics/mspsim/util/TSPTest.java 2009-05-29 13:08:40 UTC (rev 549) @@ -0,0 +1,52 @@ +package se.sics.mspsim.util; + +import se.sics.mspsim.net.AbstractPacketHandler; +import se.sics.mspsim.net.ICMP6Packet; +import se.sics.mspsim.net.IPStack; +import se.sics.mspsim.net.IPv6Packet; +import se.sics.mspsim.net.Packet; +import se.sics.mspsim.net.TSPClient; + +public class TSPTest extends AbstractPacketHandler implements Runnable { + + public byte[] GOOGLE = new byte[] { + 0x20, 0x01, 0x48, 0x60, (byte) 0xb0, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68 + }; + static IPStack ipStack; + + public static void main(String[] args) { + ipStack = new IPStack(); + TSPTest testLink = new TSPTest(); + ipStack.setLinkLayerHandler(testLink); + TSPClient tunnel = TSPClient.startTSPTunnel(ipStack, "anon.freenet6.net", null, null); + ipStack.setTunnel(tunnel); + + new Thread(testLink).start(); + + } + + public void run() { + IPv6Packet ping = new IPv6Packet(); + ping.setDestinationAddress(GOOGLE); + ping.setSourceAddress(ipStack.getIPAddress()); + ICMP6Packet icmpER = new ICMP6Packet(); + icmpER.setType(ICMP6Packet.ECHO_REQUEST); + ping.setIPPayload(icmpER); + while(true) { + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("Sending ping to google..."); + ipStack.sendPacket(ping, null); + } + } + + public void packetReceived(Packet container) { + System.out.println("Packet received from IP Stack...: " + container); + } + + 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-28 23:13:44
|
Revision: 548 http://mspsim.svn.sourceforge.net/mspsim/?rev=548&view=rev Author: joxe Date: 2009-05-28 23:13:27 +0000 (Thu, 28 May 2009) Log Message: ----------- fixed a working UDP Modified Paths: -------------- mspsim/se/sics/mspsim/net/HC01Packeter.java mspsim/se/sics/mspsim/net/IPStack.java mspsim/se/sics/mspsim/net/IPv6Packet.java mspsim/se/sics/mspsim/net/UDPPacket.java Modified: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-28 14:29:50 UTC (rev 547) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-28 23:13:27 UTC (rev 548) @@ -174,7 +174,7 @@ /* HC01 header compression from 40 bytes to less... */ public byte[] generatePacketData(IPv6Packet packet) { int enc1 = 0, enc2 = 0; - byte[] data = new byte[40]; + byte[] data = new byte[40 + 8]; int pos = 2; if (packet.flowLabel == 0) { @@ -196,9 +196,13 @@ /* Note that the payload length is always compressed */ - /* TODO: compress UDP!!! */ - data[pos++] = (byte) (packet.nextHeader & 0xff); - + /* Compress NextHeader if UDP!!! */ + if (packet.nextHeader == UDPPacket.DISPATCH) { + enc1 |= IPHC_NH_C; + } else { + data[pos++] = (byte) (packet.nextHeader & 0xff); + } + switch (packet.hopLimit) { case 1: enc1 |= IPHC_TTL_1; @@ -292,9 +296,37 @@ } } - // uncomp_hdr_len = UIP_IPH_LEN; - // TODO: add udp header compression!!! + // uncomp_hdr_len = UIP_IPH_LEN; + // TODO: add udp header compression!!! + /* UDP header compression */ + if(packet.nextHeader == UDPPacket.DISPATCH) { + UDPPacket udp = (UDPPacket) packet.getIPPayload(); + if( udp.sourcePort >= UDP_PORT_MIN && + udp.sourcePort < UDP_PORT_MAX && + udp.destinationPort >= UDP_PORT_MIN && + udp.destinationPort < UDP_PORT_MAX) { + /* we can compress. Copy compressed ports, full chcksum */ + data[pos++] = (byte) NHC_UDP_C; + data[pos++] = (byte) (((udp.sourcePort - UDP_PORT_MIN) << 4) + + (udp.destinationPort - UDP_PORT_MIN)); + int checksum = udp.doVirtualChecksum(packet); + data[pos++] = (byte) (checksum >> 8); + data[pos++] = (byte) (checksum & 0xff); + } else { + /* we cannot compress. Copy uncompressed ports, full chcksum */ + data[pos++] = (byte) NHC_UDP_I; + data[pos++] = (byte) (udp.sourcePort >> 8); + data[pos++] = (byte) (udp.sourcePort & 0xff); + data[pos++] = (byte) (udp.destinationPort >> 8); + data[pos++] = (byte) (udp.destinationPort & 0xff); + int checksum = udp.doVirtualChecksum(packet); + data[pos++] = (byte) (checksum >> 8); + data[pos++] = (byte) (checksum & 0xff); + } + } + + // data[0] = HC01_DISPATCH; - layer below does this!!! data[0] = (byte) (enc1 & 0xff); data[1] = (byte) (enc2 & 0xff); @@ -307,8 +339,15 @@ System.out.print("HC01: To "); IPv6Packet.printAddress(System.out, packet.destAddress); } - IPPayload payload = packet.getIPPayload(); - byte[] pload = payload.generatePacketData(packet); + byte[] pload; + if (packet.nextHeader == UDPPacket.DISPATCH) { + UDPPacket udp = (UDPPacket) packet.getIPPayload(); + /* already have the udp header */ + pload = udp.payload; + } else { + IPPayload payload = packet.getIPPayload(); + pload = payload.generatePacketData(packet); + } if (DEBUG) System.out.println("HC01 Payload size: " + pload.length); byte[] dataPacket = new byte[pos + pload.length]; Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-05-28 14:29:50 UTC (rev 547) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-05-28 23:13:27 UTC (rev 548) @@ -238,7 +238,7 @@ tunnel.sendPacket(packet); } } else if (isForMe(packet.getDestinationAddress())){ - System.out.println("#### PACKET FOR ME!!!"); + System.out.println("#### PACKET FOR ME!!! " + packet.getDispatch()); switch (packet.nextHeader) { case ICMP6Packet.DISPATCH: icmp6Handler.handlePacket(packet); @@ -254,10 +254,12 @@ UDPPacket p = new UDPPacket(); p.parsePacketData(packet); p.printPacket(System.out); + packet.setIPPayload(p); } if (networkEventListener != null) { + System.out.println("UDP: Notifying event listener..."); networkEventListener.packetHandled(packet); - } + } break; } } else if (packet.netInterface != linkLayerHandler) { Modified: mspsim/se/sics/mspsim/net/IPv6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-28 14:29:50 UTC (rev 547) +++ mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-28 23:13:27 UTC (rev 548) @@ -83,14 +83,29 @@ ipLen = packetData.length - currentPos; } + public IPv6Packet replyPacket(IPPayload payload) { + IPv6Packet ipPacket = new IPv6Packet(); + ipPacket.destAddress = sourceAddress; + ipPacket.ipPayload = payload; + ipPacket.nextHeader = payload.getDispatch(); + return ipPacket; + } + public byte[] getSourceAddress() { return sourceAddress; } + + public void setSourceAddress(byte[] addr) { + sourceAddress = addr; + } public byte[] getDestinationAddress() { return destAddress; } + public void setDestinationAddress(byte[] addr) { + destAddress = addr; + } public void printPacket(PrintStream out) { out.print("IPv6: from "); Modified: mspsim/se/sics/mspsim/net/UDPPacket.java =================================================================== --- mspsim/se/sics/mspsim/net/UDPPacket.java 2009-05-28 14:29:50 UTC (rev 547) +++ mspsim/se/sics/mspsim/net/UDPPacket.java 2009-05-28 23:13:27 UTC (rev 548) @@ -12,8 +12,15 @@ int destinationPort; int length; int checkSum; - byte[] payload; + public byte[] payload; + public UDPPacket replyPacket() { + UDPPacket udp = new UDPPacket(); + udp.destinationPort = sourcePort; + udp.sourcePort = destinationPort; + return udp; + } + public byte[] generatePacketData(IPv6Packet packet) { return null; } @@ -31,7 +38,7 @@ public void parsePacketData(IPv6Packet packet) { sourcePort = packet.get16(0); destinationPort = packet.get16(2); - length = packet.get16(4); + int length = packet.get16(4); checkSum = packet.get16(6); System.out.println("UDP Length: " + length); @@ -58,15 +65,18 @@ // TODO: HC01 should instead insert this data into the UDP packet so // that there is no need for special handling- - public void doVirtualChecksum(IPv6Packet packet) { - int sum = packet.upperLayerHeaderChecksum(); + public int doVirtualChecksum(IPv6Packet packet) { byte[] vheader = new byte[8]; + int length = payload.length + 8; vheader[0] = (byte) (sourcePort >> 8); vheader[1] = (byte) (sourcePort & 0xff); vheader[2] = (byte) (destinationPort >> 8); vheader[3] = (byte) (destinationPort & 0xff); vheader[4] = (byte) (length >> 8); vheader[5] = (byte) (length & 0xff); + + packet.payloadLen = length; + int sum = packet.upperLayerHeaderChecksum(); sum = IPv6Packet.checkSum(sum, vheader, 8); sum = IPv6Packet.checkSum(sum, payload, payload.length); @@ -77,5 +87,6 @@ System.out.println("UDP: Checksum error: " + Utils.hex16(checkSum) + " <?> " + Utils.hex16(sum)); } + return sum; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-28 14:30:03
|
Revision: 547 http://mspsim.svn.sourceforge.net/mspsim/?rev=547&view=rev Author: joxe Date: 2009-05-28 14:29:50 +0000 (Thu, 28 May 2009) Log Message: ----------- fixed UPD checksum Modified Paths: -------------- mspsim/se/sics/mspsim/net/HC01Packeter.java mspsim/se/sics/mspsim/net/IPStack.java Modified: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-28 12:22:23 UTC (rev 546) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-28 14:29:50 UTC (rev 547) @@ -561,6 +561,8 @@ /* the rest is only the payload */ udp.payload = packet.getPayload(); udp.length = udp.payload.length + 8; + /* add 8 to the payload length of the UDP packet */ + packet.payloadLen += 8; udp.doVirtualChecksum(packet); packet.setIPPayload(udp); } Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-05-28 12:22:23 UTC (rev 546) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-05-28 14:29:50 UTC (rev 547) @@ -255,6 +255,9 @@ p.parsePacketData(packet); p.printPacket(System.out); } + if (networkEventListener != null) { + networkEventListener.packetHandled(packet); + } break; } } else if (packet.netInterface != linkLayerHandler) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-28 12:54:41
|
Revision: 546 http://mspsim.svn.sourceforge.net/mspsim/?rev=546&view=rev Author: joxe Date: 2009-05-28 12:22:23 +0000 (Thu, 28 May 2009) Log Message: ----------- added UDP Modified Paths: -------------- mspsim/se/sics/mspsim/net/BytePayload.java mspsim/se/sics/mspsim/net/HC01Packeter.java mspsim/se/sics/mspsim/net/IPPayload.java mspsim/se/sics/mspsim/net/IPStack.java Added Paths: ----------- mspsim/se/sics/mspsim/net/UDPPacket.java Modified: mspsim/se/sics/mspsim/net/BytePayload.java =================================================================== --- mspsim/se/sics/mspsim/net/BytePayload.java 2009-05-28 09:47:38 UTC (rev 545) +++ mspsim/se/sics/mspsim/net/BytePayload.java 2009-05-28 12:22:23 UTC (rev 546) @@ -1,5 +1,7 @@ package se.sics.mspsim.net; +import java.io.PrintStream; + /* keep the packet payload untouched ... */ public class BytePayload implements IPPayload { @@ -22,4 +24,7 @@ dispatch = packet.getDispatch(); payloadData = packet.getPayload(); } + + public void printPacket(PrintStream out) { + } } Modified: mspsim/se/sics/mspsim/net/HC01Packeter.java =================================================================== --- mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-28 09:47:38 UTC (rev 545) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-28 12:22:23 UTC (rev 546) @@ -42,6 +42,8 @@ */ package se.sics.mspsim.net; + + import se.sics.mspsim.util.Utils; public class HC01Packeter implements IPPacketer { @@ -325,6 +327,7 @@ public void parsePacketData(IPv6Packet packet) { /* first two is ... */ + UDPPacket udp = null; int pos = 2; int enc1 = packet.getData(0); int enc2 = packet.getData(1); @@ -525,9 +528,10 @@ 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); + udp = new UDPPacket(); + udp.sourcePort = srcPort; + udp.destinationPort = destPort; + udp.checkSum = checkSum; } } @@ -551,6 +555,15 @@ System.out.println(); // packet.setPayload(data, 40, ???); packet.payloadLen = packet.getPayloadLength(); + + if (udp != null) { + /* if we have a udp payload we already have the udp headers in place */ + /* the rest is only the payload */ + udp.payload = packet.getPayload(); + udp.length = udp.payload.length + 8; + udp.doVirtualChecksum(packet); + packet.setIPPayload(udp); + } } private boolean isMulticastCompressable(byte[] address) { Modified: mspsim/se/sics/mspsim/net/IPPayload.java =================================================================== --- mspsim/se/sics/mspsim/net/IPPayload.java 2009-05-28 09:47:38 UTC (rev 545) +++ mspsim/se/sics/mspsim/net/IPPayload.java 2009-05-28 12:22:23 UTC (rev 546) @@ -1,5 +1,7 @@ package se.sics.mspsim.net; +import java.io.PrintStream; + public interface IPPayload { public byte getDispatch(); @@ -12,5 +14,7 @@ * Call this to parse the IP packet */ public void parsePacketData(IPv6Packet packet); + + public void printPacket(PrintStream out); } Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-05-28 09:47:38 UTC (rev 545) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-05-28 12:22:23 UTC (rev 546) @@ -246,6 +246,16 @@ networkEventListener.packetHandled(packet); } break; + case UDPPacket.DISPATCH: + // TODO: move to HC01 compression handler... => generate raw UDP + if (packet.getIPPayload() != null) { + packet.getIPPayload().printPacket(System.out); + } else { + UDPPacket p = new UDPPacket(); + p.parsePacketData(packet); + p.printPacket(System.out); + } + break; } } else if (packet.netInterface != linkLayerHandler) { /* Can not be from link layer (default) -- */ Added: mspsim/se/sics/mspsim/net/UDPPacket.java =================================================================== --- mspsim/se/sics/mspsim/net/UDPPacket.java (rev 0) +++ mspsim/se/sics/mspsim/net/UDPPacket.java 2009-05-28 12:22:23 UTC (rev 546) @@ -0,0 +1,81 @@ +package se.sics.mspsim.net; + +import java.io.PrintStream; + +import se.sics.mspsim.util.Utils; + +public class UDPPacket implements IPPayload { + + public final static int DISPATCH = 17; + + int sourcePort; + int destinationPort; + int length; + int checkSum; + byte[] payload; + + public byte[] generatePacketData(IPv6Packet packet) { + return null; + } + + public byte getDispatch() { + return DISPATCH; + } + + public void printPacket(PrintStream out) { + out.println("UDP Packet srcPort: " + sourcePort + + " destPort: " + destinationPort); + out.println("UDP length: " + length); + } + + public void parsePacketData(IPv6Packet packet) { + sourcePort = packet.get16(0); + destinationPort = packet.get16(2); + length = packet.get16(4); + checkSum = packet.get16(6); + + System.out.println("UDP Length: " + length); + System.out.println("UDP payload length: " + packet.getPayloadLength()); + /* this will *crash* if packet does not contain all data */ + payload = new byte[length - 8]; + /* length is total UDP length */ + packet.copy(8, payload, 0, length - 8); + + /* checksum */ + packet.setData(2, (byte) 0); + packet.setData(3, (byte) 0); + byte[] data = packet.getPayload(); + int sum = packet.upperLayerHeaderChecksum(); + sum = IPv6Packet.checkSum(sum, data, data.length); + sum = (~sum) & 0xffff; + if (sum == checkSum) { + System.out.println("UDP: Checksum matches!!!"); + } else { + System.out.println("UDP: Checksum error: " + + Utils.hex16(checkSum) + " <?> " + Utils.hex16(sum)); + } + } + + // TODO: HC01 should instead insert this data into the UDP packet so + // that there is no need for special handling- + public void doVirtualChecksum(IPv6Packet packet) { + int sum = packet.upperLayerHeaderChecksum(); + byte[] vheader = new byte[8]; + vheader[0] = (byte) (sourcePort >> 8); + vheader[1] = (byte) (sourcePort & 0xff); + vheader[2] = (byte) (destinationPort >> 8); + vheader[3] = (byte) (destinationPort & 0xff); + vheader[4] = (byte) (length >> 8); + vheader[5] = (byte) (length & 0xff); + + sum = IPv6Packet.checkSum(sum, vheader, 8); + sum = IPv6Packet.checkSum(sum, payload, payload.length); + sum = (~sum) & 0xffff; + if (sum == checkSum) { + System.out.println("UDP: Checksum matches!!!"); + } else { + System.out.println("UDP: Checksum error: " + + Utils.hex16(checkSum) + " <?> " + Utils.hex16(sum)); + } + } +} Property changes on: mspsim/se/sics/mspsim/net/UDPPacket.java ___________________________________________________________________ Added: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-28 09:47:46
|
Revision: 545 http://mspsim.svn.sourceforge.net/mspsim/?rev=545&view=rev Author: joxe Date: 2009-05-28 09:47:38 +0000 (Thu, 28 May 2009) Log Message: ----------- fixed TSP client to strip additional data when tunnel is up Modified Paths: -------------- mspsim/se/sics/mspsim/net/TSPClient.java Modified: mspsim/se/sics/mspsim/net/TSPClient.java =================================================================== --- mspsim/se/sics/mspsim/net/TSPClient.java 2009-05-27 23:12:18 UTC (rev 544) +++ mspsim/se/sics/mspsim/net/TSPClient.java 2009-05-28 09:47:38 UTC (rev 545) @@ -263,21 +263,24 @@ } 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++; + byte[] pData; + if (writerState != WriterState.TUNNEL_UP) { + 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); - System.arraycopy(packetData, 0, pData, 8, packetData.length); - + 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); + } else { + pData = packetData; + } DatagramPacket packet = new DatagramPacket(pData, pData.length, serverAddr, DEFAULT_PORT); connection.send(packet); System.out.println("Packet sent... " + pData.length + " => C:" + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-27 23:12:19
|
Revision: 544 http://mspsim.svn.sourceforge.net/mspsim/?rev=544&view=rev Author: joxe Date: 2009-05-27 23:12:18 +0000 (Wed, 27 May 2009) Log Message: ----------- Added Paths: ----------- mspsim/se/sics/mspsim/net/Neighbor.java mspsim/se/sics/mspsim/net/NeighborTable.java mspsim/se/sics/mspsim/net/NetworkEventListener.java Added: mspsim/se/sics/mspsim/net/Neighbor.java =================================================================== --- mspsim/se/sics/mspsim/net/Neighbor.java (rev 0) +++ mspsim/se/sics/mspsim/net/Neighbor.java 2009-05-27 23:12:18 UTC (rev 544) @@ -0,0 +1,29 @@ +package se.sics.mspsim.net; + +public class Neighbor { + + public static final int INCOMPLETE = 0; + public static final int REACHABLE = 1; + public static final int STALE = 2; + public static final int DELAY = 3; + public static final int PROBE = 4; + public static final int NO_STATE = 5; + + + byte[] ipAddress; + byte[] linkAddress; + NetworkInterface netInterface; + int state = INCOMPLETE; + + public byte[] getIpAddress() { + return ipAddress; + } + + public void setIpAddress(byte[] ipAddress) { + this.ipAddress = ipAddress; + } + + public void setState(int state) { + this.state = state; + } +} Added: mspsim/se/sics/mspsim/net/NeighborTable.java =================================================================== --- mspsim/se/sics/mspsim/net/NeighborTable.java (rev 0) +++ mspsim/se/sics/mspsim/net/NeighborTable.java 2009-05-27 23:12:18 UTC (rev 544) @@ -0,0 +1,59 @@ +/** + * + */ +package se.sics.mspsim.net; + +import java.util.Vector; +import se.sics.mspsim.util.Utils; + +/** + * @author joakim + * + */ +public class NeighborTable { + // currently supports max 64 neighbors... + Neighbor[] neighbors = new Neighbor[64]; + int neighborCount = 0; + + Neighbor defrouter; + + public synchronized Neighbor addNeighbor(byte[] ipAddress, byte[] linkAddress) { + Neighbor nb = new Neighbor(); + nb.ipAddress = ipAddress; + nb.linkAddress = linkAddress; + nb.state = Neighbor.INCOMPLETE; + neighbors[neighborCount++] = nb; + return nb; + } + + public Neighbor getDefrouter() { + return defrouter; + } + + public void setDefrouter(Neighbor neighbor) { + defrouter = neighbor; + } + + public synchronized boolean removeNeighbor(Neighbor nb) { + for (int i = 0; i < neighborCount; i++) { + if (nb == neighbors[i]) { + // move last element forward to this position... + neighbors[i] = neighbors[neighborCount - 1]; + neighborCount--; + return true; + } + } + return false; + } + + public Neighbor getNeighbor(byte[] ipAddress) { + int neighborCount0 = neighborCount; + Neighbor[] neis = neighbors; + for (int i = 0; i < neighborCount0; i++) { + if (Utils.equals(ipAddress, neis[i].ipAddress)) { + return neis[i]; + } + } + return null; + } +} Added: mspsim/se/sics/mspsim/net/NetworkEventListener.java =================================================================== --- mspsim/se/sics/mspsim/net/NetworkEventListener.java (rev 0) +++ mspsim/se/sics/mspsim/net/NetworkEventListener.java 2009-05-27 23:12:18 UTC (rev 544) @@ -0,0 +1,7 @@ +package se.sics.mspsim.net; + +public interface NetworkEventListener { + + public void packetHandled(IPv6Packet packet); + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-27 23:11:14
|
Revision: 543 http://mspsim.svn.sourceforge.net/mspsim/?rev=543&view=rev Author: joxe Date: 2009-05-27 23:11:12 +0000 (Wed, 27 May 2009) Log Message: ----------- fixed initial neighbor table for IPv6 stack Modified Paths: -------------- mspsim/se/sics/mspsim/cli/NetCommands.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 Modified: mspsim/se/sics/mspsim/cli/NetCommands.java =================================================================== --- mspsim/se/sics/mspsim/cli/NetCommands.java 2009-05-27 11:45:49 UTC (rev 542) +++ mspsim/se/sics/mspsim/cli/NetCommands.java 2009-05-27 23:11:12 UTC (rev 543) @@ -33,6 +33,7 @@ listener.addUpperLayerHandler(0, ieeeHandler); ieeeHandler.setLowerLayerHandler(listener); ipStack = new IPStack(); + ipStack.setRouter(true); LoWPANHandler lowpanHandler = new LoWPANHandler(); lowpanHandler.setIPStack(ipStack); ieeeHandler.addUpperLayerHandler(0, lowpanHandler); Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-27 11:45:49 UTC (rev 542) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-27 23:11:12 UTC (rev 543) @@ -37,6 +37,7 @@ "NEIGHBOR_SOLICITATION", "NEIGHBOR_ADVERTISEMENT"}; int type; + int code; int checksum; byte[] targetAddress; @@ -94,6 +95,20 @@ System.arraycopy(llAddr, 0, opt, 2, llAddr.length); options.addElement(opt); } + + public int getType() { + return type; + } + public void setType(int type) { + this.type = type; + } + + public int getFlags() { + return flags; + } + public void setFlags(int flags) { + this.flags = flags; + } public byte[] getOption(int type) { for (int i = 0; i < options.size(); i++) { Modified: mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-27 11:45:49 UTC (rev 542) +++ mspsim/se/sics/mspsim/net/ICMP6PacketHandler.java 2009-05-27 23:11:12 UTC (rev 543) @@ -11,6 +11,7 @@ public void handlePacket(IPv6Packet packet) { ICMP6Packet icmpPacket = new ICMP6Packet(); icmpPacket.parsePacketData(packet); + packet.setIPPayload(icmpPacket); icmpPacket.printPacket(System.out); @@ -23,17 +24,18 @@ p.type = ICMP6Packet.ECHO_REPLY; p.seqNo = icmpPacket.seqNo; p.id = icmpPacket.id; - + p.echoData = icmpPacket.echoData; ipp = new IPv6Packet(); ipp.setIPPayload(p); // is this ok? ipp.destAddress = packet.sourceAddress; - ipp.sourceAddress = ipStack.myLocalIPAddress; + ipp.sourceAddress = ipStack.myIPAddress; + ipStack.sendPacket(ipp, packet.netInterface); break; case ICMP6Packet.ECHO_REPLY: System.out.println("ICMP6 got echo reply!!"); - break; + break; case ICMP6Packet.NEIGHBOR_SOLICITATION: p = new ICMP6Packet(); p.targetAddress = icmpPacket.targetAddress; @@ -43,13 +45,20 @@ if (ipStack.isRouter()) { p.flags |= ICMP6Packet.FLAG_ROUTER; } - /* always send the linkaddr option */ + /* always send the linkaddr option */ p.addLinkOption(ICMP6Packet.TARGET_LINKADDR, ipStack.getLinkLayerAddress()); ipp = new IPv6Packet(); ipp.setIPPayload(p); // is this ok? ipp.destAddress = packet.sourceAddress; - ipp.sourceAddress = ipStack.myLocalIPAddress; + if (ipp.destAddress[0] == 0xfe && ipp.destAddress[1] == 0x80) { + System.out.print("**** Dest address is link local: "); + IPv6Packet.printAddress(System.out, ipp.destAddress); + System.out.println(); + ipp.sourceAddress = ipStack.myLocalIPAddress; + } else { + ipp.sourceAddress = ipStack.myIPAddress; + } ipStack.sendPacket(ipp, packet.netInterface); break; case ICMP6Packet.ROUTER_SOLICITATION: @@ -76,6 +85,23 @@ ipStack.sendPacket(ipp, packet.netInterface); } break; + case ICMP6Packet.ROUTER_ADVERTISEMENT: + if (!ipStack.isRouter()) { + byte[] prefixInfo = icmpPacket.getOption(ICMP6Packet.PREFIX_INFO); + if (prefixInfo != null) { + byte[] prefix = new byte[16]; + System.arraycopy(prefixInfo, 16, prefix, 0, prefix.length); + int size = prefixInfo[2]; + ipStack.setPrefix(prefix, size); + + System.out.println("Adding router as neighbor!!!"); + NeighborTable nt = ipStack.getNeighborTable(); + Neighbor nei = nt.addNeighbor(packet.sourceAddress, packet.getLinkSource()); + nt.setDefrouter(nei); + nei.setState(Neighbor.REACHABLE); + } + } + break; } } } Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-05-27 11:45:49 UTC (rev 542) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-05-27 23:11:12 UTC (rev 543) @@ -62,9 +62,15 @@ byte[] myLocalIPAddress = new byte[] { (byte)0xfe, (byte)0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00}; + + byte[] myLocalSolicited = new byte[] {(byte) 0xff, 0x02, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0x01, (byte) 0xff, 0, 0, 0}; + /* currently assumes only one link-layer and one address */ byte[] myLinkAddress = new byte[] {0x00, 0x12, 0x75, 0x04, 0x05, 0x06, 0x07, 0x08}; + + byte[] linkBroadcast = new byte[] {(byte) 0xff, (byte) 0xff}; private PacketHandler linkLayerHandler; @@ -72,13 +78,16 @@ private ICMP6PacketHandler icmp6Handler; /* is router -> router behavior */ - private boolean isRouter = true; + private boolean isRouter = false; private NetworkInterface tunnel; //TSPClient /* this needs to be generalized later... and down to lowpan too... */ //private HC01Packeter ipPacketer = new HC01Packeter(); + private NeighborTable neighborTable = new NeighborTable(); + private NetworkEventListener networkEventListener; + // TODO: read from configfile... public IPStack() { @@ -88,10 +97,18 @@ configureIPAddress(); } + public NeighborTable getNeighborTable() { + return neighborTable; + } + public void setLinkLayerHandler(PacketHandler handler) { linkLayerHandler = handler; } + public void setNetworkEventListener(NetworkEventListener li) { + networkEventListener = li; + } + public void setTunnel(NetworkInterface tunnel) { this.tunnel = tunnel; } @@ -127,6 +144,11 @@ } /* autoconfig ?? */ myLocalIPAddress[8] = myIPAddress[8] = (byte) (myIPAddress[8] ^ 0x02); + + /* create multicast solicited address */ + for (int i = 13; i < 16; i++) { + myLocalSolicited[i] = myIPAddress[i]; + } System.out.print("***** Configured IP address: "); IPv6Packet.printAddress(System.out, myIPAddress); @@ -134,6 +156,9 @@ System.out.print("***** Configured Local IP address: "); IPv6Packet.printAddress(System.out, myLocalIPAddress); System.out.println(); + System.out.print("***** Configured Solicited IP address: "); + IPv6Packet.printAddress(System.out, myLocalSolicited); + System.out.println(); } private boolean findRoute(IPv6Packet packet) { @@ -142,12 +167,24 @@ /* find a MAC address for this packets destination... */ byte[] destAddr = packet.getDestinationAddress(); /* is it a bc to all nodes? */ - if (Utils.equals(ALL_NODES, destAddr)) { + if (Utils.equals(ALL_ROUTERS, destAddr)) { packet.setAttribute("link.destination", linkBroadcast); + } else if (Utils.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); + byte[] destMAC; + Neighbor n = neighborTable.getNeighbor(destAddr); + if (n == null) { + if (neighborTable.getDefrouter() != null) { + destMAC = neighborTable.getDefrouter().linkAddress; + } else { + /* fill the array with a autoconf address ... */ + destMAC = new byte[8]; + makeLLAddress(destAddr, destMAC); + } + } else { + destMAC = n.linkAddress; + } packet.setAttribute("link.destination", destMAC); } } @@ -205,6 +242,9 @@ switch (packet.nextHeader) { case ICMP6Packet.DISPATCH: icmp6Handler.handlePacket(packet); + if (networkEventListener != null) { + networkEventListener.packetHandled(packet); + } break; } } else if (packet.netInterface != linkLayerHandler) { @@ -227,7 +267,8 @@ System.out.print("=== is for me? "); IPv6Packet.printAddress(System.out, address); if (Utils.equals(myIPAddress, address) || - Utils.equals(myLocalIPAddress, address)) return true; + Utils.equals(myLocalIPAddress, address) || + Utils.equals(myLocalSolicited, address)) return true; if (isRouter && Utils.equals(ALL_ROUTERS, address)) return true; if (Utils.equals(ALL_NODES, address)) return true; if (Utils.equals(UNSPECIFIED, address)) return true; @@ -263,6 +304,10 @@ return defaultPacketer; } + public void setRouter(boolean isRouter) { + this.isRouter = isRouter; + } + public boolean isRouter() { return isRouter ; } Modified: mspsim/se/sics/mspsim/net/IPv6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-27 11:45:49 UTC (rev 542) +++ mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-27 23:11:12 UTC (rev 543) @@ -72,10 +72,9 @@ flowLabel = 0; hopLimit = 255; } - + public IPv6Packet(Packet packet) { - version = 6; - flowLabel = 0; + this(); // copy over all the data from the packet... // is this the right way to do this??? this.currentPos = packet.currentPos; @@ -83,7 +82,7 @@ this.packetData = packet.packetData; ipLen = packetData.length - currentPos; } - + public byte[] getSourceAddress() { return sourceAddress; } @@ -91,7 +90,8 @@ public byte[] getDestinationAddress() { return destAddress; } - + + public void printPacket(PrintStream out) { out.print("IPv6: from "); printAddress(out, sourceAddress); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-27 11:46:00
|
Revision: 542 http://mspsim.svn.sourceforge.net/mspsim/?rev=542&view=rev Author: joxe Date: 2009-05-27 11:45:49 +0000 (Wed, 27 May 2009) Log Message: ----------- fixed timer bug Modified Paths: -------------- mspsim/se/sics/mspsim/core/MSP430Core.java mspsim/se/sics/mspsim/core/Timer.java Modified: mspsim/se/sics/mspsim/core/MSP430Core.java =================================================================== --- mspsim/se/sics/mspsim/core/MSP430Core.java 2009-05-27 09:47:39 UTC (rev 541) +++ mspsim/se/sics/mspsim/core/MSP430Core.java 2009-05-27 11:45:49 UTC (rev 542) @@ -166,7 +166,9 @@ } memIn[Timer.TAIV] = ta; + memOut[Timer.TAIV] = ta; memIn[Timer.TBIV] = tb; + memOut[Timer.TBIV] = tb; bcs = new BasicClockModule(this, memory, 0, new Timer[] {ta, tb}); for (int i = 0x56, n = 0x59; i < n; i++) { Modified: mspsim/se/sics/mspsim/core/Timer.java =================================================================== --- mspsim/se/sics/mspsim/core/Timer.java 2009-05-27 09:47:39 UTC (rev 541) +++ mspsim/se/sics/mspsim/core/Timer.java 2009-05-27 11:45:49 UTC (rev 542) @@ -373,6 +373,16 @@ // This does not handle word/byte difference yet... assumes it gets // all 16 bits when called!!! + if (address == TAIV || address == TBIV) { + // should clear registers for cause of interrupt (highest value)? + // but what if a higher value have been triggered since this was + // triggered??? -> does that matter??? + // But this mess the TIV up too early...... + // Must DELAY the reset of interrupt flags until next read...? + resetTIV(cycles); + } + + int iAddress = address - offset; switch (iAddress) { @@ -388,7 +398,6 @@ updateCyclesMultiplicator(); - if ((data & TCLR) != 0) { counter = 0; resetCounter(cycles); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-27 09:47:47
|
Revision: 541 http://mspsim.svn.sourceforge.net/mspsim/?rev=541&view=rev Author: joxe Date: 2009-05-27 09:47:39 +0000 (Wed, 27 May 2009) Log Message: ----------- minor bugfix in timer Modified Paths: -------------- mspsim/se/sics/mspsim/core/Timer.java Modified: mspsim/se/sics/mspsim/core/Timer.java =================================================================== --- mspsim/se/sics/mspsim/core/Timer.java 2009-05-26 12:24:25 UTC (rev 540) +++ mspsim/se/sics/mspsim/core/Timer.java 2009-05-27 09:47:39 UTC (rev 541) @@ -640,13 +640,21 @@ counter = (int) (bigCounter & 0xffff); break; case UP: - counter = (int) (bigCounter % tccr[0]); + if (tccr[0] == 0) { + counter = 0; + } else { + counter = (int) (bigCounter % tccr[0]); + } break; case UPDWN: - counter = (int) (bigCounter % (tccr[0] * 2)); - if (counter > tccr[0]) { - // Should back down to start again! - counter = 2 * tccr[0] - counter; + if (tccr[0] == 0) { + counter = 0; + } else { + counter = (int) (bigCounter % (tccr[0] * 2)); + if (counter > tccr[0]) { + // Should back down to start again! + counter = 2 * tccr[0] - counter; + } } } // System.out.println("CounterStart: " + counterStart + " C:" + cycles + " bigCounter: " + bigCounter + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-26 13:22:19
|
Revision: 539 http://mspsim.svn.sourceforge.net/mspsim/?rev=539&view=rev Author: joxe Date: 2009-05-26 12:18:47 +0000 (Tue, 26 May 2009) Log Message: ----------- refactoring for 1.3 compliance of net classes Modified Paths: -------------- mspsim/se/sics/mspsim/cli/NetCommands.java mspsim/se/sics/mspsim/core/Chip.java mspsim/se/sics/mspsim/core/MSP430.java mspsim/se/sics/mspsim/net/AbstractPacketHandler.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/IEEE802154Handler.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/NetworkInterface.java mspsim/se/sics/mspsim/net/Packet.java mspsim/se/sics/mspsim/net/TSPClient.java mspsim/se/sics/mspsim/util/NetworkConnection.java mspsim/se/sics/mspsim/util/Utils.java Modified: mspsim/se/sics/mspsim/cli/NetCommands.java =================================================================== --- mspsim/se/sics/mspsim/cli/NetCommands.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/cli/NetCommands.java 2009-05-26 12:18:47 UTC (rev 539) @@ -8,6 +8,7 @@ import se.sics.mspsim.net.IEEE802154Handler; import se.sics.mspsim.net.IPStack; import se.sics.mspsim.net.LoWPANHandler; +import se.sics.mspsim.net.TSPClient; import se.sics.mspsim.util.ComponentRegistry; import se.sics.mspsim.util.Utils; @@ -32,7 +33,8 @@ listener.addUpperLayerHandler(0, ieeeHandler); ieeeHandler.setLowerLayerHandler(listener); ipStack = new IPStack(); - LoWPANHandler lowpanHandler = new LoWPANHandler(ipStack); + LoWPANHandler lowpanHandler = new LoWPANHandler(); + lowpanHandler.setIPStack(ipStack); ieeeHandler.addUpperLayerHandler(0, lowpanHandler); lowpanHandler.setLowerLayerHandler(ieeeHandler); ipStack.setLinkLayerHandler(lowpanHandler); @@ -54,8 +56,9 @@ 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))) { + TSPClient tunnel = TSPClient.startTSPTunnel(ipStack, context.getArgument(0), + context.getArgument(1), context.getArgument(2)); + if (tunnel != null) { context.out.print("TSP Tunnel started"); return 0; } else { Modified: mspsim/se/sics/mspsim/core/Chip.java =================================================================== --- mspsim/se/sics/mspsim/core/Chip.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/core/Chip.java 2009-05-26 12:18:47 UTC (rev 539) @@ -41,7 +41,7 @@ package se.sics.mspsim.core; import java.io.PrintStream; -import se.sics.mspsim.util.Utils; +import se.sics.mspsim.util.ArrayUtils; /** * @author Joakim @@ -59,11 +59,11 @@ protected boolean DEBUG = false; public void addOperatingModeListener(OperatingModeListener listener) { - omListeners = (OperatingModeListener[]) Utils.add(OperatingModeListener.class, omListeners, listener); + omListeners = (OperatingModeListener[]) ArrayUtils.add(OperatingModeListener.class, omListeners, listener); } public void removeOperatingModeListener(OperatingModeListener listener) { - omListeners = (OperatingModeListener[]) Utils.remove(omListeners, listener); + omListeners = (OperatingModeListener[]) ArrayUtils.remove(omListeners, listener); } public int getMode() { Modified: mspsim/se/sics/mspsim/core/MSP430.java =================================================================== --- mspsim/se/sics/mspsim/core/MSP430.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/core/MSP430.java 2009-05-26 12:18:47 UTC (rev 539) @@ -316,11 +316,11 @@ } public synchronized void addSimEventListener(SimEventListener l) { - simEventListeners = (SimEventListener[]) Utils.add(SimEventListener.class, simEventListeners, l); + simEventListeners = (SimEventListener[]) ArrayUtils.add(SimEventListener.class, simEventListeners, l); } public synchronized void removeSimEventListener(SimEventListener l) { - simEventListeners = (SimEventListener[]) Utils.remove(simEventListeners, l); + simEventListeners = (SimEventListener[]) ArrayUtils.remove(simEventListeners, l); } } Modified: mspsim/se/sics/mspsim/net/AbstractPacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/AbstractPacketHandler.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/net/AbstractPacketHandler.java 2009-05-26 12:18:47 UTC (rev 539) @@ -41,13 +41,13 @@ package se.sics.mspsim.net; import java.io.PrintStream; -import java.util.ArrayList; +import java.util.Vector; public abstract class AbstractPacketHandler implements PacketHandler { boolean debug = true; - ArrayList upperLayers = new ArrayList(); + Vector upperLayers = new Vector(); PacketHandler lowerLayer; public PacketHandler getLowerLayerHandler() { @@ -58,7 +58,7 @@ PacketHandlerDispatch layer = new PacketHandlerDispatch(); layer.dispatch = protoID; layer.packetHandler = handler; - upperLayers.add(layer); + upperLayers.addElement(layer); } public void setLowerLayerHandler(PacketHandler handler) { @@ -72,14 +72,14 @@ } if (dispatch != -1) { for (int i = 0; i < upperLayers.size(); i++) { - if (((PacketHandlerDispatch)upperLayers.get(i)).dispatch == dispatch) { - ((PacketHandlerDispatch)upperLayers.get(i)).packetHandler.packetReceived(packet); + if (((PacketHandlerDispatch)upperLayers.elementAt(i)).dispatch == dispatch) { + ((PacketHandlerDispatch)upperLayers.elementAt(i)).packetHandler.packetReceived(packet); return; } } System.out.println("**** no dispatch handler for " + dispatch + " found..."); } else if (upperLayers.size() > 0){ - ((PacketHandlerDispatch)upperLayers.get(0)).packetHandler.packetReceived(packet); + ((PacketHandlerDispatch)upperLayers.elementAt(0)).packetHandler.packetReceived(packet); } } Modified: mspsim/se/sics/mspsim/net/CC2420PacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/CC2420PacketHandler.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/net/CC2420PacketHandler.java 2009-05-26 12:18:47 UTC (rev 539) @@ -113,7 +113,7 @@ 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); + out.print(Utils.hex8(packet.getData(i) & 0xff)); if ((i & 3) == 3) { out.print(" "); } @@ -138,8 +138,8 @@ 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]); + System.out.print(Utils.hex8(buffer[i])); + out.print(Utils.hex8(buffer[i])); } /* 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-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/net/HC01Packeter.java 2009-05-26 12:18:47 UTC (rev 539) @@ -405,13 +405,13 @@ /* 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); + Utils.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); + Utils.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); @@ -473,7 +473,7 @@ } 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); + Utils.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); Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-26 12:18:47 UTC (rev 539) @@ -1,6 +1,6 @@ package se.sics.mspsim.net; import java.io.PrintStream; -import java.util.ArrayList; +import java.util.Vector; import se.sics.mspsim.util.Utils; @@ -54,7 +54,8 @@ byte[] echoData; - private ArrayList options = new ArrayList(); + // for 1.3 compatibility + private Vector options = new Vector(); /* prefix info option - type = 3, len = 4 (64x4 bits), prefix = 64 bits */ private final static byte[] defaultPrefixInfo = @@ -71,13 +72,13 @@ void updateRA(IPStack stack) { byte[] llAddr = stack.getLinkLayerAddress(); - options.clear(); + options.removeAllElements(); 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); + options.addElement(prefixInfo); + options.addElement(mtuOption); addLinkOption(SOURCE_LINKADDR, llAddr); } @@ -91,13 +92,13 @@ opt[0] = (byte) type; opt[1] = (byte) (opt.length / 8); System.arraycopy(llAddr, 0, opt, 2, llAddr.length); - options.add(opt); + options.addElement(opt); } public byte[] getOption(int type) { for (int i = 0; i < options.size(); i++) { - if (((byte[])options.get(i))[0] == type) { - return (byte[]) options.get(i); + if (((byte[])options.elementAt(i))[0] == type) { + return (byte[]) options.elementAt(i); } } return null; @@ -119,8 +120,8 @@ typeS = TYPE_NAME[tS]; } } - out.printf("ICMPv6 Type: %d (%s) Code: %d id: %04x seq: %04x\n", type, typeS, - code, id, seqNo); + out.println("ICMPv6 Type: " + type + " (" + typeS + ") Code: " + code + " id: " + + id + " seq: " + seqNo); if (targetAddress != null) { out.print("ICMPv6 Target address: "); IPv6Packet.printAddress(out, targetAddress); @@ -139,7 +140,7 @@ int bytes = bits / 8; out.print("RA Prefix: "); for (int i = 0; i < bytes; i++) { - out.printf("%02x", prefixInfo[16 + i]); + out.print(Utils.hex8(prefixInfo[16 + i])); if ((i & 1) == 1) out.print(":"); } out.println("/" + bits); @@ -205,7 +206,8 @@ if (sum == checksum) { System.out.println("ICMPv6: Checksum matches!!!"); } else { - System.out.printf("ICMPv6: Checksum error: %04x <?> %04x\n", checksum, sum); + System.out.println("ICMPv6: Checksum error: " + + Utils.hex16(checksum) + " <?> " + Utils.hex16(sum)); } } } @@ -221,7 +223,7 @@ if (oSize == 0) return; byte[] option = new byte[oSize]; packet.copy(pos, option, 0, oSize); - options.add(option); + options.addElement(option); pos += oSize; } } @@ -290,7 +292,7 @@ private int addOptions(byte[] buffer, int pos) { for (int i = 0; i < options.size(); i++) { - byte[] option = (byte[]) options.get(i); + byte[] option = (byte[]) options.elementAt(i); System.out.println("Adding option: " + option[0] + " len: " + option[1] + "/" + option.length + " at " + pos); System.arraycopy(option, 0, buffer, pos, option.length); Modified: mspsim/se/sics/mspsim/net/IEEE802154Handler.java =================================================================== --- mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-26 12:18:47 UTC (rev 539) @@ -41,8 +41,9 @@ package se.sics.mspsim.net; import java.io.PrintStream; -import java.util.Arrays; +import se.sics.mspsim.util.Utils; + public class IEEE802154Handler extends AbstractPacketHandler { public static final String SOURCE_PAN_ID = "802154.sourcePAN"; @@ -158,7 +159,7 @@ int srcMode = defaultAddressMode; int frameVersion = 0; - if (Arrays.equals(packet.getLinkDestination(), BROADCAST_ADDR)) { + if (Utils.equals(packet.getLinkDestination(), BROADCAST_ADDR)) { destMode = SHORT_ADDRESS; destPanID = 0xffff; } @@ -190,32 +191,29 @@ 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) { - out.printf("802.15.4 from %4x/", packet.getAttributeAsInt(SOURCE_PAN_ID)); + out.print("802.15.4 from " + Utils.hex16(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)); + out.print(" to " + Utils.hex16(packet.getAttributeAsInt(DESTINATION_PAN_ID)) + "/"); printAddress(out, packet.getAttributeAsInt(DESTINATION_MODE), (byte[]) packet.getAttribute(Packet.LL_DESTINATION)); - out.printf(" seqNo: %d vers: %d len: %d\n", packet.getAttributeAsInt(SEQ_NO), - packet.getAttributeAsInt(VERSION), packet.getAttributeAsInt(PAYLOAD_LEN)); + out.println(" seqNo: " + packet.getAttributeAsInt(SEQ_NO) + " vers: " + + packet.getAttributeAsInt(VERSION) + " len: " + + packet.getAttributeAsInt(PAYLOAD_LEN)); } private void printAddress(PrintStream out, int type, byte[] addr) { if (type == SHORT_ADDRESS) { - out.printf("%02x%02x", addr[0], addr[1]); + out.print(Utils.hex8(addr[0]) + Utils.hex8(addr[1])); } else if (type == LONG_ADDRESS) { - 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]); + out.print(Utils.hex8(addr[0]) + Utils.hex8(addr[1]) + ":" + + Utils.hex8(addr[2]) + Utils.hex8(addr[3]) + ":" + + Utils.hex8(addr[4]) + Utils.hex8(addr[5]) + ":" + + Utils.hex8(addr[6]) + Utils.hex8(addr[7])); } } -} +} \ No newline at end of file Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-05-26 12:18:47 UTC (rev 539) @@ -43,13 +43,6 @@ package se.sics.mspsim.net; -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.util.Utils; public class IPStack { @@ -81,9 +74,8 @@ /* is router -> router behavior */ private boolean isRouter = true; - private IPPacketer tunnelPacketer = new IPv6Packet(); - private TSPClient tunnel; - + private NetworkInterface tunnel; + //TSPClient /* this needs to be generalized later... and down to lowpan too... */ //private HC01Packeter ipPacketer = new HC01Packeter(); @@ -96,24 +88,14 @@ 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; } + public void setTunnel(NetworkInterface tunnel) { + this.tunnel = tunnel; + } + public void setPrefix(byte[] prefix, int size) { this.prefix = prefix; prefixSize = size; @@ -128,7 +110,7 @@ } /* unspecified - on link ?? */ - if (Arrays.equals(UNSPECIFIED, address)) return true; + if (Utils.equals(UNSPECIFIED, address)) return true; /* prefix match? */ for (int i = 0; i < prefixSize / 8; i++) { if (address[i] != prefix[i]) return false; @@ -146,8 +128,12 @@ /* autoconfig ?? */ myLocalIPAddress[8] = myIPAddress[8] = (byte) (myIPAddress[8] ^ 0x02); - System.out.println("***** Prefix Set / IP address: "); + System.out.print("***** Configured IP address: "); IPv6Packet.printAddress(System.out, myIPAddress); + System.out.println(); + System.out.print("***** Configured Local IP address: "); + IPv6Packet.printAddress(System.out, myLocalIPAddress); + System.out.println(); } private boolean findRoute(IPv6Packet packet) { @@ -156,7 +142,7 @@ /* find a MAC address for this packets destination... */ byte[] destAddr = packet.getDestinationAddress(); /* is it a bc to all nodes? */ - if (Arrays.equals(ALL_NODES, destAddr)) { + if (Utils.equals(ALL_NODES, destAddr)) { packet.setAttribute("link.destination", linkBroadcast); } else { byte[] destMAC = new byte[8]; @@ -190,7 +176,7 @@ IPv6Packet.printAddress(System.out, myIPAddress); System.out.print(", Dest: "); IPv6Packet.printAddress(System.out, packet.getDestinationAddress()); - if (tunnel.isReady()) { + if (tunnel != null && tunnel.isReady()) { tunnel.sendPacket(packet); } } @@ -211,7 +197,7 @@ IPv6Packet.printAddress(System.out, myIPAddress); System.out.print(", Dest: "); IPv6Packet.printAddress(System.out, packet.getDestinationAddress()); - if (tunnel.isReady()) { + if (tunnel != null && tunnel.isReady()) { tunnel.sendPacket(packet); } } else if (isForMe(packet.getDestinationAddress())){ @@ -231,21 +217,26 @@ linkLayerHandler.sendPacket(packet); } } + } else { + System.out.println("#### PACKET ignored..."); } } /* 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; + System.out.print("=== is for me? "); + IPv6Packet.printAddress(System.out, address); + if (Utils.equals(myIPAddress, address) || + Utils.equals(myLocalIPAddress, address)) return true; + if (isRouter && Utils.equals(ALL_ROUTERS, address)) return true; + if (Utils.equals(ALL_NODES, address)) return true; + if (Utils.equals(UNSPECIFIED, address)) return true; return false; } public void setLinkLayerAddress(byte[] addr) { myLinkAddress = addr; + configureIPAddress(); } public void setIPAddress(byte[] addr) { @@ -272,28 +263,8 @@ 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); - } - } - } - public boolean isRouter() { return isRouter ; } -} + +} \ No newline at end of file Modified: mspsim/se/sics/mspsim/net/IPv6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-05-26 12:18:47 UTC (rev 539) @@ -93,16 +93,16 @@ } public void printPacket(PrintStream out) { - out.printf("IPv6: from "); + out.print("IPv6: from "); printAddress(out, sourceAddress); out.print(" to "); printAddress(out, destAddress); - out.printf(" NxHdr: %d\n", nextHeader); + out.println(" NxHdr: " + nextHeader); } public static void printAddress(PrintStream out, byte[] address) { for (int i = 0; i < 16; i+=2) { - out.printf("%04x", (((address[i] & 0xff) << 8) | address[i + 1] & 0xff)); + out.print(Utils.hex16((((address[i] & 0xff) << 8) | address[i + 1] & 0xff))); if (i < 14) { out.print(":"); } @@ -251,7 +251,7 @@ 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]); + out.print(Utils.hex8(data[i + pos])); if (i < size - 1) out.print(":"); } Modified: mspsim/se/sics/mspsim/net/LoWPANHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/LoWPANHandler.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/net/LoWPANHandler.java 2009-05-26 12:18:47 UTC (rev 539) @@ -43,7 +43,10 @@ private IPStack ipStack; - public LoWPANHandler(IPStack stack) { + public LoWPANHandler() { + } + + public void setIPStack(IPStack stack) { ipStack = stack; } @@ -51,6 +54,10 @@ return "6lowpan"; } + public boolean isReady() { + return true; + } + public void packetReceived(Packet packet) { /* create IP packet based on the correct dispatch */ IPv6Packet ipPacket = new IPv6Packet(packet); @@ -66,19 +73,21 @@ } } - public void sendPacket(Packet packet) { + public void sendPacket(IPv6Packet packet) { /* LoWPANHandler is for IP over 802.15.4 */ - 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); - } + // 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); } + public void sendPacket(Packet packet) { + sendPacket((IPv6Packet) packet); + } + } \ No newline at end of file Modified: mspsim/se/sics/mspsim/net/NetworkInterface.java =================================================================== --- mspsim/se/sics/mspsim/net/NetworkInterface.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/net/NetworkInterface.java 2009-05-26 12:18:47 UTC (rev 539) @@ -1,5 +1,9 @@ package se.sics.mspsim.net; +/* IP network interface */ public interface NetworkInterface { public String getName(); + public void sendPacket(IPv6Packet packet); + public void setIPStack(IPStack stack); + public boolean isReady(); } Modified: mspsim/se/sics/mspsim/net/Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/Packet.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/net/Packet.java 2009-05-26 12:18:47 UTC (rev 539) @@ -41,14 +41,14 @@ package se.sics.mspsim.net; -import java.util.HashMap; +import java.util.Hashtable; public class Packet { public static final String LL_SOURCE = "link.source"; public static final String LL_DESTINATION = "link.destination"; - protected HashMap<String, Object> attributes = new HashMap<String, Object>(); + protected Hashtable attributes = new Hashtable(); /* this is the packet data array */ protected byte[] packetData; @@ -110,6 +110,10 @@ attributes.put(name, object); } + public void setAttribute(String name, int data) { + attributes.put(name, new Integer(data)); + } + public Object getAttribute(String name) { return attributes.get(name); } Modified: mspsim/se/sics/mspsim/net/TSPClient.java =================================================================== --- mspsim/se/sics/mspsim/net/TSPClient.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/net/TSPClient.java 2009-05-26 12:18:47 UTC (rev 539) @@ -80,6 +80,18 @@ return "tsp"; } + public static TSPClient startTSPTunnel(IPStack ipStack, String server, String user, String password) { + try { + TSPClient tunnel = new TSPClient(server, user, password); + tunnel.setIPStack(ipStack); + tunnel.waitSetup(); + return tunnel; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + public void setIPStack(IPStack ipStack) { this.ipStack = ipStack; } Modified: mspsim/se/sics/mspsim/util/NetworkConnection.java =================================================================== --- mspsim/se/sics/mspsim/util/NetworkConnection.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/util/NetworkConnection.java 2009-05-26 12:18:47 UTC (rev 539) @@ -95,7 +95,7 @@ try { Socket s = serverSocket.accept(); if (DEBUG) System.out.println("NetworkConnection: New connection from " + s.getRemoteSocketAddress()); - connections = (ConnectionThread[]) Utils.add(ConnectionThread.class, connections, new ConnectionThread(s)); + connections = (ConnectionThread[]) ArrayUtils.add(ConnectionThread.class, connections, new ConnectionThread(s)); } catch (IOException e) { e.printStackTrace(); } @@ -142,7 +142,7 @@ private boolean connect(int port) { try { Socket socket = new Socket("127.0.0.1", port); - connections = (ConnectionThread[]) Utils.add(ConnectionThread.class, connections, new ConnectionThread(socket)); + connections = (ConnectionThread[]) ArrayUtils.add(ConnectionThread.class, connections, new ConnectionThread(socket)); } catch (UnknownHostException e) { return false; } catch (IOException e) { @@ -185,7 +185,7 @@ if (cthr != null) { for (int i = 0; i < cthr.length; i++) { if (cthr[i].isClosed()) { - connections = (ConnectionThread[]) Utils.remove(connections, cthr[i]); + connections = (ConnectionThread[]) ArrayUtils.remove(connections, cthr[i]); // Do not write back to the source } else if (cthr[i] != event.source){ try { Modified: mspsim/se/sics/mspsim/util/Utils.java =================================================================== --- mspsim/se/sics/mspsim/util/Utils.java 2009-05-25 16:32:41 UTC (rev 538) +++ mspsim/se/sics/mspsim/util/Utils.java 2009-05-26 12:18:47 UTC (rev 539) @@ -75,39 +75,12 @@ return s; } - public static Object[] add(Class<?> componentType, Object[] array, Object value) { - Object[] tmp; - if (array == null) { - tmp = (Object[]) java.lang.reflect.Array.newInstance(componentType, 1); - } else { - tmp = (Object[]) java.lang.reflect.Array.newInstance(componentType, array.length + 1); - System.arraycopy(array, 0, tmp, 0, array.length); + public static void fill(byte[] array, int pos, int len, byte value) { + for (int i = 0; i < len; i++) { + array[pos++] = value; } - tmp[tmp.length - 1] = value; - return tmp; } - public static Object[] remove(Object[] array, Object value) { - if (array != null) { - for (int index = 0, n = array.length; index < n; index++) { - if (value.equals(array[index])) { - if (n == 1) { - return null; - } - Object[] tmp = (Object[]) java.lang.reflect.Array.newInstance(array.getClass().getComponentType(), array.length - 1); - if (index > 0) { - System.arraycopy(array, 0, tmp, 0, index); - } - if (index < tmp.length) { - System.arraycopy(array, index + 1, tmp, index, tmp.length - index); - } - return tmp; - } - } - } - return array; - } - public static int decodeInt(String value) throws NumberFormatException { int radix = 10; int index = 0; @@ -214,6 +187,16 @@ return data; } + public static boolean equals(byte[] arr1, byte[] arr2) { + if (arr1 == null && arr2 == null) return true; + if (arr1 == null || arr2 == null) return false; + if (arr1.length != arr2.length) return false; + for (int i = 0; i < arr1.length; i++) { + if (arr1[i] != arr2[i]) return false; + } + return true; + } + // public static void main(String[] args) { // System.out.println("Hex 47 = " + hex8(47)); // } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-26 13:22:11
|
Revision: 540 http://mspsim.svn.sourceforge.net/mspsim/?rev=540&view=rev Author: joxe Date: 2009-05-26 12:24:25 +0000 (Tue, 26 May 2009) Log Message: ----------- Added Paths: ----------- mspsim/se/sics/mspsim/util/ArrayUtils.java Added: mspsim/se/sics/mspsim/util/ArrayUtils.java =================================================================== --- mspsim/se/sics/mspsim/util/ArrayUtils.java (rev 0) +++ mspsim/se/sics/mspsim/util/ArrayUtils.java 2009-05-26 12:24:25 UTC (rev 540) @@ -0,0 +1,38 @@ +package se.sics.mspsim.util; + +public class ArrayUtils { + + public static Object[] add(Class componentType, Object[] array, Object value) { + Object[] tmp; + if (array == null) { + tmp = (Object[]) java.lang.reflect.Array.newInstance(componentType, 1); + } else { + tmp = (Object[]) java.lang.reflect.Array.newInstance(componentType, array.length + 1); + System.arraycopy(array, 0, tmp, 0, array.length); + } + tmp[tmp.length - 1] = value; + return tmp; + } + + public static Object[] remove(Object[] array, Object value) { + if (array != null) { + for (int index = 0, n = array.length; index < n; index++) { + if (value.equals(array[index])) { + if (n == 1) { + return null; + } + Object[] tmp = (Object[]) java.lang.reflect.Array.newInstance(array.getClass().getComponentType(), array.length - 1); + if (index > 0) { + System.arraycopy(array, 0, tmp, 0, index); + } + if (index < tmp.length) { + System.arraycopy(array, index + 1, tmp, index, tmp.length - index); + } + return tmp; + } + } + } + return array; + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2009-05-25 16:33:16
|
Revision: 538 http://mspsim.svn.sourceforge.net/mspsim/?rev=538&view=rev Author: joxe Date: 2009-05-25 16:32:41 +0000 (Mon, 25 May 2009) Log Message: ----------- removed unused code Modified Paths: -------------- mspsim/se/sics/mspsim/net/AbstractPacketHandler.java mspsim/se/sics/mspsim/net/ICMP6Packet.java mspsim/se/sics/mspsim/net/IEEE802154Handler.java mspsim/se/sics/mspsim/net/Packet.java Removed Paths: ------------- mspsim/se/sics/mspsim/net/AbstractPacket.java Deleted: mspsim/se/sics/mspsim/net/AbstractPacket.java =================================================================== --- mspsim/se/sics/mspsim/net/AbstractPacket.java 2009-05-24 22:11:04 UTC (rev 537) +++ mspsim/se/sics/mspsim/net/AbstractPacket.java 2009-05-25 16:32:41 UTC (rev 538) @@ -1,94 +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 - * Created : mar 2009 - * Updated : $Date:$ - * $Revision:$ - */ - -package se.sics.mspsim.net; - -// remove -public abstract class AbstractPacket extends Packet { - - byte[] payload; - int payloadLen; - - Packet containerPacket; - Packet payloadPacket; - - public byte[] getPayload() { - return payload; - } - - public byte[] getSourceAddress() { - return null; - } - - public byte[] getDestinationAddress() { - return null; - } - - public AbstractPacket createReply() { - return null; - } - - void setPayload(byte[] data, int startPos, int len) { - payloadLen = len; - payload = new byte[payloadLen]; - System.arraycopy(data, startPos, payload, 0, payloadLen); - } - - static int get32(byte[] data, int pos) { - if (data.length > pos + 3) - return ((data[pos] & 0xff) << 24) | ((data[pos++] & 0xff) << 16) | - ((data[pos] & 0xff) << 8) | (data[pos + 1] & 0xff); - return 0; - } - - static int get16(byte[] data, int pos) { - if (data.length > pos + 1) - return ((data[pos] & 0xff) << 8) | data[pos + 1] & 0xff; - return 0; - } - - static byte[] getAddress(byte[] data, int pos) { - byte[] targetAddress = new byte[16]; - System.arraycopy(data, pos, targetAddress, 0, 16); - return targetAddress; - } - -} \ No newline at end of file Modified: mspsim/se/sics/mspsim/net/AbstractPacketHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/AbstractPacketHandler.java 2009-05-24 22:11:04 UTC (rev 537) +++ mspsim/se/sics/mspsim/net/AbstractPacketHandler.java 2009-05-25 16:32:41 UTC (rev 538) @@ -47,8 +47,7 @@ boolean debug = true; - ArrayList<PacketHandlerDispatch> upperLayers = - new ArrayList<PacketHandlerDispatch>(); + ArrayList upperLayers = new ArrayList(); PacketHandler lowerLayer; public PacketHandler getLowerLayerHandler() { @@ -73,14 +72,14 @@ } if (dispatch != -1) { for (int i = 0; i < upperLayers.size(); i++) { - if (upperLayers.get(i).dispatch == dispatch) { - upperLayers.get(i).packetHandler.packetReceived(packet); + if (((PacketHandlerDispatch)upperLayers.get(i)).dispatch == dispatch) { + ((PacketHandlerDispatch)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(packet); + ((PacketHandlerDispatch)upperLayers.get(0)).packetHandler.packetReceived(packet); } } Modified: mspsim/se/sics/mspsim/net/ICMP6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-24 22:11:04 UTC (rev 537) +++ mspsim/se/sics/mspsim/net/ICMP6Packet.java 2009-05-25 16:32:41 UTC (rev 538) @@ -54,7 +54,7 @@ byte[] echoData; - private ArrayList<byte[]> options = new ArrayList<byte[]>(); + private ArrayList options = new ArrayList(); /* prefix info option - type = 3, len = 4 (64x4 bits), prefix = 64 bits */ private final static byte[] defaultPrefixInfo = @@ -96,8 +96,8 @@ public byte[] getOption(int type) { for (int i = 0; i < options.size(); i++) { - if (options.get(i)[0] == type) { - return options.get(i); + if (((byte[])options.get(i))[0] == type) { + return (byte[]) options.get(i); } } return null; @@ -226,7 +226,6 @@ } } - @Override public byte[] generatePacketData(IPv6Packet packet) { byte[] buffer = new byte[127]; buffer[0] = (byte) type; @@ -291,7 +290,7 @@ private int addOptions(byte[] buffer, int pos) { for (int i = 0; i < options.size(); i++) { - byte[] option = options.get(i); + byte[] option = (byte[]) 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); @@ -300,7 +299,6 @@ return pos; } - @Override public byte getDispatch() { return DISPATCH; } Modified: mspsim/se/sics/mspsim/net/IEEE802154Handler.java =================================================================== --- mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-24 22:11:04 UTC (rev 537) +++ mspsim/se/sics/mspsim/net/IEEE802154Handler.java 2009-05-25 16:32:41 UTC (rev 538) @@ -145,7 +145,6 @@ /* create a 802.15.4 packet with the given packet as payload, and * deliver to the lower layer handler */ - @Override public void sendPacket(Packet packet) { System.out.println("Packet should be sent!!!"); byte[] buffer = new byte[127]; Modified: mspsim/se/sics/mspsim/net/Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/Packet.java 2009-05-24 22:11:04 UTC (rev 537) +++ mspsim/se/sics/mspsim/net/Packet.java 2009-05-25 16:32:41 UTC (rev 538) @@ -133,7 +133,7 @@ return 0; } - public static int get32(byte[] data, int pos) { + static int get32(byte[] data, int pos) { if (data.length >= pos + 3) { return ((data[pos] & 0xff) << 24) | ((data[pos + 1] & 0xff) << 16) | @@ -143,7 +143,7 @@ return 0; } - public static int get16(byte[] data, int pos) { + static int get16(byte[] data, int pos) { if (data.length >= pos + 1) { return ((data[pos] & 0xff) << 8) | ((data[pos + 1] & 0xff) << 0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |