From: <jo...@us...> - 2009-06-23 06:30:39
|
Revision: 570 http://mspsim.svn.sourceforge.net/mspsim/?rev=570&view=rev Author: joxe Date: 2009-06-23 06:29:41 +0000 (Tue, 23 Jun 2009) Log Message: ----------- added UDPHandler Modified Paths: -------------- mspsim/se/sics/mspsim/net/IPStack.java mspsim/se/sics/mspsim/net/IPv6Packet.java Added Paths: ----------- mspsim/se/sics/mspsim/net/UDPHandler.java mspsim/se/sics/mspsim/net/UDPListener.java Modified: mspsim/se/sics/mspsim/net/IPStack.java =================================================================== --- mspsim/se/sics/mspsim/net/IPStack.java 2009-06-21 22:08:34 UTC (rev 569) +++ mspsim/se/sics/mspsim/net/IPStack.java 2009-06-23 06:29:41 UTC (rev 570) @@ -42,6 +42,7 @@ */ package se.sics.mspsim.net; +import java.io.IOException; import java.util.Timer; import se.sics.mspsim.util.Utils; @@ -79,6 +80,7 @@ private IPPacketer defaultPacketer = new HC01Packeter(); private ICMP6PacketHandler icmp6Handler; private TCPHandler tcpHandler = null; + private UDPHandler udpHandler = null; /* is router -> router behavior */ private boolean isRouter = false; @@ -101,6 +103,7 @@ configureIPAddress(); neighborManager = new NeighborManager(this, neighborTable); tcpHandler = new TCPHandler(this); + udpHandler = new UDPHandler(); } public Timer getTimer() { @@ -112,6 +115,10 @@ return tcpHandler.addListenConnection(port); } + public void listen(UDPListener listener, int port) throws IOException { + udpHandler.addUDPListener(listener, port); + } + public NeighborTable getNeighborTable() { return neighborTable; } @@ -257,11 +264,13 @@ // TODO: move to HC01 compression handler... => generate raw UDP if (packet.getIPPayload() != null) { packet.getIPPayload().printPacket(System.out); + udpHandler.handlePacket(packet, (UDPPacket) packet.getIPPayload()); } else { UDPPacket p = new UDPPacket(); p.parsePacketData(packet); p.printPacket(System.out); packet.setIPPayload(p); + udpHandler.handlePacket(packet, p); } if (networkEventListener != null) { networkEventListener.packetHandled(packet); Modified: mspsim/se/sics/mspsim/net/IPv6Packet.java =================================================================== --- mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-06-21 22:08:34 UTC (rev 569) +++ mspsim/se/sics/mspsim/net/IPv6Packet.java 2009-06-23 06:29:41 UTC (rev 570) @@ -284,6 +284,36 @@ out.print(":"); } } + + /* parse a hex x:y:z... address */ + public byte[] parseAddress(String addressStr) { + byte[] address = new byte[16]; + int hexVal = 0; + int pos = 0; + int splitPos = 0; + addressStr = addressStr.toLowerCase(); + for (int i = 0; i < addressStr.length() && pos < 16; i++) { + char c = addressStr.charAt(i); + if (c == ':') { + address[pos++] = (byte)(hexVal >> 8); + address[pos++] = (byte)(hexVal & 0xff); + if (i + 1 < addressStr.length() && + addressStr.charAt(i + 1) == ':') { + splitPos = pos; + } + hexVal = 0; + } else if (c >= '0' && c <= '9') { + hexVal = (hexVal << 4) + c - '0'; + } else if (c >= 'a' && c <= 'f') { + hexVal = (hexVal << 4) + c - 'a' + 10; + } + } + if (splitPos != 0) { + // we should move some bytes forward... + } + + return address; + } public static void main(String[] args) { byte[] data = Utils.hexconv("6000000000200001fe80000000000000023048fffe904cd2ff02000000000000000000026c5b5f303a000100050200008300527800000000ff02000000000000000000026c5b5f30"); Added: mspsim/se/sics/mspsim/net/UDPHandler.java =================================================================== --- mspsim/se/sics/mspsim/net/UDPHandler.java (rev 0) +++ mspsim/se/sics/mspsim/net/UDPHandler.java 2009-06-23 06:29:41 UTC (rev 570) @@ -0,0 +1,30 @@ +package se.sics.mspsim.net; + +import java.io.IOException; + +public class UDPHandler { + private static final int MAX_LISTENERS = 16; + public UDPListener[] listeners = new UDPListener[MAX_LISTENERS]; + public int[] listenPorts = new int[MAX_LISTENERS]; + int noListeners = 0; + + public void addUDPListener(UDPListener listener, int port) throws IOException { + if (noListeners < MAX_LISTENERS) { + System.out.println("UDPHandler: adding listener for " + port); + listeners[noListeners] = listener; + listenPorts[noListeners++] = port; + } else { + throw new IOException("Too many open connections..."); + } + } + + public void handlePacket(IPv6Packet packet, UDPPacket udpPacket) { + for (int i = 0; i < noListeners; i++) { + if (listenPorts[i] == udpPacket.destinationPort) { + listeners[i].packetReceived(packet, udpPacket); + /* only one connection per port... */ + return; + } + } + } +} Property changes on: mspsim/se/sics/mspsim/net/UDPHandler.java ___________________________________________________________________ Added: svn:executable + * Added: mspsim/se/sics/mspsim/net/UDPListener.java =================================================================== --- mspsim/se/sics/mspsim/net/UDPListener.java (rev 0) +++ mspsim/se/sics/mspsim/net/UDPListener.java 2009-06-23 06:29:41 UTC (rev 570) @@ -0,0 +1,5 @@ +package se.sics.mspsim.net; + +public interface UDPListener { + public void packetReceived(IPv6Packet ip, UDPPacket upd); +} Property changes on: mspsim/se/sics/mspsim/net/UDPListener.java ___________________________________________________________________ Added: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |