Example #1
0
        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);
        }
Example #2
0
        /// <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);
        }
Example #3
0
        /// <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);
        }