@@ -5,15 +5,19 @@ use argh::FromArgs;
5
5
use futures:: { select, FutureExt } ;
6
6
use log:: { debug, info, warn, LevelFilter } ;
7
7
use mctp:: { AsyncListener , AsyncRespChannel , Eid } ;
8
- use mctp_estack:: router:: {
9
- PortBottom , PortBuilder , PortId , PortLookup , PortStorage , Router ,
8
+ use mctp_estack:: {
9
+ control:: { ControlEvent , MctpControl } ,
10
+ router:: {
11
+ PortBottom , PortBuilder , PortId , PortLookup , PortStorage , Router ,
12
+ } ,
10
13
} ;
14
+ use std:: time:: Instant ;
15
+
11
16
#[ cfg( feature = "nvme-mi" ) ]
12
17
use nvme_mi_dev:: nvme:: {
13
18
ManagementEndpoint , PciePort , PortType , Subsystem , SubsystemInfo ,
14
19
TwoWirePort ,
15
20
} ;
16
- use std:: time:: Instant ;
17
21
18
22
mod serial;
19
23
mod usbredir;
@@ -142,9 +146,12 @@ async fn echo<'a>(router: &'a Router<'a>) -> std::io::Result<()> {
142
146
}
143
147
}
144
148
145
- async fn control < ' a > ( router : & ' a Router < ' a > ) -> std:: io:: Result < ( ) > {
149
+ async fn control < ' a > (
150
+ router : & ' a Router < ' a > ,
151
+ ctrl_ev_sender : async_channel:: Sender < ControlEvent > ,
152
+ ) -> std:: io:: Result < ( ) > {
146
153
let mut l = router. listener ( mctp:: MCTP_TYPE_CONTROL ) ?;
147
- let mut c = mctp_estack :: control :: MctpControl :: new ( router) ;
154
+ let mut c = MctpControl :: new ( router) ;
148
155
let u = uuid:: Uuid :: new_v4 ( ) ;
149
156
150
157
let types = [
@@ -165,8 +172,12 @@ async fn control<'a>(router: &'a Router<'a>) -> std::io::Result<()> {
165
172
166
173
let r = c. handle_async ( msg, resp) . await ;
167
174
168
- if let Err ( e) = r {
169
- info ! ( "control handler failure: {e}" ) ;
175
+ match r {
176
+ Err ( e) => info ! ( "control handler failure: {e}" ) ,
177
+ Ok ( Some ( ev) ) => {
178
+ let _ = ctrl_ev_sender. force_send ( ev) ;
179
+ }
180
+ Ok ( None ) => ( ) ,
170
181
}
171
182
}
172
183
}
@@ -219,6 +230,18 @@ async fn nvme_mi<'a>(_router: &'a Router<'a>) -> std::io::Result<()> {
219
230
futures:: future:: pending ( ) . await
220
231
}
221
232
233
+ #[ cfg( feature = "pldm" ) ]
234
+ mod pldm;
235
+ #[ cfg( not( feature = "pldm" ) ) ]
236
+ mod pldm {
237
+ pub async fn pldm < ' a > (
238
+ _router : & ' a super :: Router < ' a > ,
239
+ _recv : async_channel:: Receiver < super :: ControlEvent > ,
240
+ ) -> std:: io:: Result < ( ) > {
241
+ futures:: future:: pending ( ) . await
242
+ }
243
+ }
244
+
222
245
fn main ( ) -> Result < ( ) > {
223
246
let opts: Options = argh:: from_env ( ) ;
224
247
@@ -260,12 +283,15 @@ fn main() -> Result<()> {
260
283
None => futures:: future:: Either :: Right ( futures:: future:: pending ( ) ) ,
261
284
} ;
262
285
286
+ let ( ctrl_ev_tx, ctrl_ev_rx) = async_channel:: bounded ( 1 ) ;
287
+
263
288
smol:: block_on ( async {
264
289
select ! (
265
290
_ = fut. fuse( ) => ( ) ,
266
291
_ = run( transport, port_bottom, & router, start_time) . fuse( ) => ( ) ,
267
- _ = control( & router) . fuse( ) => ( ) ,
268
- _ = nvme_mi( & router) . fuse( ) => ( )
292
+ _ = control( & router, ctrl_ev_tx) . fuse( ) => ( ) ,
293
+ _ = nvme_mi( & router) . fuse( ) => ( ) ,
294
+ _ = pldm:: pldm( & router, ctrl_ev_rx) . fuse( ) => ( ) ,
269
295
)
270
296
} ) ;
271
297
0 commit comments