/// <summary> /// Add packet for handling /// </summary> /// <param name="buffer">The packet buffer</param> /// <param name="size">The packet buffer size</param> public static unsafe void QueueReceivePacket(byte[] buffer, int size) { if (size < sizeof(EthernetHeader)) { #if NETWORK_DEBUG Console.WriteLine("[NET] size < sizeof(EthernetHeader)"); #endif return; } NetRecBuffer *netBuf = (NetRecBuffer *)Heap.Alloc(sizeof(NetRecBuffer)); if (netBuf == null) { #if NETWORK_DEBUG Console.WriteLine("[NET] netBuf = null"); #endif return; } netBuf->Size = size; netBuf->Buffer = (byte *)Heap.Alloc(size); if (netBuf->Buffer == null) { #if NETWORK_DEBUG Console.WriteLine("[NET] netbuf->buffer == null"); #endif Heap.Free(netBuf); return; } Memory.Memcpy(netBuf->Buffer, Util.ObjectToVoidPtr(buffer), size); m_recPacketQueue.Push(netBuf); }
/// <summary> /// Wait for packets and handle it! /// </summary> private static unsafe void handlePackets() { while (true) { while (m_recPacketQueue.IsEmpty()) { Tasking.Yield(); } NetRecBuffer *buffer = (NetRecBuffer *)m_recPacketQueue.Pop(); #if NETWORK_DEBUG if (buffer == null) { Console.WriteLine("[NET] buffer == null?!"); continue; } #endif handlePacket(Util.PtrToArray(buffer->Buffer), buffer->Size); Heap.Free(buffer->Buffer); Heap.Free(buffer); } }