Skip to content

Commit 169b3b7

Browse files
committed
Update to smoltcp 0.10
1 parent a44422f commit 169b3b7

File tree

8 files changed

+81
-28
lines changed

8 files changed

+81
-28
lines changed

Cargo.toml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ defmt = { version = "0.3", optional = true }
3232
futures = { version = "0.3", default-features = false, features = ["async-await"], optional = true }
3333

3434
[dependencies.smoltcp]
35-
version = "0.9"
35+
version = "0.10"
3636
default-features = false
3737
optional = true
3838

3939
[features]
4040
default = [ "defmt", "ptp" ]
4141
device-selected = []
4242
fence = []
43-
ptp = [ ]
43+
ptp = [ "smoltcp/packetmeta-id" ]
4444
async-await = ["dep:futures"]
4545

4646
stm32f107 = ["stm32f1xx-hal/stm32f107", "device-selected"]
@@ -73,7 +73,7 @@ fugit = "0.3"
7373
defmt-rtt = "0.4"
7474
panic-probe = { version = "0.3", features = [ "print-defmt" ] }
7575
systick-monotonic = "1.0"
76-
smoltcp = { version = "0.9", features = [ "medium-ethernet", "proto-ipv4", "socket-udp", "socket-tcp", "defmt" ], default-features = false }
76+
smoltcp = { version = "0.10", features = [ "medium-ethernet", "proto-ipv4", "socket-udp", "socket-tcp", "defmt" ], default-features = false }
7777

7878
[dev-dependencies.rtic]
7979
package = "cortex-m-rtic"

