ipeth_arp_reply() is called (indirectly) by client_reply() under one of the following circumstances:
1) An arp-reply packet has been received in response to a previous arp-request packet that this system sent out.
2) An arp-request packet has timed out. In this case, eth_addr, ipeth_arp_reply()'s third parameter, will be NULL.
3) An arp-request packet has been received that contains the information requested by a previous arp-request packet that this system sent out.
ipeth_arp_reply() searches the queue of ethernet packets waiting for arp resolution for the ip address of the arp-request/arp-reply. If the arp resolution timed out, the packet is discarded. If the arp resolution was successful, the ethernet packet is moved to the queue of packets waiting to be sent out and ipeth_restart_send() is called to send out the packets.