// // Procesing thread for incoming packets from the TNC. The TNC places a buffer // containing the incoming data into the channel's receive queue. This routine pulls // these frames from the queue for processing. // // Processing steps: // - Parse the raw incoming frame into a receive buffer. // - Find the Data Link Provider handling incoming data for the Station ID // specified in the incoming address field of the packet. If no matching // dlp is registered, then we simply drop the packet. (Future: we add in support // for multi-cast packets, which will forward to all registered DLPs) // - Place the frame, source, and buffer type into a packet object and place it into the // receive queue of the target DLP. // void RecvFromPort() { String parsedFrameString = ""; Byte[] buf; Support.DbgPrint(Thread.CurrentThread.Name + "Starting."); while (runFlag && comSerialPort.Enabled) { try { buf = Recv(); } catch { continue; } if (buf == null) { continue; } // check for ACKMODE Response (Need to be at channel level to find DLC) (JNW Jan15) if (buf.Length == 2) // Only ACK frames are this short { Int16 AckID = (Int16)(buf[0] << 8 | buf[1]); Connection con; lock (dataLinkProviderList) foreach (DataLinkProvider dlp in dataLinkProviderList) { con = GetConnectionByACKModeID(dlp, AckID); if (con != null) { // Set Timer back to normal con.timerAck.SetTime(con.smoothedRoundTrip, true); break; } } continue; // Donf pass Ack frame up to next level } // // Parse raw buffer // Frame.ReceivedFrame pFrame = new Frame.ReceivedFrame(buf, out parsedFrameString); // // Output to monitor queue is enabled // if (!_packetMonitorEnable.Equals(PacketMonitorType.None)) { StringBuilder frameString = new StringBuilder("|chan:" + chanNum.ToString() + "|<--", 4096); frameString.Append(parsedFrameString); if (_packetMonitorEnable.Equals(PacketMonitorType.LogFile) || _packetMonitorEnable.Equals(PacketMonitorType.Both)) { Support.PktPrint(frameString.ToString() + CRLF, ref packetLogSyncObject); } if (_packetMonitorEnable.Equals(PacketMonitorType.Queue) || _packetMonitorEnable.Equals(PacketMonitorType.Both)) { packetMonitorQueue.Enqueue(frameString.ToString()); } } Frame.Packet packet = new Frame.Packet(pFrame); DigipeatCheckAndProcess(packet); //continue; // // Send up to the data link provider handling the specified StationID // //dlp.Send(packet); } Support.DbgPrint(Thread.CurrentThread.Name + "Exiting."); }
public Packet(Frame.ReceivedFrame receivedType) { receivedFrame = receivedType; }