module-rtp-source: Detect and drop packets that are larger than the MTU

This commit is contained in:
Carlos Rafael Giani 2026-06-24 13:56:27 +02:00
parent 20f17c73de
commit 2f94a49962

View file

@ -311,9 +311,22 @@ on_rtp_io(void *data, int fd, uint32_t mask)
current_time = get_time_ns(impl); current_time = get_time_ns(impl);
if (mask & SPA_IO_IN) { if (mask & SPA_IO_IN) {
if ((len = recvfrom(fd, impl->buffer, impl->buffer_size, 0, (struct sockaddr *)(&recvaddr), &recvaddr_len)) < 0) if ((len = recvfrom(fd, impl->buffer, impl->buffer_size,
#ifdef __linux__
/* Use this Linux specific feature to get the actual size of the
* packet, even if it was truncated due to it being larger than
* the buffer size. The code below uses this to detect packets
* that exceed the MTU size. */
MSG_TRUNC,
#else
0,
#endif
(struct sockaddr *)(&recvaddr), &recvaddr_len)) < 0)
goto receive_error; goto receive_error;
if (SPA_UNLIKELY((size_t)len > impl->buffer_size))
goto packet_larger_than_mtu;
/* Filter the packets to exclude those with source addresses /* Filter the packets to exclude those with source addresses
* that do not match the expected one. Only used with unicast. * that do not match the expected one. Only used with unicast.
* (The bind() call in make_socket takes care of only * (The bind() call in make_socket takes care of only
@ -373,6 +386,12 @@ short_packet:
pw_log_warn("(%d suppressed) short packet of len %zd received", pw_log_warn("(%d suppressed) short packet of len %zd received",
suppressed, len); suppressed, len);
return; return;
packet_larger_than_mtu:
if ((suppressed = spa_ratelimit_test(&impl->rate_limit, current_time)) >= 0)
pw_log_warn("(%d suppressed) packet received that is larger than "
"the configured MTU (%zu bytes)",
suppressed, impl->buffer_size);
return;
} }
static int rejoin_igmp_group(struct spa_loop *loop, bool async, uint32_t seq, static int rejoin_igmp_group(struct spa_loop *loop, bool async, uint32_t seq,