Quoteedit: The endPacket success return value does not indicate the packet got to its destination if the destination is not on your localnet, only whether the gateway router took it or not.So this indicates a two way UDP communication with the router?
edit: The endPacket success return value does not indicate the packet got to its destination if the destination is not on your localnet, only whether the gateway router took it or not.
I wouldn't expect so. UDP is an unreliable protocol (meaning that there is no delivery acknowledgment, no explicit error detection/reporting, transmission can fail without the sender being informed). In some situations you might get an ICMP error message but that's not really part of UDP. Does endPacket() wait for ICMP responses? That would be a strange thing for it to do.
A two-way communication with the first device only. If the destination ip is localnet, the destination ip device directly. If the destination ip is not localnet, the gateway router.
How does it know that particular port on my router's public ip is associated with the UDP port on my Arduino localnet ip to pass that response packet back? Magic pixie dust? Salted peanuts?
If the return packet reaches your router, the router should be programmed to use the port number originally sent to identify the LAN originating IP address. No magic pixie dust or salted peanuts needed (at least on this end).
I suspect the problem is related to ARP.
How is that happening? Who or what is programming it?
The packet should be stopped by the router firewall at this point, but it isn't. Why not?
Ethernet.begin(mac, ip)w5500.setRetransmissionCount(0); // default 8w5500.setRetransmissionTime(10); // default value 2000 = 200ms