/// <summary> /// Handle packet /// </summary> /// <param name="buffer">Buffer pointer</param> /// <param name="size">Size</param> private static unsafe void handler(byte[] mac, byte *buffer, uint size) { ARPHeader *header = (ARPHeader *)buffer; // Only IPV4 - Ethernet ARP packages allowed! :) if (Byte.ReverseBytes(header->ProtocolType) != 0x0800 || Byte.ReverseBytes(header->HardwareType) != 1) { return; } if (Byte.ReverseBytes(header->Opcode) == OP_REPLY) { FindOrAdd(Util.PtrToArray(header->SrcIP), Util.PtrToArray(header->SrcHw)); } else { // Our IP? if (header->DstIP[0] == Network.Settings->IP[0] && header->DstIP[1] == Network.Settings->IP[1] && header->DstIP[2] == Network.Settings->IP[2] && header->DstIP[3] == Network.Settings->IP[3]) { ArpSend(OP_REPLY, Util.PtrToArray(header->SrcHw), Util.PtrToArray(header->SrcIP)); } } }
public static unsafe void ArpSend(ushort op, byte[] hwAddr, byte[] ip) { byte *mac = (byte *)Heap.Alloc(6); Network.GetMac(mac); NetPacketDesc *packet = NetPacket.Alloc(); ARPHeader *hdr = (ARPHeader *)(packet->buffer + packet->end); hdr->HardwareType = Byte.ReverseBytes(0x01); hdr->ProtocolType = Byte.ReverseBytes(0x800); hdr->HardwareAdrLength = 6; hdr->ProtocolAdrLength = 4; hdr->Opcode = Byte.ReverseBytes(op); Memory.Memcpy(hdr->SrcIP, Network.Settings->IP, 4); Memory.Memcpy(hdr->SrcHw, mac, 6); Memory.Memcpy(hdr->DstIP, Util.ObjectToVoidPtr(ip), 4); if (op == OP_REPLY) { Memory.Memcpy(hdr->DstHw, Util.ObjectToVoidPtr(hwAddr), 6); } else { Memory.Memset(hdr->DstHw, 0, 6); } packet->end += (short)sizeof(ARPHeader); Ethernet.SendMAC(packet, hwAddr, EthernetTypes.ARP); NetPacket.Free(packet); Heap.Free(mac); }