Constructor
val create : ?timeout:int -> ?retries:int -> ?logsrc:Logs.src -> ?ipaddr:Ipaddr.V4.t -> Macaddr.t -> 'a t * (Arp_packet.t * Macaddr.t) optioncreate ~timeout ~retries ~ipaddr mac) is t, garp. The constructor of the ARP handler, specifying timeouts (defaults to 800) and amount of retries (defaults to 5). If ipaddr is provided, a gratuitous ARP request will be encoded in garp, otherwise Ipaddr.V4.any is temporarily used and garp is None. The value of timeout is the number of Tick events.
- raises Invalid_argument
is
timeoutis 0 or negative orretriesis negative.
val pp : Stdlib.Format.formatter -> 'a t -> unitpp ppf t prints the ARP handler t on ppf by iterating over all cache entries.
Predicates
val ips : 'a t -> Ipaddr.V4.t listips t is ips, the advertised IPv4 addresses.
val in_cache : 'a t -> Ipaddr.V4.t -> Macaddr.t optionin_cache t ip is mac option, a MAC address if the ARP cache contains an entry, None otherwise.
Operations on the cache
val static : 'a t -> Ipaddr.V4.t -> Macaddr.t -> 'a t * 'a optionstatic t ip mac is t', as, where t' is t extended with a static ARP entry using the given ip and mac. The tasks waiting for ip are as.
val alias : 'a t -> Ipaddr.V4.t -> 'a t * (Arp_packet.t * Macaddr.t) * 'a optionalias t ip is t', out, as, where t' is t extended by a static ARP entry for ip. This entry will be used to answer further ARP requests. out is a gratuitous ARP frame. The tasks waiting for ip are as.
val remove : 'a t -> Ipaddr.V4.t -> 'a tremove t ip is t', where ip is no longer in the cache.
Events
val tick : 'a t -> 'a t * (Arp_packet.t * Macaddr.t) list * 'a listtick t is t', requests, timeouts, which advances the state t into t'. Possibly retransmissions of ARP requests need to be done, provided in the requests list. Timed out queries are in the timeouts list.
input t buf is t', reply, w, which handles the input buffer buf in the state t. The state is transformed into t'. If it was an ARP request for one of our IPv4 addresses, an ARP reply should be send out reply. If the input was an awaited ARP reply, some elements w can be informed.
The type returned by query, either a Mac and a mac address, or Wait for a reply, or RequestWait, consisting of an ARP request to be send on the wire, and await its answer.
val query : 'a t -> Ipaddr.V4.t -> ('a option -> 'a) -> 'a t * 'a qresquery t ip merge is t', qres, which looks for the ip in the cache. If it is found, its value is Mac mac. If the ip is not in the cache, either some 'a is waiting for it already, then the value is Wait a, where a is produced by applying merge (Some 'a) to the waiting thing. Otherwise, both an ARP request needs to be send out, and the value of merge None is put into the cache, both as part of RequestWait.