mirror of
https://github.com/smoltcp-rs/smoltcp.git
synced 2025-09-30 22:31:25 +00:00
Merge pull request #954 from quartiq/issue/848/infinite-poll
Limiting the number of poll loops to prevent DoS events
This commit is contained in:
commit
53caf70f64
@ -6,7 +6,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
No unreleased changes yet.
|
### Changed
|
||||||
|
- iface: The `poll` function now only performs a single cycle of processing sockets ([#954](https://github.com/smoltcp-rs/smoltcp/pull/954))
|
||||||
|
|
||||||
## [0.11.0] - 2023-12-23
|
## [0.11.0] - 2023-12-23
|
||||||
|
|
||||||
|
@ -396,6 +396,13 @@ impl Interface {
|
|||||||
/// This function returns a boolean value indicating whether any packets were
|
/// This function returns a boolean value indicating whether any packets were
|
||||||
/// processed or emitted, and thus, whether the readiness of any socket might
|
/// processed or emitted, and thus, whether the readiness of any socket might
|
||||||
/// have changed.
|
/// have changed.
|
||||||
|
///
|
||||||
|
/// # Note
|
||||||
|
/// This function performs a bounded amount of work per call to avoid
|
||||||
|
/// starving other tasks of CPU time. If it returns true, there may still be
|
||||||
|
/// packets to be received or transmitted. Depending on system design,
|
||||||
|
/// calling this function in a loop may cause a denial of service if
|
||||||
|
/// packets cannot be processed faster than they arrive.
|
||||||
pub fn poll<D>(
|
pub fn poll<D>(
|
||||||
&mut self,
|
&mut self,
|
||||||
timestamp: Instant,
|
timestamp: Instant,
|
||||||
@ -429,23 +436,12 @@ impl Interface {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut readiness_may_have_changed = false;
|
let mut readiness_may_have_changed = self.socket_ingress(device, sockets);
|
||||||
|
readiness_may_have_changed |= self.socket_egress(device, sockets);
|
||||||
loop {
|
|
||||||
let mut did_something = false;
|
|
||||||
did_something |= self.socket_ingress(device, sockets);
|
|
||||||
did_something |= self.socket_egress(device, sockets);
|
|
||||||
|
|
||||||
#[cfg(feature = "proto-igmp")]
|
#[cfg(feature = "proto-igmp")]
|
||||||
{
|
{
|
||||||
did_something |= self.igmp_egress(device);
|
readiness_may_have_changed |= self.igmp_egress(device);
|
||||||
}
|
|
||||||
|
|
||||||
if did_something {
|
|
||||||
readiness_may_have_changed = true;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
readiness_may_have_changed
|
readiness_may_have_changed
|
||||||
@ -507,7 +503,10 @@ impl Interface {
|
|||||||
{
|
{
|
||||||
let mut processed_any = false;
|
let mut processed_any = false;
|
||||||
|
|
||||||
while let Some((rx_token, tx_token)) = device.receive(self.inner.now) {
|
let Some((rx_token, tx_token)) = device.receive(self.inner.now) else {
|
||||||
|
return processed_any;
|
||||||
|
};
|
||||||
|
|
||||||
let rx_meta = rx_token.meta();
|
let rx_meta = rx_token.meta();
|
||||||
rx_token.consume(|frame| {
|
rx_token.consume(|frame| {
|
||||||
if frame.is_empty() {
|
if frame.is_empty() {
|
||||||
@ -517,12 +516,10 @@ impl Interface {
|
|||||||
match self.inner.caps.medium {
|
match self.inner.caps.medium {
|
||||||
#[cfg(feature = "medium-ethernet")]
|
#[cfg(feature = "medium-ethernet")]
|
||||||
Medium::Ethernet => {
|
Medium::Ethernet => {
|
||||||
if let Some(packet) = self.inner.process_ethernet(
|
if let Some(packet) =
|
||||||
sockets,
|
self.inner
|
||||||
rx_meta,
|
.process_ethernet(sockets, rx_meta, frame, &mut self.fragments)
|
||||||
frame,
|
{
|
||||||
&mut self.fragments,
|
|
||||||
) {
|
|
||||||
if let Err(err) =
|
if let Err(err) =
|
||||||
self.inner.dispatch(tx_token, packet, &mut self.fragmenter)
|
self.inner.dispatch(tx_token, packet, &mut self.fragmenter)
|
||||||
{
|
{
|
||||||
@ -548,12 +545,10 @@ impl Interface {
|
|||||||
}
|
}
|
||||||
#[cfg(feature = "medium-ieee802154")]
|
#[cfg(feature = "medium-ieee802154")]
|
||||||
Medium::Ieee802154 => {
|
Medium::Ieee802154 => {
|
||||||
if let Some(packet) = self.inner.process_ieee802154(
|
if let Some(packet) =
|
||||||
sockets,
|
self.inner
|
||||||
rx_meta,
|
.process_ieee802154(sockets, rx_meta, frame, &mut self.fragments)
|
||||||
frame,
|
{
|
||||||
&mut self.fragments,
|
|
||||||
) {
|
|
||||||
if let Err(err) = self.inner.dispatch_ip(
|
if let Err(err) = self.inner.dispatch_ip(
|
||||||
tx_token,
|
tx_token,
|
||||||
PacketMeta::default(),
|
PacketMeta::default(),
|
||||||
@ -567,7 +562,6 @@ impl Interface {
|
|||||||
}
|
}
|
||||||
processed_any = true;
|
processed_any = true;
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
processed_any
|
processed_any
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user