예제 #1
0
 /*
  * Function: UpdateHeader
  * Description: Deparse the provided header data and write to current peek data
  */
 public static void WriteToBuffer(CircularFrameBuffer.BufferEntry be, ulong destMac, ulong srcMac,
                                  uint ethertype, ulong metadata)
 {
     be.Tdata0   = destMac | (srcMac << 48);
     be.Tdata1   = (srcMac >> 16) | ((ulong)ethertype << 32);
     be.TuserLow = metadata;
 }
예제 #2
0
 /*
  * Function: WriteHeader
  * Description: Write the temporary buffer back into a bufferentry.
  */
 public void WriteToBuffer(CircularFrameBuffer.BufferEntry be, uint part)
 {
     if (part == 0)
     {
         be.Tdata1 = (be.Tdata1 & 0x0000ffffffffffff) | (data_0 << 48);
         be.Tdata2 = (data_0 >> 16) | (data_1 << 48);
         be.Tdata3 = (data_1 >> 16) | (data_2 << 48);
     }
     else if (part == 1)
     {
         if (IHL == 5)
         {
             be.Tdata0 = (be.Tdata0 & ~(ulong)0xffff) | (data_2 >> 16);
         }
         else if (IHL == 6)
         {
             be.Tdata0 = (be.Tdata0 & 0xffff000000000000) | (data_2 >> 16);
         }
         else if (IHL == 7)
         {
             be.Tdata0 = (data_2 >> 16) | (data_3 << 48);
             be.Tdata1 = (be.Tdata1 & 0xffffffffffff0000) | (data_3 >> 16);
         }
         else if (IHL == 8)
         {
             be.Tdata0 = (data_2 >> 16) | (data_3 << 48);
             be.Tdata1 = (be.Tdata1 & 0xffff000000000000) | (data_3 >> 16);
         }
     }
 }
 public static void SetDestInterface(byte portNumber, CircularFrameBuffer.BufferEntry be)
 {
     be.TuserLow = (be.TuserLow & 0xFFFFFFFF00FFFFFF) | ((ulong)portNumber << 24);
 }
예제 #4
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);
        }
예제 #5
0
 /*
  * Function: WriteToBuffer
  * Description: Deparse the header data and write to a bufferentry
  */
 public void WriteToBuffer(CircularFrameBuffer.BufferEntry be)
 {
     WriteToBuffer(be, DestMac, SrcMac, Ethertype, Metadata);
 }