/// <summary> /// Send ethernet packet /// </summary> /// <param name="packet">Packet structure</param> /// <param name="destMAC">Destination MAC</param> /// <param name="protocol">Protocol</param> public static unsafe void Send(NetPacketDesc *packet, byte[] destIP, EthernetTypes protocol) { // 1 TIME PLEASE byte *srcMAC = (byte *)Heap.Alloc(6); Network.GetMac(srcMAC); // Get MAC from ARP :D byte *dstMac = (byte *)Heap.Alloc(6); bool found = Route.FindRoute(destIP, dstMac); if (!found) { Heap.Free(srcMAC); Heap.Free(dstMac); return; } addHeader(packet, Util.PtrToArray(dstMac), Util.PtrToArray(srcMAC), protocol); Network.Transmit(packet); Heap.Free(srcMAC); Heap.Free(dstMac); }
/// <summary> /// Send ethernet packet /// </summary> /// <param name="packet">Packet structure</param> /// <param name="destMAC">Destination MAC</param> /// <param name="protocol">Protocol</param> public static unsafe void SendMAC(NetPacketDesc *packet, byte[] destMac, EthernetTypes protocol) { // 1 TIME PLEASE byte *srcMAC = (byte *)Heap.Alloc(6); Network.GetMac(srcMAC); addHeader(packet, destMac, Util.PtrToArray(srcMAC), protocol); Heap.Free(srcMAC); Network.Transmit(packet); }
/// <summary> /// Add header to packet /// </summary> /// <param name="packet">Packet structure</param> /// <param name="dest">Destination MAC</param> /// <param name="src">Source MAC</param> /// <param name="protocol">Protocol</param> /// <returns></returns> private static unsafe EthernetHeader *addHeader(NetPacketDesc *packet, byte[] dest, byte[] src, EthernetTypes protocol) { packet->start -= (short)sizeof(EthernetHeader); EthernetHeader *header = (EthernetHeader *)(packet->buffer + packet->start); Memory.Memcpy(header->Destination, Util.ObjectToVoidPtr(dest), 6); Memory.Memcpy(header->Source, Util.ObjectToVoidPtr(src), 6); header->Protocol = Byte.ReverseBytes((ushort)protocol); return(header); }