[Javanetsim-cvs] javaNetSim/core/protocolsuite/tcp_ip Application.java, 1.18, 1.19 Echo.java, 1.24,
Status: Beta
Brought to you by:
darkkey
From: QweR <qw...@us...> - 2007-09-22 23:06:57
|
Update of /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv19629/core/protocolsuite/tcp_ip Modified Files: Application.java Echo.java Echo_tcp.java ExternalProxyApp.java PosixTelnetClient.java SNMP.java TCP_session.java Tcp.java Telnet_client.java Telnet_server.java Udp.java jnSocket.java socketLayer.java Log Message: second test version of TCP Index: Telnet_client.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/Telnet_client.java,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** Telnet_client.java 18 Sep 2007 22:29:46 -0000 1.10 --- Telnet_client.java 22 Sep 2007 23:06:44 -0000 1.11 *************** *** 139,142 **** --- 139,146 ---- } + public void OnError(int sock){ + + } + /** * This method disconnects from server. Index: socketLayer.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/socketLayer.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** socketLayer.java 21 Sep 2007 22:42:31 -0000 1.3 --- socketLayer.java 22 Sep 2007 23:06:45 -0000 1.4 *************** *** 38,42 **** public void bind(int sock, String srcIP, int srcPort) throws LowLinkException, TransportLayerException{ ! jnSocket jnsock = (jnSocket)sockTable.get(sock); jnsock.src_IP = srcIP; //((jnSocket)sockTable.get(sock)).src_port = srcPort; <-- WRONG! --- 38,42 ---- public void bind(int sock, String srcIP, int srcPort) throws LowLinkException, TransportLayerException{ ! jnSocket jnsock = get_socket(sock); jnsock.src_IP = srcIP; //((jnSocket)sockTable.get(sock)).src_port = srcPort; <-- WRONG! *************** *** 53,57 **** public void listen(int sock) throws TransportLayerException{ ! jnSocket jnsock = (jnSocket)sockTable.get(sock); jnsock.open_state = true; if(jnsock.type == jnsock.UDP_socket){ --- 53,57 ---- public void listen(int sock) throws TransportLayerException{ ! jnSocket jnsock = get_socket(sock); jnsock.open_state = true; if(jnsock.type == jnsock.UDP_socket){ *************** *** 63,69 **** } ! public void write(int sock, String msg){ ! //if() ! //tcp only write!!! } --- 63,95 ---- } ! public boolean connect(int sock, String ipaddr, int port) throws LowLinkException, CommunicationException, TransportLayerException{ ! boolean result = false; ! jnSocket jnsock = get_socket(sock); ! if(jnsock.type == jnsock.TCP_socket){ ! jnsock.open_state = true; ! jnsock.dst_IP = ipaddr; ! jnsock.dst_port = port; ! result = mParentStack.TCP().connect(sock, ipaddr, port); ! } ! else if(jnsock.type == jnsock.TCP_socket){ ! result = true; ! } ! return result; ! } ! ! public int accept(int sock, String dstIP, int dstPort){ ! jnSocket jnsock = get_socket(sock); ! int new_sock = socket(jnsock.type, jnsock.app); ! jnSocket new_jnsock = get_socket(new_sock); ! new_jnsock.src_IP = jnsock.src_IP; ! new_jnsock.src_port = jnsock.src_port; ! new_jnsock.dst_IP = dstIP; ! new_jnsock.dst_port = dstPort; ! new_jnsock.open_state = true; ! return new_sock; ! } ! ! public void write(int sock, String msg) throws TransportLayerException, LowLinkException, CommunicationException{ ! mParentStack.TCP().sendTCPData(sock, msg); } Index: Udp.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/Udp.java,v retrieving revision 1.37 retrieving revision 1.38 diff -C2 -d -r1.37 -r1.38 *** Udp.java 21 Sep 2007 22:42:31 -0000 1.37 --- Udp.java 22 Sep 2007 23:06:44 -0000 1.38 *************** *** 61,65 **** public class Udp implements Serializable { ! private Hashtable sessionTable = new Hashtable(); private ProtocolStack mParentStack; private socketLayer mSL; --- 61,66 ---- public class Udp implements Serializable { ! private Hashtable sessionTable = new Hashtable(); ! private Object sessionTable_lock = new Object(); private ProtocolStack mParentStack; private socketLayer mSL; *************** *** 114,126 **** // test if destination UDP port exists on this NeworkLayerDevice ! if (sessionTable.get(jnSocket.genUDPkey(inPacket.get_destPort())) !=null) { ! ! //let's check all the things dealing with destination port number ! //UDP_HashTableElement Elm = null; ! UDP_session Elm = null; ! Elm=(UDP_session) sessionTable.get(jnSocket.genUDPkey(inPacket.get_destPort())); ! ! int sock = Elm.sock; //now we decompose UDP datagram --- 115,122 ---- // test if destination UDP port exists on this NeworkLayerDevice ! UDP_session Elm=getSession(jnSocket.genUDPkey(inPacket.get_destPort())); ! if (Elm !=null) { ! int sock = Elm.getSocket(); //now we decompose UDP datagram *************** *** 170,174 **** try{ ! if(sessionTable.get(jnSocket.genUDPkey(mSL.get_socket(sock).src_port)) == null){ // we should reserve port for it reserveFreePort(sock); --- 166,170 ---- try{ ! if(getSession(jnSocket.genUDPkey(mSL.get_socket(sock).src_port)) == null){ // we should reserve port for it reserveFreePort(sock); *************** *** 192,198 **** IncSentDatagrammsNumber(); ! if (sessionTable.get(jnSocket.genUDPkey(insrcPort)) !=null) { ! ((UDP_session)sessionTable.get(jnSocket.genUDPkey(insrcPort))).IncSentDatagrammsNumber(); } --- 188,194 ---- IncSentDatagrammsNumber(); ! if (getSession(jnSocket.genUDPkey(insrcPort)) !=null) { ! getSession(jnSocket.genUDPkey(insrcPort)).IncSentDatagrammsNumber(); } *************** *** 229,233 **** String sessionID; boolean Found=false; ! Enumeration LocalSessions = sessionTable.keys(); --- 225,229 ---- String sessionID; boolean Found=false; ! Enumeration LocalSessions = getSessionKeys(); *************** *** 238,242 **** { sessionID = (String)LocalSessions.nextElement(); ! Elm = (UDP_session) sessionTable.get(sessionID); if ( sock == Elm.sock && Elm.sock >=0 ) { --- 234,238 ---- { sessionID = (String)LocalSessions.nextElement(); ! Elm = getSession(sessionID); if ( sock == Elm.sock && Elm.sock >=0 ) { *************** *** 254,264 **** while ( (number<PORT_START_NUMBER+PORT_QUANT) && !(Reserved) ) { ! Elm = (UDP_session) sessionTable.get(jnSocket.genUDPkey(number)); if (Elm == null) //free port { ! Reserved=true; ! Elm = new UDP_session(sock); mSL.get_socket(sock).src_port = number; ! sessionTable.put(jnSocket.genUDPkey(number),Elm); LayerInfo UDP_Info = new LayerInfo(getClass().getName()); --- 250,259 ---- while ( (number<PORT_START_NUMBER+PORT_QUANT) && !(Reserved) ) { ! Elm = getSession(jnSocket.genUDPkey(number)); if (Elm == null) //free port { ! Reserved=true; mSL.get_socket(sock).src_port = number; ! addSession(jnSocket.genUDPkey(number), sock); LayerInfo UDP_Info = new LayerInfo(getClass().getName()); *************** *** 289,295 **** { //create such a record in hashtable - UDP_session newElm = new UDP_session(sock_num); mSL.get_socket(sock_num).src_port = in_Port; ! sessionTable.put(jnSocket.genUDPkey(in_Port),newElm); //hash table update LayerInfo UDP_Info = new LayerInfo(getClass().getName()); --- 284,289 ---- { //create such a record in hashtable mSL.get_socket(sock_num).src_port = in_Port; ! addSession(jnSocket.genUDPkey(in_Port), sock_num); //hash table update LayerInfo UDP_Info = new LayerInfo(getClass().getName()); *************** *** 323,327 **** UDP_session Elm=null; int portToClose=mSL.get_socket(sock).src_port; ! Elm=(UDP_session) sessionTable.get(jnSocket.genUDPkey(portToClose)); if(portToClose!=0 && Elm!=null){ --- 317,321 ---- UDP_session Elm=null; int portToClose=mSL.get_socket(sock).src_port; ! Elm= getSession(jnSocket.genUDPkey(portToClose)); if(portToClose!=0 && Elm!=null){ *************** *** 332,339 **** UDP_Info.setDescription("Local port " + portToClose + " closed and set to free."); Simulation.addLayerInfo(UDP_Info); ! sessionTable.remove(jnSocket.genUDPkey(portToClose)); mSL.close(Elm.sock); } else throw new TransportLayerException("UDP Error: port "+ portToClose +" is not being LISTENED to by the application: \"" + mSL.get_socket(sock).app.toString() + "\"."); } /*STATISTIC PART */ --- 326,367 ---- UDP_Info.setDescription("Local port " + portToClose + " closed and set to free."); Simulation.addLayerInfo(UDP_Info); ! removeSession(jnSocket.genUDPkey(portToClose)); mSL.close(Elm.sock); } else throw new TransportLayerException("UDP Error: port "+ portToClose +" is not being LISTENED to by the application: \"" + mSL.get_socket(sock).app.toString() + "\"."); } + + private UDP_session addSession(String key, int sock){ + UDP_session udps = new UDP_session(sock); + synchronized(sessionTable_lock){ + sessionTable.put(key, udps); + } + return udps; + } + + private UDP_session removeSession(String key){ + UDP_session udps; + synchronized(sessionTable_lock){ + udps = (UDP_session) sessionTable.remove(key); + } + return udps; + } + + private UDP_session getSession(String key){ + UDP_session udps; + synchronized(sessionTable_lock){ + udps = (UDP_session) sessionTable.get(key); + } + return udps; + } + + private Enumeration getSessionKeys(){ + Enumeration keys; + synchronized(sessionTable_lock){ + keys = sessionTable.keys(); + } + return keys; + } + + /*STATISTIC PART */ Index: Telnet_server.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/Telnet_server.java,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** Telnet_server.java 18 Sep 2007 22:29:46 -0000 1.12 --- Telnet_server.java 22 Sep 2007 23:06:44 -0000 1.13 *************** *** 133,136 **** --- 133,140 ---- } + public void OnError(int sock){ + + } + /** * This method disconnects from server. Index: PosixTelnetClient.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/PosixTelnetClient.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** PosixTelnetClient.java 18 Sep 2007 22:29:46 -0000 1.2 --- PosixTelnetClient.java 22 Sep 2007 23:06:42 -0000 1.3 *************** *** 144,147 **** --- 144,151 ---- } + public void OnError(int sock){ + + } + /** * This method sends data to the other side. Index: Tcp.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/Tcp.java,v retrieving revision 1.90 retrieving revision 1.91 diff -C2 -d -r1.90 -r1.91 *** Tcp.java 21 Sep 2007 22:42:31 -0000 1.90 --- Tcp.java 22 Sep 2007 23:06:44 -0000 1.91 *************** *** 112,126 **** public boolean resend(int cur_time){ boolean res = false; - System.out.println("pack resend"); - try{ - mParentStack.sendPacket(packet); - }catch(LowLinkException e){ - e.toString(); - }catch(CommunicationException e){ - e.toString(); - } int nt = nextTime(cur_time); if(nt>0){ ! res = true; } else{ --- 112,128 ---- public boolean resend(int cur_time){ boolean res = false; int nt = nextTime(cur_time); + if(nt>=0){ + System.out.println("pack resend"); + try{ + mParentStack.sendPacket(packet); + }catch(LowLinkException e){ + e.toString(); + }catch(CommunicationException e){ + e.toString(); + } + } if(nt>0){ ! res = true; } else{ *************** *** 131,135 **** case -1:{ //acknowledgment have not recieved, close connection // send RST segment ! boolean flags[]={false,false,false,true,false,false}; /* URG, ACK, PSH, !RST!, SYN, FIN */ try{ TCP_packet rstpack = getTCPPacket_tosend(sock, "", flags, packet.get_acknowledgment_number(), packet.get_sequence_number()+1); --- 133,137 ---- case -1:{ //acknowledgment have not recieved, close connection // send RST segment ! boolean flags[] = genFlags(RST); try{ TCP_packet rstpack = getTCPPacket_tosend(sock, "", flags, packet.get_acknowledgment_number(), packet.get_sequence_number()+1); *************** *** 150,153 **** --- 152,159 ---- break; } + case -2:{ + mSL.get_socket(sock).app.OnError(sock); + break; + } default: System.out.println("TCP error: unsupported resend time"); } *************** *** 188,197 **** private Hashtable sessionTable = new Hashtable(); ! private Object sessionTable_lock = 0; //for locking Hashtable sessionTable private ProtocolStack mParentStack; private socketLayer mSL; private Timer timer; private PriorityQueue tcp_timers = new PriorityQueue(); ! private Object tcp_timers_lock = 0; //for locking queue tcp_timers private int current_time = 0; private long nextTimerID = 0; --- 194,203 ---- private Hashtable sessionTable = new Hashtable(); ! private Object sessionTable_lock = new Object(); //for locking Hashtable sessionTable private ProtocolStack mParentStack; private socketLayer mSL; private Timer timer; private PriorityQueue tcp_timers = new PriorityQueue(); ! private Object tcp_timers_lock = new Object(); //for locking queue tcp_timers private int current_time = 0; private long nextTimerID = 0; *************** *** 229,232 **** --- 235,246 ---- private static final int SYN_flag = 4; private static final int FIN_flag = 5; + + private static final int NOFLAGS = 0; + private static final int URG = 1; + private static final int ACK = 2; + private static final int PSH = 4; + private static final int RST = 8; + private static final int SYN = 16; + private static final int FIN = 32; /** *************** *** 292,296 **** Reserved=true; mSL.get_socket(sock).src_port = number; ! addSession(jnSocket.genTCPkey(number,"0.0.0.0",0), sock); printLayerInfo("Local port " + number + " reserved for client app."); } --- 306,312 ---- Reserved=true; mSL.get_socket(sock).src_port = number; ! TCP_session tcps = addSession(jnSocket.genTCPkey(number,"0.0.0.0",0), sock); ! tcps.setState(tcps.LISTEN); ! printLayerInfo("Local port " + number + " reserved for client app."); } *************** *** 313,323 **** if ( mSL.get_socket(sock_num).src_port == 0 ) { ! if (in_Port>=0 && in_Port<=65535){ //create such a record in hashtable mSL.get_socket(sock_num).src_port = in_Port; ! addSession(jnSocket.genTCPkey(in_Port,"0.0.0.0",0), sock_num); //hash table update printLayerInfo("Local port " + in_Port + " binded."); } else { throw new TransportLayerException("TCP error: can not listen to port "+ in_Port +"! Use port range from 1 to 65535 to listen to."); --- 329,343 ---- if ( mSL.get_socket(sock_num).src_port == 0 ) { ! if (in_Port>0 && in_Port<=65535){ //create such a record in hashtable mSL.get_socket(sock_num).src_port = in_Port; ! TCP_session tcps = addSession(jnSocket.genTCPkey(in_Port,"0.0.0.0",0), sock_num); ! tcps.setState(tcps.LISTEN); printLayerInfo("Local port " + in_Port + " binded."); } + else if(in_Port == 0){ + reserveFreePort(sock_num); + } else { throw new TransportLayerException("TCP error: can not listen to port "+ in_Port +"! Use port range from 1 to 65535 to listen to."); *************** *** 349,365 **** { int CONNECTION_DELAY_EXAM = (int)TCP_TIMER_DELAY/4; //examination delay is 10ms, but may be any number ! int resendtimes[] = {6000,24000}; ! boolean flags[]={false,false,false,false,true,false}; /* URG, ACK, PSH, RST, !SYN!, FIN */ boolean connected = false; if(IPV4Address.validateDecIP(dstIP)){ ! mSL.get_socket(sock).dst_IP = dstIP; ! mSL.get_socket(sock).dst_port = dstPort; TCP_session Elm = addSession(mSL.get_socket(sock).genKey(), sock); ! if (sendTCPSegment(sock, "", flags, 0, resendtimes)) { int time = 0; ! while(Elm.getState()!=Elm.ESTABLISHED && time < 78000){ try{ Thread.sleep(CONNECTION_DELAY_EXAM); --- 369,386 ---- { int CONNECTION_DELAY_EXAM = (int)TCP_TIMER_DELAY/4; //examination delay is 10ms, but may be any number ! int resendtimes[] = {6000,24000,-2}; ! boolean flags[] = genFlags(SYN); boolean connected = false; if(IPV4Address.validateDecIP(dstIP)){ ! mSL.get_socket(sock).src_IP = mParentStack.getSrcIP(); ! reserveFreePort(sock); TCP_session Elm = addSession(mSL.get_socket(sock).genKey(), sock); + Elm.setState(Elm.SYN_SENT); ! if (sendTCPSegment(sock, "", flags, -1, resendtimes)) { int time = 0; ! while(Elm.getState()!=Elm.ESTABLISHED && time < 40000){ try{ Thread.sleep(CONNECTION_DELAY_EXAM); *************** *** 378,383 **** System.out.println(">> TCP: connect false"); } ! else System.out.println(">> TCP: sendTCPSegment false"); } else{ --- 399,406 ---- System.out.println(">> TCP: connect false"); } ! else{ ! Elm.setState(Elm.CLOSED); System.out.println(">> TCP: sendTCPSegment false"); + } } else{ *************** *** 432,437 **** } ! /** * This method sends the TCP segments with certain flags * NOTE: DO <b>NOT</b> CALL this method from application use only <i>SendTCP(Object application, String inTCPMessage)</i> in the application to send TCP segments --- 455,466 ---- } + public void sendTCPData(int sock, String data) throws TransportLayerException, LowLinkException, CommunicationException + { + boolean flags[] = genFlags(NOFLAGS); + int resendtimes[] = {1500,3000,6000,12000,24000,48000,64000,64000,64000,64000,64000,64000,-1}; + sendTCPSegment(sock, data, flags, -1, resendtimes); + } ! /** * This method sends the TCP segments with certain flags * NOTE: DO <b>NOT</b> CALL this method from application use only <i>SendTCP(Object application, String inTCPMessage)</i> in the application to send TCP segments *************** *** 449,453 **** */ ! public boolean sendTCPSegment(int sock, String inTCPMessage, boolean flags[], int acknow_num, int resendtimes[]) throws TransportLayerException, LowLinkException, CommunicationException { TCP_packet tosend = getTCPPacket_tosend(sock,inTCPMessage,flags,acknow_num, -1); --- 478,482 ---- */ ! private boolean sendTCPSegment(int sock, String inTCPMessage, boolean flags[], int acknow_num, int resendtimes[]) throws TransportLayerException, LowLinkException, CommunicationException { TCP_packet tosend = getTCPPacket_tosend(sock,inTCPMessage,flags,acknow_num, -1); *************** *** 459,464 **** TCP_session Elm = getSession(jnsock.genKey()); ! long tid = createTimer(sock, (TCP_packet)tosend.clone(), resendtimes); ! Elm.addSegmentToResend(tosend.get_sequence_number(),tid); mParentStack.sendPacket(tosend); return true; --- 488,495 ---- TCP_session Elm = getSession(jnsock.genKey()); ! if(resendtimes.length > 0){ ! long tid = createTimer(sock, (TCP_packet)tosend.clone(), resendtimes); ! Elm.addSegmentToResend(tosend.get_sequence_number(),tid); ! } mParentStack.sendPacket(tosend); return true; *************** *** 480,484 **** */ ! public TCP_packet getTCPPacket_tosend(int sock, String inMessage, boolean flags[], int acknow_num, int seq_num) throws TransportLayerException{ jnSocket jnsock = mSL.get_socket(sock); String srcIP = jnsock.src_IP; --- 511,515 ---- */ ! private TCP_packet getTCPPacket_tosend(int sock, String inMessage, boolean flags[], int acknow_num, int seq_num) throws TransportLayerException{ jnSocket jnsock = mSL.get_socket(sock); String srcIP = jnsock.src_IP; *************** *** 496,500 **** //s_num = (flags[1] && !flags[4] && !flags[5]) ? -1 : Elm.seq_number; //getting sequence number 0-for SYN, -1 for ACK if(seq_num == -1 || seq_num > Elm.seq_number) seq_num = Elm.seq_number; //getting sequence number 0-for SYN, -1 for ACK ! int a_num=acknow_num; //(Integer)Elm.ReceivedSegments.lastElement()+1; //getting ACK number 0 - for SYN, 1 - as a reply for SYN ... so on //now we set all the flags --- 527,531 ---- //s_num = (flags[1] && !flags[4] && !flags[5]) ? -1 : Elm.seq_number; //getting sequence number 0-for SYN, -1 for ACK if(seq_num == -1 || seq_num > Elm.seq_number) seq_num = Elm.seq_number; //getting sequence number 0-for SYN, -1 for ACK ! if(acknow_num==-1) acknow_num = Elm.getLastACK(); //now we set all the flags *************** *** 507,511 **** tosend.set_FIN_flag(flags[FIN_flag]); tosend.set_sequence_number(seq_num); ! tosend.set_acknowledgment_number(a_num); tosend.setTCP_message(inMessage); --- 538,542 ---- tosend.set_FIN_flag(flags[FIN_flag]); tosend.set_sequence_number(seq_num); ! tosend.set_acknowledgment_number(acknow_num); tosend.setTCP_message(inMessage); *************** *** 515,519 **** Elm.seq_number++; ! if (!(flags[SYN_flag] && a_num==0) && flags[ACK_flag]) Elm.inc_sent_ACK(); //inc in case this is an ACK-segment --- 546,550 ---- Elm.seq_number++; ! if (!(flags[SYN_flag] && acknow_num==0) && flags[ACK_flag]) Elm.inc_sent_ACK(); //inc in case this is an ACK-segment *************** *** 551,554 **** --- 582,707 ---- } + + + public void receiveTCPPacket( TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException { + //test: check sum of UDP packet + if (inPacket.getCheck_Sum() == 1) + { + // test if this packet is for a local Address. + if(mParentStack.isInternalIP(inPacket.getDestIPAddress())){ + + // test if TCP sesssion exists on this NeworkLayerDevice + TCP_session Elm; + Elm = getSession(jnSocket.genTCPkey(inPacket.get_destPort(), inPacket.getSourceIPAddress(), inPacket.get_srcPort())); + if(Elm == null && inPacket.get_SYN_flag()){ + Elm = getSession(jnSocket.genTCPkey(inPacket.get_destPort(), "0.0.0.0", 0)); + int listensock = Elm.getSocket(); + if(Elm != null){ + int sock = mSL.accept(Elm.getSocket(), inPacket.getSourceIPAddress(), inPacket.get_srcPort()); + jnSocket jnsock = mSL.get_socket(sock); + Elm = addSession(jnSocket.genTCPkey(inPacket.get_destPort(), inPacket.getSourceIPAddress(), inPacket.get_srcPort()), sock); + Elm.setState(Elm.LISTEN); + jnsock.app.Accept(listensock, sock); + } + } + if (Elm !=null) + { + //int sock = Elm.getSocket(); + if(inPacket.get_acknowledgment_number() >= Elm.getLastACK()){ + if(inPacket.get_ACK_flag() && inPacket.get_acknowledgment_number() > Elm.getLastACK()){ + removeTimer(Elm.getSegmentToResend(inPacket.get_acknowledgment_number()-1)); + Elm.removeSegmentToResend(inPacket.get_acknowledgment_number()-1); + Elm.setLastACK(inPacket.get_acknowledgment_number()); + } + + printLayerInfo("TCP packet received from "+ inPacket.getSourceIPAddress() + ":" + inPacket.get_srcPort() + " message: \"" +inPacket.getTCP_message() + "\"."); + + switch(Elm.getState()){ + case TCP_session.CLOSED: revc_CLOSED(Elm, inPacket); break; + case TCP_session.LISTEN: revc_LISTEN(Elm, inPacket); break; + case TCP_session.SYN_SENT: revc_SYN_SENT(Elm, inPacket); break; + case TCP_session.SYN_RCVD: revc_SYN_RCVD(Elm, inPacket); break; + case TCP_session.ESTABLISHED: revc_ESTABLISHED(Elm, inPacket); break; + case TCP_session.CLOSE_WAIT: revc_CLOSE_WAIT(Elm, inPacket); break; + case TCP_session.LAST_ACK: revc_LAST_ACK(Elm, inPacket); break; + case TCP_session.FIN_WAIT_1: revc_FIN_WAIT_1(Elm, inPacket); break; + case TCP_session.FIN_WAIT_2: revc_FIN_WAIT_2(Elm, inPacket); break; + case TCP_session.CLOSING: revc_CLOSING(Elm, inPacket); break; + case TCP_session.TIME_WAIT: revc_TIME_WAIT(Elm, inPacket); break; + default: + } + } + + } + else { + //throw new TransportLayerPortException("UDP Error: port " + inPacket.get_destPort() + " does not exist. Host \"" + mParentStack.getParentNodeName()+"\"."); + throw new TransportLayerPortException("TCP Error: no application binded port "+inPacket.get_destPort() +" on host \""+ mParentStack.getParentNodeName()+"\"!"); + } + } + } else { + throw new TransportLayerException("TCP Error: incorrect checksum on receiving!"); //comment this line if you have implemented check sum tests :) + } + } + + private void revc_CLOSED(TCP_session Elm, TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException + { + // hm... it is bug! + throw new TransportLayerException("Session exists, but port "+ mSL.get_socket(Elm.getSocket()).dst_port +" not binded!"); + } + private void revc_LISTEN(TCP_session Elm, TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException + { + if(inPacket.get_SYN_flag()){ + Elm.setState(Elm.SYN_RCVD); + int resendtimes[] = {1500,3000,6000,12000,24000,48000,64000,64000,64000,64000,64000,64000,-1}; + boolean flags[] = genFlags(ACK | SYN); + sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, resendtimes); + } + } + private void revc_SYN_SENT(TCP_session Elm, TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException + { + if(inPacket.get_SYN_flag() && inPacket.get_ACK_flag()){ + Elm.setState(Elm.ESTABLISHED); + int resendtimes[] = {}; + boolean flags[] = genFlags(ACK); + sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, resendtimes); + mSL.get_socket(Elm.getSocket()).app.OnConnect(Elm.getSocket()); + } + } + private void revc_SYN_RCVD(TCP_session Elm, TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException + { + if(inPacket.get_ACK_flag()){ + Elm.setState(Elm.ESTABLISHED); + mSL.get_socket(Elm.getSocket()).app.OnConnect(Elm.getSocket()); + } + } + private void revc_ESTABLISHED(TCP_session Elm, TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException + { + + } + private void revc_CLOSE_WAIT(TCP_session Elm, TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException + { + + } + private void revc_LAST_ACK(TCP_session Elm, TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException + { + + } + private void revc_FIN_WAIT_1(TCP_session Elm, TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException + { + + } + private void revc_FIN_WAIT_2(TCP_session Elm, TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException + { + + } + private void revc_CLOSING(TCP_session Elm, TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException + { + + } + private void revc_TIME_WAIT(TCP_session Elm, TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException + { + + } + private long createTimer(int sock, TCP_packet pack, int times[]){ Resender rsnd = new Resender(sock,pack,times); *************** *** 606,609 **** --- 759,773 ---- } + public boolean[] genFlags(int flags){ + boolean f[] = {false, false, false, false, false, false}; + if((flags & URG) == URG) f[URG_flag] = true; + if((flags & ACK) == ACK) f[ACK_flag] = true; + if((flags & PSH) == PSH) f[PSH_flag] = true; + if((flags & RST) == RST) f[RST_flag] = true; + if((flags & SYN) == SYN) f[SYN_flag] = true; + if((flags & FIN) == FIN) f[FIN_flag] = true; + return f; + } + /*STATISTIC PART */ *************** *** 635,662 **** /** ! * This method returns the number of received segments * @author gift (sourceforge.net user) ! * @param Unused. ! * @return int the number of received segments * @version v0.20 */ ! public int GetReceivedSegmentsNumber() { ! return received_segments; } /** ! * This method returns the number of sent segments * @author gift (sourceforge.net user) ! * @param Unused. ! * @return int the number of sent segments * @version v0.20 */ ! public int GetSentSegmentsNumber() { ! return sent_segments; } - /** ! * This method increments sent ACK segments counter * @author gift (sourceforge.net user) * @param numb the number to add --- 799,825 ---- /** ! * This method increments sent ACK segments counter * @author gift (sourceforge.net user) ! * @param numb the number to add ! * @return Nothing * @version v0.20 */ ! public void IncSentACKSegmentsNumber(int numb) { ! sent_ACK+=numb; } /** ! * This method increments received duplicates counter * @author gift (sourceforge.net user) ! * @param numb the number to add ! * @return Nothing * @version v0.20 */ ! public void IncReceivedDuplicatesNumber(int numb) { ! received_duplicates+=numb; } /** ! * This method increments sent duplicates counter * @author gift (sourceforge.net user) * @param numb the number to add *************** *** 664,719 **** * @version v0.20 */ ! public void IncSentACKSegmentsNumber(int numb) { ! sent_ACK+=numb; } ! ! /** ! * This method returns the number of sent ACK segments * @author gift (sourceforge.net user) * @param Unused. ! * @return int the number of sent ACK segments * @version v0.20 */ ! public int GetSentACKSegmentsNumber() { ! return sent_ACK; } /** ! * This method increments received duplicates counter * @author gift (sourceforge.net user) ! * @param numb the number to add ! * @return Nothing * @version v0.20 */ ! public void IncReceivedDuplicatesNumber(int numb) { ! received_duplicates+=numb; } - /** ! * This method returns the number of received duplicates * @author gift (sourceforge.net user) * @param Unused. ! * @return int the number of received duplicates * @version v0.20 */ ! public int GetReceivedDuplicatesNumber() { ! return received_duplicates; } - /** ! * This method increments sent duplicates counter * @author gift (sourceforge.net user) ! * @param numb the number to add ! * @return Nothing * @version v0.20 */ ! public void IncSentDuplicatesNumber(int numb) { ! sent_duplicates+=numb; } - /** * This method returns the number of sent duplicates --- 827,878 ---- * @version v0.20 */ ! public void IncSentDuplicatesNumber(int numb) { ! sent_duplicates+=numb; } ! /** ! * This method returns the number of received segments * @author gift (sourceforge.net user) * @param Unused. ! * @return int the number of received segments * @version v0.20 */ ! public int GetReceivedSegmentsNumber() { ! return received_segments; } /** ! * This method returns the number of sent segments * @author gift (sourceforge.net user) ! * @param Unused. ! * @return int the number of sent segments * @version v0.20 */ ! public int GetSentSegmentsNumber() { ! return sent_segments; } /** ! * This method returns the number of sent ACK segments * @author gift (sourceforge.net user) * @param Unused. ! * @return int the number of sent ACK segments * @version v0.20 */ ! public int GetSentACKSegmentsNumber() { ! return sent_ACK; } /** ! * This method returns the number of received duplicates * @author gift (sourceforge.net user) ! * @param Unused. ! * @return int the number of received duplicates * @version v0.20 */ ! public int GetReceivedDuplicatesNumber() { ! return received_duplicates; } /** * This method returns the number of sent duplicates *************** *** 774,781 **** Simulation.addLayerInfo(protInfo); } - - public void receiveTCPPacket(TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException { - - } --- 933,936 ---- Index: Echo_tcp.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/Echo_tcp.java,v retrieving revision 1.32 retrieving revision 1.33 diff -C2 -d -r1.32 -r1.33 *** Echo_tcp.java 21 Sep 2007 22:42:31 -0000 1.32 --- Echo_tcp.java 22 Sep 2007 23:06:42 -0000 1.33 *************** *** 15,18 **** --- 15,19 ---- import core.Error; import core.Simulation; + import java.util.Vector; /** *************** *** 30,33 **** --- 31,35 ---- private int sock; + private Vector<Integer> connections = new Vector<Integer>(0); /** Creates a new instance of Echo */ *************** *** 59,63 **** public void Accept(int listenSock, int sessionSock) throws TransportLayerException{ ! } --- 61,65 ---- public void Accept(int listenSock, int sessionSock) throws TransportLayerException{ ! connections.add(new Integer(sessionSock)); } *************** *** 72,75 **** --- 74,80 ---- { mParentStack.SL().close(sock); + for(int i=0; i<connections.size(); i++){ + mParentStack.SL().close(connections.get(i).intValue()); + } recieved = 0; } *************** *** 78,81 **** --- 83,89 ---- Close(); mParentStack.SL().free(sock); + for(int i=0; i<connections.size(); i++){ + mParentStack.SL().free(connections.get(i).intValue()); + } } *************** *** 107,111 **** // } // while (ConnectionAttempts>0 && clientPort==-1); ! boolean isconnected = mParentStack.TCP().connect(sock, sdHost, sdPort); return isconnected; --- 115,119 ---- // } // while (ConnectionAttempts>0 && clientPort==-1); ! boolean isconnected = mParentStack.SL().connect(sock, sdHost, sdPort); return isconnected; *************** *** 119,122 **** --- 127,131 ---- */ public void OnConnect(int sock){ + System.out.println("ECHO_TCP: Connected "+sock+" !"); } *************** *** 130,133 **** --- 139,145 ---- try{ Listen(); + if(appType == 1){ + connections.remove(new Integer(sock)); + } }catch(Exception e){ LayerInfo protInfo = new LayerInfo(getClass().getName()); *************** *** 141,144 **** --- 153,160 ---- } + public void OnError(int sock){ + + } + /** * This method sends data to the other side. *************** *** 268,272 **** this.counts--; ! SendData(Data); } else --- 284,288 ---- this.counts--; ! //SendData(Data); } else Index: Application.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/Application.java,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** Application.java 18 Sep 2007 22:29:45 -0000 1.18 --- Application.java 22 Sep 2007 23:06:42 -0000 1.19 *************** *** 76,81 **** --- 76,84 ---- public abstract void OnDisconnect(int sock); + public abstract void OnConnect(int sock); + public abstract void OnError(int sock); + /** * This method sends data to the other side. Index: TCP_session.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/TCP_session.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** TCP_session.java 21 Sep 2007 22:42:31 -0000 1.2 --- TCP_session.java 22 Sep 2007 23:06:44 -0000 1.3 *************** *** 29,33 **** public int seq_number=0; ! public int last_passed=-1; //last sequence number value of the segment that has been passed upstairs public static int Element_id = 0; private int state = CLOSED; --- 29,33 ---- public int seq_number=0; ! private int last_ack_number=0; //last sequence number value of the segment that has been passed upstairs public static int Element_id = 0; private int state = CLOSED; *************** *** 36,40 **** public static final int LISTEN = 1; public static final int SYN_SENT = 2; ! public static final int SYB_RCVD = 3; public static final int ESTABLISHED = 4; public static final int FIN_WAIT_1 = 5; --- 36,40 ---- public static final int LISTEN = 1; public static final int SYN_SENT = 2; ! public static final int SYN_RCVD = 3; public static final int ESTABLISHED = 4; public static final int FIN_WAIT_1 = 5; *************** *** 133,137 **** } else ! System.out.println("TCP session error: segment is not exists"); return timerID; } --- 133,137 ---- } else ! System.out.println("TCP session error on remove: segment is not exists"); return timerID; } *************** *** 144,148 **** } else ! System.out.println("TCP session error: segment is not exists"); return timerID; } --- 144,148 ---- } else ! System.out.println("TCP session error on get: segment is not exists"); return timerID; } *************** *** 159,162 **** --- 159,171 ---- } + public int getLastACK(){ + return last_ack_number; + } + + public void setLastACK(int acknum){ + if(last_ack_number <= acknum) + last_ack_number = acknum; + } + public void inc_received_segments(){ received_segments++; Index: Echo.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/Echo.java,v retrieving revision 1.24 retrieving revision 1.25 diff -C2 -d -r1.24 -r1.25 *** Echo.java 21 Sep 2007 22:42:31 -0000 1.24 --- Echo.java 22 Sep 2007 23:06:42 -0000 1.25 *************** *** 114,118 **** */ ! public void OnDisconnect(int sock){ } /** --- 114,124 ---- */ ! public void OnDisconnect(int sock){ ! ! } ! ! public void OnError(int sock){ ! ! } /** Index: jnSocket.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/jnSocket.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** jnSocket.java 18 Sep 2007 22:29:46 -0000 1.2 --- jnSocket.java 22 Sep 2007 23:06:44 -0000 1.3 *************** *** 22,26 **** public short type; // 0 -- raw, 1 -- udp, 2 -- tcp public boolean open_state; - public short state; public Application app; --- 22,25 ---- *************** *** 34,38 **** public jnSocket(int _number, Application _app, short _type){ open_state = false; - state = 0; type = _type; app = _app; --- 33,36 ---- *************** *** 43,49 **** String key; switch(type){ ! case 0: key=src_IP+String.valueOf(src_port)+"_"+dst_IP+"_"+String.valueOf(dst_port); break; ! case 1: key=genTCPkey(src_port, dst_IP, dst_port); break; ! case 2: key=genUDPkey(src_port); break; default: key=""; } --- 41,47 ---- String key; switch(type){ ! case RAW_socket: key=src_IP+String.valueOf(src_port)+"_"+dst_IP+"_"+String.valueOf(dst_port); break; ! case UDP_socket: key=genUDPkey(src_port); break; ! case TCP_socket: key=genTCPkey(src_port, dst_IP, dst_port); break; default: key=""; } *************** *** 55,60 **** } ! static public String genUDPkey(int port){ ! return String.valueOf(port); } } --- 53,58 ---- } ! static public String genUDPkey(int dstport){ ! return String.valueOf(dstport); } } Index: ExternalProxyApp.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/ExternalProxyApp.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ExternalProxyApp.java 18 Sep 2007 22:29:46 -0000 1.2 --- ExternalProxyApp.java 22 Sep 2007 23:06:42 -0000 1.3 *************** *** 176,179 **** --- 176,183 ---- } + public void OnError(int sock){ + + } + public void OnConnect(int sock) { Index: SNMP.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/SNMP.java,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** SNMP.java 18 Sep 2007 22:29:46 -0000 1.17 --- SNMP.java 22 Sep 2007 23:06:43 -0000 1.18 *************** *** 215,222 **** */ ! public void OnDisconnect(int sock){ } ! public void OnConnect(int sock){ } /** --- 215,231 ---- */ ! public void OnDisconnect(int sock){ + } ! ! public void OnConnect(int sock){ ! ! } ! ! ! public void OnError(int sock){ ! ! } /** |