[Javanetsim-cvs] javaNetSim/core/protocolsuite/tcp_ip Echo_tcp.java, 1.43, 1.44 TCP_session.java, 1
Status: Beta
Brought to you by:
darkkey
From: QweR <qw...@us...> - 2009-10-24 23:24:46
|
Update of /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip In directory fdv4jf1.ch3.sourceforge.com:/tmp/cvs-serv2606 Modified Files: Echo_tcp.java TCP_session.java Tcp.java Telnet_server.java Log Message: some TCP bugs fixed Index: Tcp.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/Tcp.java,v retrieving revision 1.107 retrieving revision 1.108 diff -C2 -d -r1.107 -r1.108 *** Tcp.java 24 Oct 2008 16:18:48 -0000 1.107 --- Tcp.java 24 Oct 2009 23:24:33 -0000 1.108 *************** *** 39,42 **** --- 39,44 ---- import java.util.concurrent.ConcurrentLinkedQueue; + import sun.swing.PrintingStatus; + import core.CommunicationException; import core.LayerInfo; *************** *** 84,89 **** public void run() { try{ ! LinkedList q_rs = new LinkedList(); ! LinkedList q_nt = new LinkedList(); synchronized(tcp_timers_lock){ while(!tcp_timers.isEmpty() && current_time > ((Resender)tcp_timers.peek()).getResendTime()){ --- 86,91 ---- public void run() { try{ ! LinkedList<Resender> q_rs = new LinkedList<Resender>(); ! LinkedList<Integer> q_nt = new LinkedList<Integer>(); synchronized(tcp_timers_lock){ while(!tcp_timers.isEmpty() && current_time > ((Resender)tcp_timers.peek()).getResendTime()){ *************** *** 95,99 **** q_rs.add(rs); q_nt.add(new Integer(nt)); ! //printLayerInfo(">>> Timer "+mParentStack.getHostName()+":"+rs.timerID+" was reistalled"); } //System.out.println("Host: "+mParentStack.getHostName()+", time: " + current_time); --- 97,101 ---- q_rs.add(rs); q_nt.add(new Integer(nt)); ! //printLayerInfo(">>> Timer "+mParentStack.getHostName()+":"+rs.timerID+" was reinstalled"); } //System.out.println("Host: "+mParentStack.getHostName()+", time: " + current_time); *************** *** 117,124 **** --- 119,129 ---- private int sock; public int nearest_resend; + public int resend_delay; public long timerID; public Resender(int sock, TCP_packet pack, int times[]){ this.sock = sock; + nearest_resend = 0; + resend_delay = 0; packet = pack; for(int i=0; i<times.length; i++){ *************** *** 157,169 **** //TCP_session tcps = getSession(mParentStack.SL().get_socket(sock).genKey()); if(tcps!=null){ ! tcps.inc_sent_duplicates(); ! tcps.removeSegmentToResend(packet.get_sequence_number()); switch(nt){ ! case 0:{ //normal quit, do nothing break; } case -1:{ try{ - removeTimer(tcps.last_timer); Application app = mSL.get_socket(sock).app; mSL.close(sock); --- 162,175 ---- //TCP_session tcps = getSession(mParentStack.SL().get_socket(sock).genKey()); if(tcps!=null){ ! if(packet!=null){ ! tcps.inc_sent_duplicates(); ! tcps.removeSegmentToResend(packet.get_sequence_number()); ! } switch(nt){ ! case 0:{ //normal end, do nothing break; } case -1:{ try{ Application app = mSL.get_socket(sock).app; mSL.close(sock); *************** *** 208,211 **** --- 214,225 ---- break; } + case -4:{ //TIME_WAIT end, Application already closed + try{ + mSL.close(sock); + }catch(TransportLayerException e){ + System.out.println(e.toString()); + } + break; + } default: System.out.println("TCP error: unsupported resend time"); } *************** *** 218,221 **** --- 232,238 ---- return nearest_resend; } + public int getResendDelay(){ + return resend_delay; + } public int compareTo(Object o){ *************** *** 225,231 **** public int nextTime(int cur_time){ ! if(resend_time.isEmpty()) nearest_resend = 0; else{ ! nearest_resend = resend_time.poll().intValue(); if(nearest_resend>0){ nearest_resend += cur_time; --- 242,252 ---- public int nextTime(int cur_time){ ! if(resend_time.isEmpty()){ ! nearest_resend = 0; ! resend_delay = 0; ! } else{ ! resend_delay = resend_time.poll().intValue(); ! nearest_resend = resend_delay; if(nearest_resend>0){ nearest_resend += cur_time; *************** *** 246,255 **** private static final int MAXTIME = 2000000000; ! 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 int window_size = Tcp.DEFAULT_WINDOW_SIZE; //tcp window-size for new sessions public final static int DEFAULT_WINDOW_SIZE = 10; --- 267,276 ---- private static final int MAXTIME = 2000000000; ! private Hashtable<String,TCP_session> sessionTable = new Hashtable<String,TCP_session>(); private Object sessionTable_lock = new Object(); //for locking Hashtable sessionTable private ProtocolStack mParentStack; private socketLayer mSL; private Timer timer; ! private PriorityQueue<Resender> tcp_timers = new PriorityQueue<Resender>(); private int window_size = Tcp.DEFAULT_WINDOW_SIZE; //tcp window-size for new sessions public final static int DEFAULT_WINDOW_SIZE = 10; *************** *** 257,276 **** private int current_time = 0; private long nextTimerID = 0; ! private static final boolean USE_2MSL = false; ! private static final int MSL_TIME = 2500; ! // private static final int resendtimes_SYN_ACK[] = {1500,3000,6000,12000,24000,28000,-2}; ! // private static final int resendtimes_SYN[] = {6000,24000,45000,-2}; ! // private static final int resendtimes_DEFAULT[] = {1500,3000,6000,12000,24000,48000,64000,64000,64000,64000,64000,64000,-3}; ! // private static final int resendtimes_NULL[] = {}; ! // private static final int resendtimes_2MSL[] = {2*MSL_TIME,-1}; // 2MSL ! // private static final int resendtimes_EXIT[] = {75000,-1}; // non-RFC exit ! // private static final int resendtimes_SYNC_CLOSE[] = {75000, -1}; // synchronous closing ! private static final int resendtimes_SYN_ACK[] = {1000,1000,1000,1000,1000,1000,-2}; ! private static final int resendtimes_SYN[] = {1000,1000,1000,1000,1000,1000,1000,-2}; ! private static final int resendtimes_DEFAULT[] = {1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,-3}; private static final int resendtimes_NULL[] = {}; ! private static final int resendtimes_2MSL[] = {2*Tcp.MSL_TIME,-1}; // 2MSL ! private static final int resendtimes_EXIT[] = {15000,-1}; // non-RFC exit ! private static final int resendtimes_SYNC_CLOSE[] = {15000, -1}; // synchronous closing --- 278,298 ---- private int current_time = 0; private long nextTimerID = 0; ! private static final boolean USE_2MSL = true; ! private static final int MSL_TIME = 60000; ! private static final int resendtimes_SYN_ACK[] = {1500,3000,6000,12000,24000,28000,-2}; ! private static final int resendtimes_SYN[] = {6000,24000,45000,-2}; ! private static final int resendtimes_DEFAULT[] = {1500,3000,6000,12000,24000,48000,64000,64000,64000,64000,64000,64000,-3}; private static final int resendtimes_NULL[] = {}; ! private static final int resendtimes_2MSL[] = {2*MSL_TIME,-4}; // 2MSL ! private static final int resendtimes_EXIT[] = {75000,-1}; // non-RFC exit ! private static final int resendtimes_SYNC_CLOSE[] = {75000, -1}; // synchronous closing ! // private static final int MSL_TIME = 7500; ! // private static final int resendtimes_SYN_ACK[] = {1000,1000,1000,1000,1000,1000,-2}; ! // private static final int resendtimes_SYN[] = {1000,1000,1000,1000,1000,1000,1000,-2}; ! // private static final int resendtimes_DEFAULT[] = {1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,1000,-3}; ! // private static final int resendtimes_NULL[] = {}; ! // private static final int resendtimes_2MSL[] = {2*Tcp.MSL_TIME,-4}; // 2MSL ! // private static final int resendtimes_EXIT[] = {15000,-1}; // non-RFC exit ! // private static final int resendtimes_SYNC_CLOSE[] = {15000, -1}; // synchronous closing *************** *** 365,381 **** { //lets try to reserve any free port - int number=Tcp.PORT_START_NUMBER; boolean Reserved=false; ! while ( (number<Tcp.PORT_START_NUMBER+Tcp.PORT_QUANT) && !(Reserved) ) ! { ! Elm = getSession(jnSocket.genTCPkey(number,"0.0.0.0",0)); ! if (Elm == null) //free port ! { ! 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."); ! } ! number++; } --- 387,412 ---- { //lets try to reserve any free port boolean Reserved=false; ! ! for(int attempt=0; attempt<2 && !Reserved; attempt++){ ! int start=0; ! int end=Tcp.PORT_QUANT/2; ! if(attempt==1){ ! start=Tcp.PORT_START_NUMBER; ! end=Tcp.PORT_START_NUMBER+Tcp.PORT_QUANT; ! } ! for(int i=start; i<end && !Reserved; i++) ! { ! int number=i; ! if(attempt==0) number=(int)Math.floor(Math.random()*Tcp.PORT_QUANT+Tcp.PORT_START_NUMBER); ! Elm = getSession(jnSocket.genTCPkey(number,"0.0.0.0",0)); ! if (Elm == null) //free port ! { ! 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."); ! } ! } } *************** *** 426,430 **** if(!mSL.get_socket(sock_num).open_state){ TCP_session tcps = addSession(jnSocket.genTCPkey(in_Port,"0.0.0.0",0), sock_num); ! tcps.setState(tcps.LISTEN); printLayerInfo("Local port " + in_Port + " is listening."); } --- 457,461 ---- if(!mSL.get_socket(sock_num).open_state){ TCP_session tcps = addSession(jnSocket.genTCPkey(in_Port,"0.0.0.0",0), sock_num); ! tcps.setState(TCP_session.LISTEN); printLayerInfo("Local port " + in_Port + " is listening."); } *************** *** 474,478 **** reserveFreePort(sock); TCP_session Elm = addSession(mSL.get_socket(sock).genKey(), sock); ! Elm.setState(Elm.SYN_SENT); if (sendTCPSegment(sock, "", flags, -1, Tcp.resendtimes_SYN)) --- 505,509 ---- reserveFreePort(sock); TCP_session Elm = addSession(mSL.get_socket(sock).genKey(), sock); ! Elm.setState(TCP_session.SYN_SENT); if (sendTCPSegment(sock, "", flags, -1, Tcp.resendtimes_SYN)) *************** *** 481,485 **** } else{ ! Elm.setState(Elm.CLOSED); } } --- 512,516 ---- } else{ ! Elm.setState(TCP_session.CLOSED); } } *************** *** 511,515 **** if(Elm != null){ ! Elm.setState(Elm.FIN_WAIT_1); boolean flags[] = genFlags(Tcp.FIN); sendTCPSegment(Elm.getSocket(), "", flags, -1, Tcp.resendtimes_DEFAULT); --- 542,546 ---- if(Elm != null){ ! Elm.setState(TCP_session.FIN_WAIT_1); boolean flags[] = genFlags(Tcp.FIN); sendTCPSegment(Elm.getSocket(), "", flags, -1, Tcp.resendtimes_DEFAULT); *************** *** 584,598 **** jnSocket jnsock = mSL.get_socket(sock); - int srcPort = jnsock.src_port; - String dstIP = jnsock.dst_IP; - int dstPort = jnsock.dst_port; TCP_session Elm = getSession(jnsock.genKey()); ! if(!(flags[Tcp.ACK_flag] || flags[Tcp.RST_flag])){ ! Elm.addSendingSegment(tosend, resendtimes); ! trySendSegments(Elm); } else{ ! sendPacket(tosend, Elm); } --- 615,626 ---- jnSocket jnsock = mSL.get_socket(sock); TCP_session Elm = getSession(jnsock.genKey()); ! if((flags[Tcp.ACK_flag] && !flags[Tcp.SYN_flag] && !flags[Tcp.FIN_flag])|| flags[Tcp.RST_flag]){ ! sendPacket(tosend, Elm); } else{ ! Elm.addSendingSegment(tosend, resendtimes); ! trySendSegments(Elm); } *************** *** 630,634 **** System.out.println(e.getMessage()); } ! printLayerInfo("TCP packet send to "+pack_dst+" flags="+pack_flags+" seq="+packet.get_sequence_number()+" ack="+packet.get_acknowledgment_number()+" data='"+packet.getTCP_message()+"'"); // if(packet.get_acknowledgment_number()!=Elm.getNextSequenceNumber()){ --- 658,672 ---- System.out.println(e.getMessage()); } ! ! String resend_mes = ""; ! long tid = Elm.getTimerSegmentToResend(packet.get_sequence_number()); ! Resender tmr = getTimer(tid); ! if(tmr!=null){ ! int nextrt = tmr.getResendDelay(); ! if(nextrt>0){ ! resend_mes = " Next resend on packet loss in "+(nextrt/1000.0)+"s."; ! } ! } ! printLayerInfo("TCP packet send to "+pack_dst+" flags="+pack_flags+" seq="+packet.get_sequence_number()+" ack="+packet.get_acknowledgment_number()+" data='"+packet.getTCP_message()+"'." + resend_mes); // if(packet.get_acknowledgment_number()!=Elm.getNextSequenceNumber()){ *************** *** 672,677 **** int dstPort = jnsock.dst_port; TCP_session Elm = getSession(jnsock.genKey()); - - int reps=50; TCP_packet tosend = new TCP_packet(dstIP,srcIP,dstPort,srcPort); --- 710,713 ---- *************** *** 749,753 **** System.out.println("|| >>> TCP recv pack: src="+pack_src+" dst="+pack_dst+" flags="+pack_flags+" seq="+inPacket.get_sequence_number()+" ack="+inPacket.get_acknowledgment_number()+" data='"+inPacket.getTCP_message()+"'"); ! // test if TCP sesssion exists on this NeworkLayerDevice TCP_session Elm; Elm = getSession(jnSocket.genTCPkey(inPacket.get_destPort(), inPacket.getSourceIPAddress(), inPacket.get_srcPort())); --- 785,789 ---- System.out.println("|| >>> TCP recv pack: src="+pack_src+" dst="+pack_dst+" flags="+pack_flags+" seq="+inPacket.get_sequence_number()+" ack="+inPacket.get_acknowledgment_number()+" data='"+inPacket.getTCP_message()+"'"); ! // test if TCP session exists on this NeworkLayerDevice TCP_session Elm; Elm = getSession(jnSocket.genTCPkey(inPacket.get_destPort(), inPacket.getSourceIPAddress(), inPacket.get_srcPort())); *************** *** 755,763 **** Elm = getSession(jnSocket.genTCPkey(inPacket.get_destPort(), "0.0.0.0", 0)); if(Elm != null){ - int listensock = Elm.getSocket(); 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); } else{ --- 791,797 ---- Elm = getSession(jnSocket.genTCPkey(inPacket.get_destPort(), "0.0.0.0", 0)); if(Elm != null){ int sock = mSL.accept(Elm.getSocket(), inPacket.getSourceIPAddress(), inPacket.get_srcPort()); Elm = addSession(jnSocket.genTCPkey(inPacket.get_destPort(), inPacket.getSourceIPAddress(), inPacket.get_srcPort()), sock); ! Elm.setState(TCP_session.LISTEN); } else{ *************** *** 857,861 **** { if(inPacket.get_SYN_flag()){ ! Elm.setState(Elm.SYN_RCVD); boolean flags[] = genFlags(Tcp.ACK | Tcp.SYN); sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, Tcp.resendtimes_SYN_ACK); --- 891,895 ---- { if(inPacket.get_SYN_flag()){ ! Elm.setState(TCP_session.SYN_RCVD); boolean flags[] = genFlags(Tcp.ACK | Tcp.SYN); sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, Tcp.resendtimes_SYN_ACK); *************** *** 868,872 **** { if(inPacket.get_SYN_flag() && inPacket.get_ACK_flag()){ ! Elm.setState(Elm.ESTABLISHED); boolean flags[] = genFlags(Tcp.ACK); sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, Tcp.resendtimes_NULL); --- 902,906 ---- { if(inPacket.get_SYN_flag() && inPacket.get_ACK_flag()){ ! Elm.setState(TCP_session.ESTABLISHED); boolean flags[] = genFlags(Tcp.ACK); sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, Tcp.resendtimes_NULL); *************** *** 882,888 **** { if(inPacket.get_ACK_flag() && !(inPacket.get_FIN_flag() || inPacket.get_SYN_flag())){ ! Elm.setState(Elm.ESTABLISHED); mSL.get_socket(Elm.getSocket()).app.OnConnect(Elm.getSocket()); ! processSegment(Elm, null); // pass already reveived segments to application } else if(inPacket.get_SYN_flag() && !(inPacket.get_ACK_flag() || inPacket.get_FIN_flag())){ --- 916,922 ---- { if(inPacket.get_ACK_flag() && !(inPacket.get_FIN_flag() || inPacket.get_SYN_flag())){ ! Elm.setState(TCP_session.ESTABLISHED); mSL.get_socket(Elm.getSocket()).app.OnConnect(Elm.getSocket()); ! processSegment(Elm, null); // pass already received segments to application } else if(inPacket.get_SYN_flag() && !(inPacket.get_ACK_flag() || inPacket.get_FIN_flag())){ *************** *** 905,913 **** { if(inPacket.get_FIN_flag() && !inPacket.get_ACK_flag()){ ! Elm.setState(Elm.CLOSE_WAIT); boolean flags[] = genFlags(Tcp.ACK); sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, Tcp.resendtimes_NULL); ! Elm.setState(Elm.LAST_ACK); flags = genFlags(Tcp.FIN); sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, Tcp.resendtimes_DEFAULT); --- 939,947 ---- { if(inPacket.get_FIN_flag() && !inPacket.get_ACK_flag()){ ! Elm.setState(TCP_session.CLOSE_WAIT); boolean flags[] = genFlags(Tcp.ACK); sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, Tcp.resendtimes_NULL); ! Elm.setState(TCP_session.LAST_ACK); flags = genFlags(Tcp.FIN); sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, Tcp.resendtimes_DEFAULT); *************** *** 931,938 **** private void recv_CLOSE_WAIT(TCP_session Elm, TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException { ! if(false){ ! } ! else ! throw new TransportLayerException("TCP: recv_CLOSE_WAIT: unexpected packet"); } --- 965,969 ---- private void recv_CLOSE_WAIT(TCP_session Elm, TCP_packet inPacket) throws TransportLayerPortException, TransportLayerException, LowLinkException, CommunicationException { ! throw new TransportLayerException("TCP: recv_CLOSE_WAIT: unexpected packet"); } *************** *** 957,979 **** { if(inPacket.get_ACK_flag() && inPacket.get_FIN_flag()){ ! Elm.setState(Elm.TIME_WAIT); if(Tcp.USE_2MSL){ Elm.last_timer = createTimer(Elm.getSocket(), null, Tcp.resendtimes_2MSL); } boolean flags[] = genFlags(Tcp.ACK); sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, Tcp.resendtimes_NULL); if(!Tcp.USE_2MSL){ - Application app = mSL.get_socket(Elm.getSocket()).app; mSL.close(Elm.getSocket()); - app.OnDisconnect(Elm.getSocket()); } } else if(inPacket.get_ACK_flag()){ ! Elm.setState(Elm.FIN_WAIT_2); Elm.last_timer = createTimer(Elm.getSocket(), null, Tcp.resendtimes_EXIT); } else if(inPacket.get_FIN_flag()){ ! Elm.setState(Elm.CLOSING); Elm.last_timer = createTimer(Elm.getSocket(), null, Tcp.resendtimes_SYNC_CLOSE); boolean flags[] = genFlags(Tcp.ACK); sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, Tcp.resendtimes_NULL); --- 988,1013 ---- { if(inPacket.get_ACK_flag() && inPacket.get_FIN_flag()){ ! Elm.setState(TCP_session.TIME_WAIT); if(Tcp.USE_2MSL){ Elm.last_timer = createTimer(Elm.getSocket(), null, Tcp.resendtimes_2MSL); + printLayerInfo("Closing port in "+(Tcp.resendtimes_2MSL[0]/1000.0)+"s."); } boolean flags[] = genFlags(Tcp.ACK); sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, Tcp.resendtimes_NULL); + Application app = mSL.get_socket(Elm.getSocket()).app; if(!Tcp.USE_2MSL){ mSL.close(Elm.getSocket()); } + app.OnDisconnect(Elm.getSocket()); } else if(inPacket.get_ACK_flag()){ ! Elm.setState(TCP_session.FIN_WAIT_2); Elm.last_timer = createTimer(Elm.getSocket(), null, Tcp.resendtimes_EXIT); + printLayerInfo("Closing on error in "+(Tcp.resendtimes_EXIT[0]/1000.0)+"s."); } else if(inPacket.get_FIN_flag()){ ! Elm.setState(TCP_session.CLOSING); Elm.last_timer = createTimer(Elm.getSocket(), null, Tcp.resendtimes_SYNC_CLOSE); + printLayerInfo("Closing on error in "+(Tcp.resendtimes_SYNC_CLOSE[0]/1000.0)+"s."); boolean flags[] = genFlags(Tcp.ACK); sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, Tcp.resendtimes_NULL); *************** *** 989,1004 **** { if(inPacket.get_FIN_flag()){ ! Elm.setState(Elm.TIME_WAIT); removeTimer(Elm.last_timer); if(Tcp.USE_2MSL){ Elm.last_timer = createTimer(Elm.getSocket(), null, Tcp.resendtimes_2MSL); } boolean flags[] = genFlags(Tcp.ACK); sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, Tcp.resendtimes_NULL); if(!Tcp.USE_2MSL){ - Application app = mSL.get_socket(Elm.getSocket()).app; mSL.close(Elm.getSocket()); - app.OnDisconnect(Elm.getSocket()); } } else if(!(inPacket.get_ACK_flag() || inPacket.get_SYN_flag() || inPacket.get_FIN_flag())){ --- 1023,1039 ---- { if(inPacket.get_FIN_flag()){ ! Elm.setState(TCP_session.TIME_WAIT); removeTimer(Elm.last_timer); if(Tcp.USE_2MSL){ Elm.last_timer = createTimer(Elm.getSocket(), null, Tcp.resendtimes_2MSL); + printLayerInfo("Closing port in "+(Tcp.resendtimes_2MSL[0]/1000.0)+"s."); } boolean flags[] = genFlags(Tcp.ACK); sendTCPSegment(Elm.getSocket(), "", flags, inPacket.get_sequence_number()+1, Tcp.resendtimes_NULL); + Application app = mSL.get_socket(Elm.getSocket()).app; if(!Tcp.USE_2MSL){ mSL.close(Elm.getSocket()); } + app.OnDisconnect(Elm.getSocket()); } else if(!(inPacket.get_ACK_flag() || inPacket.get_SYN_flag() || inPacket.get_FIN_flag())){ *************** *** 1012,1025 **** { if(inPacket.get_ACK_flag()){ ! Elm.setState(Elm.TIME_WAIT); removeTimer(Elm.last_timer); if(Tcp.USE_2MSL){ Elm.last_timer = createTimer(Elm.getSocket(), null, Tcp.resendtimes_2MSL); } else{ - Application app = mSL.get_socket(Elm.getSocket()).app; mSL.close(Elm.getSocket()); - app.OnDisconnect(Elm.getSocket()); } } else --- 1047,1061 ---- { if(inPacket.get_ACK_flag()){ ! Elm.setState(TCP_session.TIME_WAIT); removeTimer(Elm.last_timer); + Application app = mSL.get_socket(Elm.getSocket()).app; if(Tcp.USE_2MSL){ Elm.last_timer = createTimer(Elm.getSocket(), null, Tcp.resendtimes_2MSL); + printLayerInfo("Closing port in "+(Tcp.resendtimes_2MSL[0]/1000.0)+"s."); } else{ mSL.close(Elm.getSocket()); } + app.OnDisconnect(Elm.getSocket()); } else *************** *** 1092,1095 **** --- 1128,1145 ---- } + private Resender getTimer(long timerid){ + Resender tmr = null; + synchronized(tcp_timers_lock){ + Iterator<Resender> it = tcp_timers.iterator(); + while(tmr==null && it.hasNext()){ + Resender curtmr = it.next(); + if(curtmr.timerID == timerid){ + tmr = curtmr; + } + } + } + return tmr; + } + private TCP_session addSession(String key, int sock){ TCP_session tcps = new TCP_session(sock); Index: TCP_session.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/TCP_session.java,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** TCP_session.java 24 Oct 2008 16:18:48 -0000 1.12 --- TCP_session.java 24 Oct 2009 23:24:33 -0000 1.13 *************** *** 71,79 **** * <p>Aim of this hashtable: necessarily to have</p> */ ! private Hashtable segmentsToResend = new Hashtable(); ! private PriorityQueue receivedSegments = new PriorityQueue(); ! private PriorityQueue sendingSegments = new PriorityQueue(); --- 71,79 ---- * <p>Aim of this hashtable: necessarily to have</p> */ ! private Hashtable<Integer,Long> segmentsToResend = new Hashtable<Integer,Long>(); ! private PriorityQueue<TCP_packet> receivedSegments = new PriorityQueue<TCP_packet>(); ! private PriorityQueue<TCPPacketTimesPair> sendingSegments = new PriorityQueue<TCPPacketTimesPair>(); *************** *** 161,165 **** } ! public long getSegmentToResend(int segnum){ long timerID = -1; Integer sn = new Integer(segnum); --- 161,165 ---- } ! public long getTimerSegmentToResend(int segnum){ long timerID = -1; Integer sn = new Integer(segnum); *************** *** 167,172 **** timerID = ((Long)segmentsToResend.get(sn)).longValue(); } - else - System.out.println("TCP session error on get: segment is not exists"); return timerID; } --- 167,170 ---- Index: Echo_tcp.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/Echo_tcp.java,v retrieving revision 1.43 retrieving revision 1.44 diff -C2 -d -r1.43 -r1.44 *** Echo_tcp.java 24 Oct 2008 16:18:48 -0000 1.43 --- Echo_tcp.java 24 Oct 2009 23:24:33 -0000 1.44 *************** *** 50,55 **** */ @Override ! public void Listen() throws TransportLayerException{ ! //throw new TransportLayerException("Cannot bind port " + listenPort + "."); recieved = 0; try{ --- 50,54 ---- */ @Override ! public void Listen() throws TransportLayerException{ recieved = 0; try{ *************** *** 57,63 **** mParentStack.SL().bind(appSock, mParentStack.getSrcIP(), listenPort); mParentStack.SL().listen(appSock); } }catch (TransportLayerException e){ ! System.out.println(e.toString());; } } --- 56,64 ---- mParentStack.SL().bind(appSock, mParentStack.getSrcIP(), listenPort); mParentStack.SL().listen(appSock); + printLayerInfo("Echo TCP server starts listening in port " + listenPort + "."); } }catch (TransportLayerException e){ ! printLayerInfo("Error: cannot bind port " + listenPort + "."); ! throw new TransportLayerException("Cannot bind port " + listenPort + "."); } } Index: Telnet_server.java =================================================================== RCS file: /cvsroot/javanetsim/javaNetSim/core/protocolsuite/tcp_ip/Telnet_server.java,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** Telnet_server.java 24 Oct 2008 17:46:42 -0000 1.26 --- Telnet_server.java 24 Oct 2009 23:24:33 -0000 1.27 *************** *** 70,76 **** --- 70,79 ---- mParentStack.SL().bind(appSock, mParentStack.getSrcIP(), listenPort); mParentStack.SL().listen(appSock); + printLayerInfo("Telnet server starts listening in port " + listenPort + "."); running = true; }catch (TransportLayerException e){ + printLayerInfo("Error: cannot bind port " + listenPort + "."); System.out.println(e.toString());; + throw new TransportLayerException("Cannot bind port " + listenPort + "."); } islogin=false; |