private void ExtractUpperPacket(TcpPacket tcp) { TpktFileds tf = new TpktFileds(); string srcIp = tcp.ParentPacket <IPv4Packet>().SourceAddress.ToString(); tpktBuff = TpktPacketBufferFactory.GetBuffer(srcIp); if (tpktBuff.Count > 0 && !tpktBuff.IsReassembled) { tf.LeadWithSegment = true; tf.LeadingSegmentLength = tpktBuff.Last.NextFrameSegmentLength; } byte[] header = tcp.PayloadData.Take(TpktFileds.HeaderLength).ToArray(); if (tf.LeadWithSegment || TpktPacket.IsTpkt(header)) { TpktPacket tpkt = new TpktPacket(tcp.PayloadData, tcp, tf); if (tpkt.PayloadPacket != null || tpkt.PayloadData != null) { tpktBuff.Add(tpkt); if (tpktBuff.IsReassembled) { foreach (TpktPacket reassTpkt in tpktBuff.Reassembled) { CotpPacket cotp = reassTpkt.Extract <CotpPacket>(); if (cotp.Type == CotpPacket.TpduType.DataTransfer) { cotpBuff = CotpPacketBufferFactory.GetBuffer(srcIp); cotpBuff.Add(cotp); if (cotpBuff.IsReassembled) { CotpPacket reassCotp = cotpBuff.Reassembled; var session = new OsiSessionPacket(reassCotp.PayloadData, reassCotp); //packets.Add(); var mms = session.Extract <MmsPacket>(); if (mms != null) { packets.Push(mms); } else { packets.Push(session); } cotpBuff.Reset(); } } } tpktBuff.Reset(); } } } }
private static void ExtractUpperPacket(TcpPacket tcp) { TpktFileds tf = new TpktFileds(); string srcIp = tcp.ParentPacket <IPv4Packet>().SourceAddress.ToString(); tpktBuff = TpktPacketBufferFactory.GetBuffer(srcIp); if (tpktBuff.Count > 0 && !tpktBuff.IsReassembled) { tf.LeadWithSegment = true; tf.LeadingSegmentLength = tpktBuff.Last.NextFrameSegmentLength; } byte[] header = tcp.PayloadData.Take(TpktFileds.HeaderLength).ToArray(); if (tf.LeadWithSegment || TpktPacket.IsTpkt(header)) { TpktPacket tpkt = new TpktPacket(tcp.PayloadData, tcp, tf); if (tpkt.PayloadPacket != null || tpkt.PayloadData != null) { tpktBuff.Add(tpkt); if (tpktBuff.IsReassembled) { foreach (TpktPacket reassTpkt in tpktBuff.Reassembled) { CotpPacket cotp = reassTpkt.Extract <CotpPacket>(); if (cotp.Type == CotpPacket.TpduType.DataTransfer) { cotpBuff = CotpPacketBufferFactory.GetBuffer(srcIp); cotpBuff.Add(cotp); if (cotpBuff.IsReassembled) { CotpPacket reassCotp = cotpBuff.Reassembled; var session = new OsiSessionPacket(reassCotp.PayloadData, reassCotp); //packets.Add(); var mms = session.Extract <MmsPacket>(); if (mms != null) { packets.Add(mms); } else { packets.Add(session); } cotpBuff.Reset(); #region For debug #if DEBUG && SHOW_DETAILS MmsPacket mms = (MmsPacket)packets.Last().Extract(typeof(MmsPacket)); if (mms.Pdu is UnconfirmedPdu) { var pdu = mms.Pdu as UnconfirmedPdu; string dsRef = pdu.Service.InformationReport.ListOfAccessResult[3].Success.GetValue <IEC61850Packet.Asn1.Types.VisibleString>().Value; Console.WriteLine("No. {0}: {1}", currentPacketIndex, dsRef); } #endif #endregion } } } tpktBuff.Reset(); } } } }