sitara_depot/components/free_rtos/ethernet_ip/eth_arp.hpp
algin ae3cac8a7d feat: First commit
Adds sitara_depot/free_rtos

Original one is on server_gorbunov/SmartForce4.0/sitara_depot
2023-05-03 14:01:32 +03:00

80 lines
1.8 KiB
C++

/*
* eth_arp.hpp
*
* Created on: 13 ìàð. 2023 ã.
* Author: sychev
*/
#ifndef FREE_RTOS_ETHERNET_IP_ETH_ARP_HPP_
#define FREE_RTOS_ETHERNET_IP_ETH_ARP_HPP_
#include <map>
#include <cstdint>
#include "ethernet_ip/eth_arp_iface.hpp"
#include "ethernet_ip/eth_stack_iface.hpp"
#include "handler_store/handler.hpp"
#include "clock/clock.hpp"
#include "timer_sw/timer_sw.hpp"
namespace free_rtos {
class EthArp : public Handler, public EthArpIface {
public:
EthArp(EthStackIface& eth_stack);
bool init(TEthMacPorts eth_port_id, uint64_t self_mac, uint32_t self_ip);
bool getIpAddr(uint64_t mac, uint32_t& ip);
virtual bool getMacAddr(uint32_t ip, uint64_t& mac) override;
bool try_request(uint32_t ip);
virtual int32_t Process(uint8_t * p_data, uint32_t len) override;
private:
bool request(uint32_t ip);
void add(uint64_t mac, uint32_t ip);
void init_request_pkt(uint64_t self_mac, uint32_t self_ip);
friend void clock_timeout(ClockP_Object * obj, void * arg);
private:
enum Operations {
e_oprRequest,
e_oprReply,
e_oprTotal
};
struct ArpIpReqData {
uint64_t mac = 0; /// Ìàê-àäðåñ
uint32_t attemps = 0; /// Êîëèò÷åñòâî ïîïûòîê çàïðîñà
TimerSw tmr; /// Òàéìåð çàïðîñîâ
};
static const uint32_t pkt_len = 42;
const uint16_t arp_opr_be_[e_oprTotal] = {0x0100, 0x0200};
const uint32_t max_attemps_ = 8;
TEthPkt request_pkt_;
std::map<uint64_t, uint32_t> table_mac_; /// Êëþ÷ mac, çíà÷åíèå ip
std::map<uint32_t, ArpIpReqData> table_ip_; /// Êëþ÷ ip,
uint64_t self_mac_;
uint32_t self_ip_;
TEthMacPorts eth_port_id_;
EthStackIface& eth_stack_;
Clock clock_;
TimerSw tmrGratuitous_;
};
}
#endif /* FREE_RTOS_ETHERNET_IP_ETH_ARP_HPP_ */