root/headers/private/kernel/boot/net/ARP.h
/*
 * Copyright 2005, Ingo Weinhold <bonefish@cs.tu-berlin.de>.
 * All rights reserved. Distributed under the terms of the MIT License.
 */

#ifndef _BOOT_ARP_H
#define _BOOT_ARP_H

#include <boot/net/Ethernet.h>

#include <OS.h>

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