SatCat5
eth_arp.h
Go to the documentation of this file.
1 // Copyright 2021-2025 The Aerospace Corporation.
3 // This file is a part of SatCat5, licensed under CERN-OHL-W v2 or later.
13 
14 #pragma once
15 
16 #include <satcat5/ethernet.h>
17 #include <satcat5/ip_core.h>
18 #include <satcat5/list.h>
19 
20 namespace satcat5 {
21  namespace eth {
23  struct ArpHeader {
26  u16 oper; // Operation (1 = request, 2 = reply)
27  satcat5::eth::MacAddr sha, tha; // MAC ("hardware address")
28  satcat5::ip::Addr spa, tpa; // IPv4 ("protocol address")
30 
32  constexpr ArpHeader()
33  : oper(0), sha{}, tha{}, spa(), tpa() {}
34  ArpHeader(const ArpHeader& t) = default;
35  ArpHeader& operator=(const ArpHeader& t) = default;
36 
39 
41  void write_to(satcat5::io::Writeable* wr) const;
42  };
43 
46  class ArpListener {
47  public:
50  virtual void arp_event(
51  const satcat5::eth::MacAddr& mac,
52  const satcat5::ip::Addr& ip) = 0;
53 
56  virtual void gateway_change(
57  const satcat5::ip::Addr& dstaddr,
58  const satcat5::ip::Addr& gateway) {}
59 
60  private:
61  // Linked list to the next listener object.
64  };
65 
69  public:
71  ProtoArp(
72  satcat5::eth::Dispatch* dispatcher,
73  const satcat5::ip::Addr& ipaddr = satcat5::ip::ADDR_NONE);
74 
76  inline void add(satcat5::eth::ArpListener* evt)
77  {m_listeners.add(evt);}
80  {m_listeners.remove(evt);}
81 
83  inline void set_ipaddr(const satcat5::ip::Addr& ipaddr)
84  {m_ipaddr = ipaddr;}
85 
87  inline void set_proxy(const satcat5::ip::Table* table)
88  {m_table = table;}
89 
91  bool send_announce(
92  const satcat5::eth::VlanTag& vtag = satcat5::eth::VTAG_NONE) const;
93 
95  bool send_probe(
96  const satcat5::ip::Addr& target,
97  const satcat5::eth::VlanTag& vtag = satcat5::eth::VTAG_NONE);
98 
100  bool send_query(
101  const satcat5::ip::Addr& target,
102  const satcat5::eth::VlanTag& vtag = satcat5::eth::VTAG_NONE);
103 
105  void gateway_change(
106  const satcat5::ip::Addr& dstaddr,
107  const satcat5::ip::Addr& gateway);
108 
111  void frame_rcvd(satcat5::io::LimitedRead& src) override;
112 
113  protected:
114  satcat5::eth::MacAddr match(const satcat5::eth::ArpHeader& hdr) const;
115 
116  bool send_internal(u16 opcode,
117  const satcat5::eth::VlanTag& vtag,
118  const satcat5::eth::MacAddr& dst,
119  const satcat5::eth::MacAddr& sha,
120  const satcat5::ip::Addr& spa,
121  const satcat5::eth::MacAddr& tha,
122  const satcat5::ip::Addr& tpa) const;
123 
124  satcat5::ip::Addr m_ipaddr;
125  const satcat5::ip::Table* m_table;
127  };
128  }
129 }
Callback interface for responding to ARP and ICMP events.
Definition: eth_arp.h:46
virtual void gateway_change(const satcat5::ip::Addr &dstaddr, const satcat5::ip::Addr &gateway)
Callback for changes to gateway configuration.
Definition: eth_arp.h:56
virtual void arp_event(const satcat5::eth::MacAddr &mac, const satcat5::ip::Addr &ip)=0
Callback for any announced MAC/IP address pair.
Implemention of "net::Dispatch" for Ethernet frames.
Definition: eth_dispatch.h:21
Protocol handler for Ethernet-to-IPv4 ARP queries and replies.
Definition: eth_arp.h:68
bool send_query(const satcat5::ip::Addr &target, const satcat5::eth::VlanTag &vtag=satcat5::eth::VTAG_NONE)
Send a query for a given IP address.
Definition: eth_arp.cc:112
ProtoArp(satcat5::eth::Dispatch *dispatcher, const satcat5::ip::Addr &ipaddr=satcat5::ip::ADDR_NONE)
Attach this ARP handler to an eth::Dispatch interface.
Definition: eth_arp.cc:75
void set_ipaddr(const satcat5::ip::Addr &ipaddr)
Set the local IP address.
Definition: eth_arp.h:83
void add(satcat5::eth::ArpListener *evt)
Register an event-listener.
Definition: eth_arp.h:76
void remove(satcat5::eth::ArpListener *evt)
Unregister an event-listener.
Definition: eth_arp.h:79
void gateway_change(const satcat5::ip::Addr &dstaddr, const satcat5::ip::Addr &gateway)
Notify all listeners of a change in gateway configuration.
Definition: eth_arp.cc:124
bool send_probe(const satcat5::ip::Addr &target, const satcat5::eth::VlanTag &vtag=satcat5::eth::VTAG_NONE)
Send a probe to test if a given address is occupied.
Definition: eth_arp.cc:98
void set_proxy(const satcat5::ip::Table *table)
Set IP routing table to enable proxy-ARP.
Definition: eth_arp.h:87
void frame_rcvd(satcat5::io::LimitedRead &src) override
New-frame notifications from the parent interface.
Definition: eth_arp.cc:132
bool send_announce(const satcat5::eth::VlanTag &vtag=satcat5::eth::VTAG_NONE) const
Send an unsolicited ARP announcement.
Definition: eth_arp.cc:85
Accept incoming Ethernet packets by EtherType.
Definition: eth_protocol.h:24
Limited read of next N bytes.
Definition: io_readable.h:255
Abstract API for reading byte-streams and packets.
Definition: io_readable.h:68
Abstract API for writing byte-streams and packets.
Definition: io_writeable.h:24
IPv4 forwarding table.
Definition: ip_table.h:144
Helper functions for manipulating singly-linked lists.
Definition: list.h:52
void add(T *item)
Add new item to front or back, whichever is simpler.
Definition: list.h:221
void remove(T *item)
Remove the designated item from the list.
Definition: list.h:277
Templated functions for manipulating singly-linked lists.
Address Resolution Protocol header.
Definition: eth_arp.h:23
satcat5::eth::MacAddr sha
ARP header fields:
Definition: eth_arp.h:27
void write_to(satcat5::io::Writeable *wr) const
Write header contents to the specified destination.
Definition: eth_arp.cc:63
satcat5::ip::Addr spa
ARP header fields:
Definition: eth_arp.h:28
satcat5::ip::Addr tpa
ARP header fields:
Definition: eth_arp.h:28
bool read_from(satcat5::io::Readable *rd)
Attempt to read and validate the header.
Definition: eth_arp.cc:30
constexpr ArpHeader()
Constructor for an empty header.
Definition: eth_arp.h:32
u16 oper
ARP header fields:
Definition: eth_arp.h:26
satcat5::eth::MacAddr tha
ARP header fields:
Definition: eth_arp.h:27
An Ethernet MAC address (with serializable interface).
Definition: eth_header.h:29
Header contents for an 802.1Q Virtual-LAN tag.
Definition: eth_header.h:124
IPv4 address is a 32-bit unsigned integer.
Definition: ip_core.h:15