Esempio n. 1
0
        /// <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));
                }
            }
        }
Esempio n. 2
0
        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);
        }