unsafe public List <PacapData> Parse() { List <PacapData> pacapDataList = new List <PacapData>(); while (this.Position != this.Length) { byte[] PktHeaderBuffer = new byte[sizeof(PacapPacketHeader)]; this.Read(PktHeaderBuffer, 0, sizeof(PacapPacketHeader)); fixed(byte *pktPtr = PktHeaderBuffer) { PacapPacketHeader *pktHeader = (PacapPacketHeader *)pktPtr; byte[] data = new byte[pktHeader->Len]; int nReadCount = 0; while (nReadCount < pktHeader->Len) { nReadCount += this.Read(data, 0, (int)(pktHeader->Len - nReadCount)); } fixed(byte *enterPtr = data) { EthernetHeader *etherHeader = (EthernetHeader *)enterPtr; byte * ipPtr = enterPtr + sizeof(EthernetHeader); IPHeader * header = (IPHeader *)ipPtr; int protocol = header->ProtocolType; PacapData pData = null; switch ((ProtocolType)header->ProtocolType) { case ProtocolType.TCP: pData = new TcpData(); break; case ProtocolType.UDP: pData = new UdpData(); break; } if (pData != null) { int offset = sizeof(EthernetHeader) + pData.HeaderLen; pData.IPHeader = *header; pData.EthernetHeader = *etherHeader; pData.PacketHeader = *pktHeader; pData.Fill(data, offset, (int)(pktHeader->Len - offset)); pacapDataList.Add(pData); } } } } return(pacapDataList); }
/// <summary> /// Add header to packet /// </summary> /// <param name="packet">Packet structure</param> /// <param name="dest">Destination MAC</param> /// <param name="src">Source MAC</param> /// <param name="protocol">Protocol</param> /// <returns></returns> private static unsafe EthernetHeader *addHeader(NetPacketDesc *packet, byte[] dest, byte[] src, EthernetTypes protocol) { packet->start -= (short)sizeof(EthernetHeader); EthernetHeader *header = (EthernetHeader *)(packet->buffer + packet->start); Memory.Memcpy(header->Destination, Util.ObjectToVoidPtr(dest), 6); Memory.Memcpy(header->Source, Util.ObjectToVoidPtr(src), 6); header->Protocol = Byte.ReverseBytes((ushort)protocol); return(header); }
/// <summary> /// Handle single receive packet /// </summary> /// <param name="buffer"></param> /// <param name="size"></param> private static unsafe void handlePacket(byte[] buffer, int size) { #if NETWORK_DEBUG Console.Write("[NET] Receive packet with "); Console.WriteNum(size); Console.WriteLine(" bytes"); #endif byte *bufPtr = (byte *)Util.ObjectToVoidPtr(buffer); EthernetHeader *header = (EthernetHeader *)bufPtr; ushort proto = Byte.ReverseBytes(header->Protocol); m_handlers[proto]?.Invoke(Util.PtrToArray(header->Source), bufPtr + sizeof(EthernetHeader), (uint)size); }