/* * 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; }
/* * 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); }
/* * 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: WriteToBuffer * Description: Deparse the header data and write to a bufferentry */ public void WriteToBuffer(CircularFrameBuffer.BufferEntry be) { WriteToBuffer(be, DestMac, SrcMac, Ethertype, Metadata); }