11use super :: rx:: RxRing ;
22use super :: tx:: TxRing ;
3- use super :: EthernetDMA ;
3+ use super :: { EthernetDMA , PacketId } ;
44use smoltcp:: phy:: { ChecksumCapabilities , Device , DeviceCapabilities , RxToken , TxToken } ;
55use 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.
4761pub struct EthRxToken < ' a , ' rx > {
4862 rx_ring : & ' a mut RxRing < ' rx > ,
63+ #[ cfg( feature = "ptp" ) ]
64+ meta : PacketId ,
4965}
5066
5167impl < ' 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()`].
6687pub struct EthTxToken < ' a , ' tx > {
6788 tx_ring : & ' a mut TxRing < ' tx > ,
89+ #[ cfg( feature = "ptp" ) ]
90+ meta : Option < PacketId > ,
6891}
6992
7093impl < ' 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