This is an automated email from the ASF dual-hosted git repository. xiaoxiang781216 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit d357c54549b39270264e7c3b3754a957ff5f3392 Author: Daniel P. Carvalho <[email protected]> AuthorDate: Sat Sep 19 11:59:57 2026 -0300 arch/arm/stm32: fix PTP multicast filter and RX/TX frame routing - Under CONFIG_NET_PROMISCUOUS, forward all control frames (ETH_MACFFR_PCF_ALL) instead of only non-PAUSE ones, so link-local PTP multicast reaches the DMA. - Move ptp_to_timespec() above its first user so the TX timestamp path can call it. - stm32_receive(): do not log frames already delivered to packet sockets (PTP, IPv6) as "Dropped, Unknown type". - stm32_txtstamp_flush(): clear io_conn before freeing the looped-back IOB. Signed-off-by: Daniel P. Carvalho <[email protected]> Assisted-by: Claude:claude-sonnet-5 --- arch/arm/src/common/stm32/stm32_eth_m3m4_v1.c | 48 ++++++++++++++++++--------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/arch/arm/src/common/stm32/stm32_eth_m3m4_v1.c b/arch/arm/src/common/stm32/stm32_eth_m3m4_v1.c index c072fc0ff0c..7d87b5328a7 100644 --- a/arch/arm/src/common/stm32/stm32_eth_m3m4_v1.c +++ b/arch/arm/src/common/stm32/stm32_eth_m3m4_v1.c @@ -417,7 +417,7 @@ */ #ifdef CONFIG_NET_PROMISCUOUS -# define MACFFR_SET_BITS (ETH_MACFFR_PCF_PAUSE | ETH_MACFFR_PM) +# define MACFFR_SET_BITS (ETH_MACFFR_PCF_ALL | ETH_MACFFR_PM) #else # define MACFFR_SET_BITS (ETH_MACFFR_PCF_PAUSE) #endif @@ -808,6 +808,14 @@ static void stm32_eth_ptp_convert_rxtime(struct stm32_ethmac_s *priv); * Private Functions ****************************************************************************/ +#ifdef CONFIG_STM32_ETH_PTP +static inline void ptp_to_timespec(uint64_t timestamp, struct timespec *ts) +{ + ts->tv_sec = (timestamp >> 32); + ts->tv_nsec = ((uint32_t)timestamp * (uint64_t)NSEC_PER_SEC) >> 32; +} +#endif + /**************************************************************************** * Name: stm32_getreg * @@ -1187,6 +1195,10 @@ static int stm32_transmit(struct stm32_ethmac_s *priv) priv->txmeta[txindex] = clone; txdesc->tdes0 |= ETH_TDES0_TTSE; } + else + { + nerr("ERROR: Failed to clone IOB for TX timestamp\n"); + } } } #endif @@ -1756,16 +1768,15 @@ static void stm32_txtstamp_flush(struct stm32_ethmac_s *priv) { struct iob_s *iob = iob_remove_queue(&priv->txtstampq); - if (iob != NULL) - { - dev->d_iob = iob; - dev->d_len = iob->io_pktlen; + dev->d_iob = iob; + dev->d_len = iob->io_pktlen; #ifdef CONFIG_NET_PKT - pkt_input(dev); + pkt_input(dev); #endif - dev->d_iob = NULL; - dev->d_len = 0; - } + dev->d_iob = NULL; + dev->d_len = 0; + iob->io_conn = NULL; + iob_free_chain(iob); } } #endif @@ -1909,7 +1920,18 @@ static void stm32_receive(struct stm32_ethmac_s *priv) else #endif { - nerr("ERROR: Dropped, Unknown type: %04x\n", BUF->type); +#ifdef CONFIG_NET_PKT + /* Frames that packet sockets consume directly (PTP, Ethertype + * 0x88f7, and IPv6) were already delivered via pkt_input() + * above, so they are not "unknown" and must not be logged as + * dropped. + */ + + if (BUF->type != HTONS(0x88f7) && BUF->type != HTONS(ETHTYPE_IP6)) +#endif + { + nerr("ERROR: Dropped, Unknown type: %04x\n", BUF->type); + } } /* We are finished with the RX buffer. NOTE: If the buffer is @@ -4103,12 +4125,6 @@ static uint64_t stm32_eth_ptp_gettime(void) } #endif -static inline void ptp_to_timespec(uint64_t timestamp, struct timespec *ts) -{ - ts->tv_sec = (timestamp >> 32); - ts->tv_nsec = ((uint32_t)timestamp * (uint64_t)NSEC_PER_SEC) >> 32; -} - /* Convert the RX timestamp of the MAC to a timespec. It is the value of the * PTP counter of the MAC, which is the time base of /dev/ptp0, and not a * value of CLOCK_REALTIME.
