/* * Copyright 2005, Ingo Weinhold . * All rights reserved. Distributed under the terms of the MIT License. */ #ifndef _BOOT_ARP_H #define _BOOT_ARP_H #include #include class ARPService : public EthernetSubService { // actually ARP for IP over ethernet public: ARPService(EthernetService *ethernet); virtual ~ARPService(); status_t Init(); virtual uint16 EthernetProtocol() const; virtual void HandleEthernetPacket(EthernetService *ethernet, const mac_addr_t &targetAddress, const void *data, size_t size); status_t GetMACForIP(ip_addr_t ip, mac_addr_t &mac); private: enum { MAP_ENTRY_COUNT = 10 }; enum { ARP_REQUEST_RETRY_COUNT = 3 }; enum { ARP_REPLY_TIMEOUT = 5000 }; struct MapEntry { int32 age; ip_addr_t ip; mac_addr_t mac; }; status_t _SendARPPacket(ip_addr_t ip, const mac_addr_t &mac, uint16 opcode); MapEntry *_FindEntry(ip_addr_t ip); void _PutEntry(ip_addr_t ip, const mac_addr_t &mac); EthernetService *fEthernet; int32 fAge; MapEntry fEntries[MAP_ENTRY_COUNT]; }; #endif // _BOOT_ARP_H