Пример #1
0
        /*
         * Function: WriteToBuffer
         * Description: Deparse and write to a bufferentry
         */
        public byte WriteToBuffer(CircularFrameBuffer.BufferEntry be, byte offset)
        {
            for (byte dataitem = 0; dataitem < 4; dataitem++)
            {
                ulong data;
                if (dataitem > 3)
                {
                    return(0);
                }

                switch (dataitem)
                {
                case 0:
                    data = SrcPort;
                    break;

                case 1:
                    data = DestPort;
                    break;

                case 2:
                    data = Length;
                    break;

                case 3:
                    data = Checksum;
                    break;

                default:
                    return(1);
                }

                var linenum    = offset / 64;
                var lineoffset = offset % 64;
                if (lineoffset % 8 != 0)
                {
                    DebugFunctions.push_interrupt(DebugFunctions.Errors.ILLEGAL_PACKET_FORMAT);
                }

                if (lineoffset <= 48)
                {
                    switch (linenum)
                    {
                    case 0:
                        be.Tdata0 = (be.Tdata0 & ~((ulong)0xffff << lineoffset)) | (data << lineoffset);
                        break;

                    case 1:
                        be.Tdata1 = (be.Tdata1 & ~((ulong)0xffff << lineoffset)) | (data << lineoffset);
                        break;

                    case 2:
                        be.Tdata2 = (be.Tdata2 & ~((ulong)0xffff << lineoffset)) | (data << lineoffset);
                        break;

                    case 3:
                        be.Tdata3 = (be.Tdata3 & ~((ulong)0xffff << lineoffset)) | (data << lineoffset);
                        break;
                    }
                }
                else
                {
                    switch (linenum)
                    {
                    case 0:
                        be.Tdata0 = (be.Tdata0 & ~((ulong)0xffff << lineoffset)) | (data << lineoffset);
                        be.Tdata1 = (be.Tdata1 & ~((ulong)0xffff >> (64 - lineoffset))) |
                                    (data >> (64 - lineoffset));
                        break;

                    case 1:
                        be.Tdata1 = (be.Tdata1 & ~((ulong)0xffff << lineoffset)) | (data << lineoffset);
                        be.Tdata2 = (be.Tdata2 & ~((ulong)0xffff >> (64 - lineoffset))) |
                                    (data >> (64 - lineoffset));
                        break;

                    case 2:
                        be.Tdata2 = (be.Tdata2 & ~((ulong)0xffff << lineoffset)) | (data << lineoffset);
                        be.Tdata3 = (be.Tdata3 & ~((ulong)0xffff >> (64 - lineoffset))) |
                                    (data >> (64 - lineoffset));
                        break;

                    case 3:
                        DebugFunctions.push_interrupt(DebugFunctions.Errors.ILLEGAL_PACKET_FORMAT);
                        break;
                    }
                }

                offset += 16;
            }

            return(0);
        }
Пример #2
0
        /*
         * Function: ParseSplit
         * Description: A two-part parser to allow the first section of the packet to be parsed.
         */
        public byte ParseSplit(CircularFrameBuffer cfb, bool skip = false)
        {
            //lock (cfb.PeekData)
            {
                if (!skip)
                {
                    data_0  = cfb.PeekData.Tdata1 >> 48;
                    data_0 |= cfb.PeekData.Tdata2 << 16;
                    data_1  = cfb.PeekData.Tdata2 >> 48;
                    data_1 |= cfb.PeekData.Tdata3 << 16;
                    data_2  = cfb.PeekData.Tdata3 >> 48;

                    Version = (byte)((cfb.PeekData.Tdata1 >> 52) & 0x0f);
                    if (Version != 4)
                    {
                        DebugFunctions.push_interrupt(DebugFunctions.Errors.ILLEGAL_PACKET_FORMAT);
                    }
                    IHL = (byte)((cfb.PeekData.Tdata1 >> 48) & 0x0f);
                    if (IHL < 5 || IHL > 8)
                    {
                        DebugFunctions.push_interrupt(DebugFunctions.Errors.ILLEGAL_PACKET_FORMAT);
                    }
                    DSCP           = (byte)((cfb.PeekData.Tdata1 >> 58) & 0x3F);
                    ECN            = (byte)((cfb.PeekData.Tdata1 >> 56) & 0x3);
                    TotalLength    = (uint)(cfb.PeekData.Tdata2 & 0x00ffff);
                    Identification = (uint)((cfb.PeekData.Tdata2 >> 16) & 0x00ffff);
                    Flags          = (byte)((cfb.PeekData.Tdata2 >> 37) & 0x07);
                    FragmentOffset = (uint)((((cfb.PeekData.Tdata2 >> 32) & 0x01f) << 8) |
                                            ((cfb.PeekData.Tdata2 >> 40) & 0x0ff));
                    TTL            = (byte)((cfb.PeekData.Tdata2 >> 48) & 0x00ff);
                    Protocol       = (byte)((cfb.PeekData.Tdata2 >> 56) & 0x00ff);
                    HeaderChecksum = (uint)cfb.PeekData.Tdata3 & 0x00ffff;
                    SrcIp          = (cfb.PeekData.Tdata3 >> 16) & 0x00ffffffff;
                    _tmp_dest_ip   = (cfb.PeekData.Tdata3 >> 48) & 0x00ffff;
                }


                if (!cfb.CanAdvance())
                {
                    return(2);
                }

                cfb.AdvancePeek();

                if (IHL == 5)
                {
                    data_2 |= (cfb.PeekData.Tdata0 & 0xffff) << 16;
                }
                else if (IHL == 6)
                {
                    data_2 |= cfb.PeekData.Tdata0 << 16;
                    if (IHL == 7)
                    {
                        data_3  = cfb.PeekData.Tdata0 >> 48;
                        data_3 |= (cfb.PeekData.Tdata1 & 0xffff) << 16;
                    }
                    else if (IHL == 8)
                    {
                        data_3  = cfb.PeekData.Tdata0 >> 48;
                        data_3 |= cfb.PeekData.Tdata1 << 16;
                    }
                }

                DestIp = _tmp_dest_ip | ((cfb.PeekData.Tdata0 & 0x00ffff) << 16);
            }

            return(0);
        }