1
1
use super :: rx:: RxRing ;
2
2
use super :: tx:: TxRing ;
3
- use super :: EthernetDMA ;
3
+ use super :: { EthernetDMA , PacketId } ;
4
4
use smoltcp:: phy:: { ChecksumCapabilities , Device , DeviceCapabilities , RxToken , TxToken } ;
5
5
use smoltcp:: time:: Instant ;
6
6
@@ -19,13 +19,23 @@ impl<'a, 'rx, 'tx> Device for &'a mut EthernetDMA<'rx, 'tx> {
19
19
20
20
fn receive ( & mut self , _timestamp : Instant ) -> Option < ( Self :: RxToken < ' _ > , Self :: TxToken < ' _ > ) > {
21
21
if self . tx_available ( ) && self . rx_available ( ) {
22
+ let rx_packet_id = self . next_packet_id ( ) ;
23
+
22
24
let EthernetDMA {
23
25
rx_ring, tx_ring, ..
24
26
} = self ;
25
27
26
- let rx = EthRxToken { rx_ring } ;
28
+ let rx = EthRxToken {
29
+ rx_ring,
30
+ #[ cfg( feature = "ptp" ) ]
31
+ meta : rx_packet_id,
32
+ } ;
27
33
28
- let tx = EthTxToken { tx_ring } ;
34
+ let tx = EthTxToken {
35
+ tx_ring,
36
+ #[ cfg( feature = "ptp" ) ]
37
+ meta : None ,
38
+ } ;
29
39
Some ( ( rx, tx) )
30
40
} else {
31
41
None
@@ -35,7 +45,11 @@ impl<'a, 'rx, 'tx> Device for &'a mut EthernetDMA<'rx, 'tx> {
35
45
fn transmit ( & mut self , _timestamp : Instant ) -> Option < Self :: TxToken < ' _ > > {
36
46
if self . tx_available ( ) {
37
47
let EthernetDMA { tx_ring, .. } = self ;
38
- Some ( EthTxToken { tx_ring } )
48
+ Some ( EthTxToken {
49
+ tx_ring,
50
+ #[ cfg( feature = "ptp" ) ]
51
+ meta : None ,
52
+ } )
39
53
} else {
40
54
None
41
55
}
@@ -46,6 +60,8 @@ impl<'a, 'rx, 'tx> Device for &'a mut EthernetDMA<'rx, 'tx> {
46
60
/// an ethernet packet.
47
61
pub struct EthRxToken < ' a , ' rx > {
48
62
rx_ring : & ' a mut RxRing < ' rx > ,
63
+ #[ cfg( feature = "ptp" ) ]
64
+ meta : PacketId ,
49
65
}
50
66
51
67
impl < ' dma , ' rx > RxToken for EthRxToken < ' dma , ' rx > {
@@ -59,24 +75,41 @@ impl<'dma, 'rx> RxToken for EthRxToken<'dma, 'rx> {
59
75
packet. free ( ) ;
60
76
result
61
77
}
78
+
79
+ #[ cfg( feature = "ptp" ) ]
80
+ fn meta ( & self ) -> smoltcp:: phy:: PacketMeta {
81
+ self . meta . clone ( ) . into ( )
82
+ }
62
83
}
63
84
64
85
/// Just a reference to [`EthernetDMA`] for sending a
65
86
/// packet later with [`TxToken::consume()`].
66
87
pub struct EthTxToken < ' a , ' tx > {
67
88
tx_ring : & ' a mut TxRing < ' tx > ,
89
+ #[ cfg( feature = "ptp" ) ]
90
+ meta : Option < PacketId > ,
68
91
}
69
92
70
93
impl < ' dma , ' tx > TxToken for EthTxToken < ' dma , ' tx > {
71
94
fn consume < R , F > ( self , len : usize , f : F ) -> R
72
95
where
73
96
F : FnOnce ( & mut [ u8 ] ) -> R ,
74
97
{
98
+ #[ cfg( feature = "ptp" ) ]
99
+ let meta = self . meta . map ( Into :: into) ;
100
+ #[ cfg( not( feature = "ptp" ) ) ]
101
+ let meta = None ;
102
+
75
103
// NOTE(unwrap): an `EthTxToken` is only created if
76
104
// 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 ( ) ;
78
106
let res = f ( & mut tx_packet) ;
79
107
tx_packet. send ( ) ;
80
108
res
81
109
}
110
+
111
+ #[ cfg( feature = "ptp" ) ]
112
+ fn set_meta ( & mut self , meta : smoltcp:: phy:: PacketMeta ) {
113
+ self . meta = Some ( meta. into ( ) ) ;
114
+ }
82
115
}
0 commit comments