mirror of
https://github.com/logicog/RTLPlayground.git
synced 2026-10-29 17:54:14 +08:00
uip_arp_ipin() is an empty macro with its body under #if 0, both inherited from the uIP import and untouched since. That leaves uip_arp_update() reachable only from uip_arp_arpin(), so an entry is refreshed only by ARP addressed to us and ages out after UIP_ARP_MAXAGE no matter how much traffic passed over it. When it goes, the next transmission to that host hits the miss path of uip_arp_out(), which overwrites the packet in uip_buf with an ARP request and returns. For TCP that costs a retransmission. For UDP nothing retransmits, and handle_tx() sends the UDP connections through uip_arp_out() too, so the datagram is lost. The body could not be enabled as written: uip_len -= sizeof(struct uip_eth_hdr) is a leftover from when UIP_LLH_LEN was 0. Here it is ETHER_HEADER_SIZE + RTL_FRAME_DESC_SIZE and uip.c reads the IP header at uip_buf[UIP_LLH_LEN], so uip_len has to keep the link layer in it. The rest of the function is sound.