/// <summary> /// Handle incoming TCP packets according to current connection status. /// </summary> /// <param name="packet">Packet to receive.</param> /// <exception cref="OverflowException">Thrown on fatal error (contact support).</exception> /// <exception cref="Sys.IO.IOException">Thrown on IO error.</exception> internal void ReceiveData(TCPPacket packet) { Global.mDebugger.Send("[" + table[(int)Status] + "] " + packet.ToString()); switch (Status) { case Status.LISTEN: ProcessListen(packet); break; case Status.SYN_SENT: ProcessSynSent(packet); break; case Status.SYN_RECEIVED: ProcessSynReceived(packet); break; case Status.ESTABLISHED: ProcessEstablished(packet); break; case Status.FIN_WAIT1: ProcessFinWait1(packet); break; case Status.FIN_WAIT2: ProcessFinWait2(packet); break; case Status.CLOSE_WAIT: ProcessCloseWait(packet); break; case Status.CLOSING: ProcessClosing(packet); break; case Status.LAST_ACK: ProcessCloseWait(packet); break; case Status.TIME_WAIT: break; case Status.CLOSED: break; default: throw new Exception("Unknown TCP connection state."); } }
/// <summary> /// Handle incoming TCP packets according to current connection status. /// </summary> /// <param name="packet">Packet to receive.</param> /// <exception cref="OverflowException">Thrown on fatal error (contact support).</exception> /// <exception cref="Sys.IO.IOException">Thrown on IO error.</exception> internal void ReceiveData(TCPPacket packet) { Global.mDebugger.Send("[" + table[(int)Status] + "] " + packet.ToString()); if (Status == Status.CLOSED) { //DO NOTHING } else if (Status == Status.LISTEN) { ProcessListen(packet); } else if (Status == Status.SYN_SENT) { ProcessSynSent(packet); } else { // Check sequence number and segment data. if (TCB.RcvNxt <= packet.SequenceNumber && packet.SequenceNumber + packet.TCP_DataLength < TCB.RcvNxt + TCB.RcvWnd) { switch (Status) { case Status.SYN_RECEIVED: ProcessSynReceived(packet); break; case Status.ESTABLISHED: ProcessEstablished(packet); break; case Status.FIN_WAIT1: ProcessFinWait1(packet); break; case Status.FIN_WAIT2: ProcessFinWait2(packet); break; case Status.CLOSE_WAIT: ProcessCloseWait(packet); break; case Status.CLOSING: ProcessClosing(packet); break; case Status.LAST_ACK: ProcessCloseWait(packet); break; case Status.TIME_WAIT: break; default: Global.mDebugger.Send("Unknown TCP connection state."); break; } } else { if (!packet.RST) { SendEmptyPacket(Flags.ACK); } Global.mDebugger.Send("Sequence number or segment data invalid, packet passed."); } } }