examples/ip.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,8 @@ fn main() -> ! {
6565

6666
let ethernet_addr = EthernetAddress(SRC_MAC);
6767

68-
let mut config = Config::new();
69-
config.hardware_addr = Some(ethernet_addr.into());
70-
let mut iface = Interface::new(config, &mut &mut dma);
68+
let config = Config::new(ethernet_addr.into());
69+
let mut iface = Interface::new(config, &mut &mut dma, Instant::ZERO);
7170

7271
iface.update_ip_addrs(|addr| {
7372
addr.push(IpCidr::Ipv4(Ipv4Cidr::new(IP_ADDRESS, 24))).ok();

examples/rtic-echo.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,9 @@ mod app {
108108

109109
let socket = TcpSocket::new(rx_buffer, tx_buffer);
110110

111-
let mut config = iface::Config::new();
112-
config.hardware_addr = Some(EthernetAddress::from_bytes(&crate::MAC).into());
111+
let config = iface::Config::new(EthernetAddress::from_bytes(&crate::MAC).into());
113112

114-
let mut interface = Interface::new(config, &mut &mut dma);
113+
let mut interface = Interface::new(config, &mut &mut dma, smoltcp::time::Instant::ZERO);
115114
interface.update_ip_addrs(|addr| {
116115
addr.push(IpCidr::Ipv4(Ipv4Cidr::new(crate::IP_ADDRESS, 24)))
117116
.ok();

examples/timesync/client.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ mod app {
8686
use systick_monotonic::Systick;
8787

8888
use stm32_eth::{
89-
dma::{EthernetDMA, PacketId, RxRingEntry, TxRingEntry},
89+
dma::{EthernetDMA, RxRingEntry, TxRingEntry},
9090
mac::Speed,
9191
ptp::{EthernetPTP, Timestamp},
9292
Parts,
@@ -189,7 +189,7 @@ mod app {
189189
)
190190
}
191191

192-
#[task(local = [addend_integrator: f32 = 0.0, start_addend, packet_id: u32 = 0, dma, ptp])]
192+
#[task(local = [addend_integrator: f32 = 0.0, start_addend, dma, ptp])]
193193
fn runner(cx: runner::Context) {
194194
use fugit::ExtU64;
195195

@@ -199,11 +199,8 @@ mod app {
199199

200200
let start = monotonics::now();
201201

202-
let (addend_integrator, start_addend, packet_id) = (
203-
cx.local.addend_integrator,
204-
*cx.local.start_addend,
205-
cx.local.packet_id,
206-
);
202+
let (addend_integrator, start_addend) =
203+
(cx.local.addend_integrator, *cx.local.start_addend);
207204

208205
let mut buf = [0u8; 128];
209206

@@ -244,8 +241,7 @@ mod app {
244241

245242
macro_rules! send {
246243
($data:expr) => {{
247-
let current_id = PacketId(*packet_id);
248-
*packet_id += 1;
244+
let current_id = dma.next_packet_id();
249245
let current_clone = current_id.clone();
250246

251247
dma.send(14 + $data.len(), Some(current_clone), |buf| {

examples/timesync/server.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ mod app {
2727
use systick_monotonic::Systick;
2828

2929
use stm32_eth::{
30-
dma::{EthernetDMA, PacketId, RxRingEntry, TxRingEntry},
30+
dma::{EthernetDMA, RxRingEntry, TxRingEntry},
3131
mac::Speed,
3232
Parts,
3333
};
@@ -117,15 +117,15 @@ mod app {
117117
(Shared {}, Local { dma }, init::Monotonics(mono))
118118
}
119119

120-
#[task(local = [packet_id: u32 = 0, dma])]
120+
#[task(local = [dma])]
121121
fn runner(cx: runner::Context) {
122122
use fugit::ExtU64;
123123

124124
runner::spawn().ok();
125125

126126
let start = monotonics::now();
127127

128-
let (packet_id, dma) = (cx.local.packet_id, cx.local.dma);
128+
let dma = cx.local.dma;
129129

130130
let mut buf = [0u8; 128];
131131

@@ -166,8 +166,7 @@ mod app {
166166

167167
macro_rules! send {
168168
($data:expr) => {{
169-
let current_id = PacketId(*packet_id);
170-
*packet_id += 1;
169+
let current_id = dma.next_packet_id();
171170
let current_clone = current_id.clone();
172171
dma.send(14 + $data.len(), Some(current_clone), |buf| {
173172
buf[0..6].copy_from_slice(&BROADCAST);

src/dma/mod.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ pub struct EthernetDMA<'rx, 'tx> {
4545
pub(crate) eth_dma: ETHERNET_DMA,
4646
pub(crate) rx_ring: RxRing<'rx>,
4747
pub(crate) tx_ring: TxRing<'tx>,
48+
49+
#[cfg(feature = "ptp")]
50+
packet_id_counter: u32,
4851
}
4952

5053
impl<'rx, 'tx> EthernetDMA<'rx, 'tx> {
@@ -120,6 +123,7 @@ impl<'rx, 'tx> EthernetDMA<'rx, 'tx> {
120123
eth_dma,
121124
rx_ring: RxRing::new(rx_buffer),
122125
tx_ring: TxRing::new(tx_buffer),
126+
packet_id_counter: 0,
123127
};
124128

125129
dma.rx_ring.start(&dma.eth_dma);
@@ -366,6 +370,13 @@ impl EthernetDMA<'_, '_> {
366370
) -> Result<Option<Timestamp>, PacketIdNotFound> {
367371
self.tx_ring.timestamp(packet_id).await
368372
}
373+
374+
/// Get the next packet ID.
375+
pub fn next_packet_id(&mut self) -> PacketId {
376+
let id = PacketId(self.packet_id_counter);
377+
self.packet_id_counter += 1;
378+
id
379+
}
369380
}
370381

371382
/// A summary of the reasons for the interrupt

src/dma/packet_id.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,19 @@ impl From<u32> for PacketId {
2323
Self(value)
2424
}
2525
}
26+
27+
#[cfg(all(feature = "ptp", feature = "smoltcp-phy"))]
28+
impl From<smoltcp::phy::PacketMeta> for PacketId {
29+
fn from(value: smoltcp::phy::PacketMeta) -> Self {
30+
Self(value.id)
31+
}
32+
}
33+
34+
#[cfg(all(feature = "ptp", feature = "smoltcp-phy"))]
35+
impl From<PacketId> for smoltcp::phy::PacketMeta {
36+
fn from(value: PacketId) -> Self {
37+
let mut meta = smoltcp::phy::PacketMeta::default();
38+
meta.id = value.0;
39+
meta
40+
}
41+
}

src/dma/smoltcp_phy.rs

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use super::rx::RxRing;
22
use super::tx::TxRing;
3-
use super::EthernetDMA;
3+
use super::{EthernetDMA, PacketId};
44
use smoltcp::phy::{ChecksumCapabilities, Device, DeviceCapabilities, RxToken, TxToken};
55
use smoltcp::time::Instant;
66

@@ -19,13 +19,23 @@ impl<'a, 'rx, 'tx> Device for &'a mut EthernetDMA<'rx, 'tx> {
1919

2020
fn receive(&mut self, _timestamp: Instant) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
2121
if self.tx_available() && self.rx_available() {
22+
let rx_packet_id = self.next_packet_id();
23+
2224
let EthernetDMA {
2325
rx_ring, tx_ring, ..
2426
} = self;
2527

26-
let rx = EthRxToken { rx_ring };
28+
let rx = EthRxToken {
29+
rx_ring,
30+
#[cfg(feature = "ptp")]
31+
meta: rx_packet_id,
32+
};
2733

28-
let tx = EthTxToken { tx_ring };
34+
let tx = EthTxToken {
35+
tx_ring,
36+
#[cfg(feature = "ptp")]
37+
meta: None,
38+
};
2939
Some((rx, tx))
3040
} else {
3141
None
@@ -35,7 +45,11 @@ impl<'a, 'rx, 'tx> Device for &'a mut EthernetDMA<'rx, 'tx> {
3545
fn transmit(&mut self, _timestamp: Instant) -> Option<Self::TxToken<'_>> {
3646
if self.tx_available() {
3747
let EthernetDMA { tx_ring, .. } = self;
38-
Some(EthTxToken { tx_ring })
48+
Some(EthTxToken {
49+
tx_ring,
50+
#[cfg(feature = "ptp")]
51+
meta: None,
52+
})
3953
} else {
4054
None
4155
}
@@ -46,6 +60,8 @@ impl<'a, 'rx, 'tx> Device for &'a mut EthernetDMA<'rx, 'tx> {
4660
/// an ethernet packet.
4761
pub struct EthRxToken<'a, 'rx> {
4862
rx_ring: &'a mut RxRing<'rx>,
63+
#[cfg(feature = "ptp")]
64+
meta: PacketId,
4965
}
5066

5167
impl<'dma, 'rx> RxToken for EthRxToken<'dma, 'rx> {
@@ -59,24 +75,41 @@ impl<'dma, 'rx> RxToken for EthRxToken<'dma, 'rx> {
5975
packet.free();
6076
result
6177
}
78+
79+
#[cfg(feature = "ptp")]
80+
fn meta(&self) -> smoltcp::phy::PacketMeta {
81+
self.meta.clone().into()
82+
}
6283
}
6384

6485
/// Just a reference to [`EthernetDMA`] for sending a
6586
/// packet later with [`TxToken::consume()`].
6687
pub struct EthTxToken<'a, 'tx> {
6788
tx_ring: &'a mut TxRing<'tx>,
89+
#[cfg(feature = "ptp")]
90+
meta: Option<PacketId>,
6891
}
6992

7093
impl<'dma, 'tx> TxToken for EthTxToken<'dma, 'tx> {
7194
fn consume<R, F>(self, len: usize, f: F) -> R
7295
where
7396
F: FnOnce(&mut [u8]) -> R,
7497
{
98+
#[cfg(feature = "ptp")]
99+
let meta = self.meta.map(Into::into);
100+
#[cfg(not(feature = "ptp"))]
101+
let meta = None;
102+
75103
// NOTE(unwrap): an `EthTxToken` is only created if
76104
// there is a descriptor available for sending.
77-
let mut tx_packet = self.tx_ring.send_next(len, None).ok().unwrap();
105+
let mut tx_packet = self.tx_ring.send_next(len, meta).ok().unwrap();
78106
let res = f(&mut tx_packet);
79107
tx_packet.send();
80108
res
81109
}
110+
111+
#[cfg(feature = "ptp")]
112+
fn set_meta(&mut self, meta: smoltcp::phy::PacketMeta) {
113+
self.meta = Some(meta.into());
114+
}
82115
}

0 commit comments

Comments
 (0)