Ok, so far I’ve found that every packet is causing a call to HAL_ETH_RxLinkCallback() in STM32 NetworkInterface.c. There, prvAcceptPacket() is called and returns pdTRUE as expected. So the packets are making it through the software filters, but a lot of TCP SYN packets are failing to progress beyond that point. (ICMP and ARP have no trouble.)
HAL_ETH_RxLinkCallback() does nothing else except manipulate the network buffer descriptors. I don’t understand the driver well enough to know what is supposed to happen next. I expected a function call of some sort to trigger the next stage of rx packet processing, but no. Where should I look to see if the packet is “coming out the other side”?
[Small update: I dug into the HAL driver (the one provided in the FreeRTOS+TCP distribution) and added some debug output in HAL_ETH_ReadData(), after HAL_ETH_RxLinkCallback() is called. There is a while loop which seems to execute multiple times, then eventually a call to ETH_UpdateDescriptor(), all of which seems to be happening on the ignored packets as well as the one which finally “clicks” and sets up the connection.]
Paging @htibosch