/* * 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); }
/* * 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); }