@@ -78,15 +78,19 @@ pub fn find_path<L: Deref, GL: Deref>(
78
78
} else { continue ; }
79
79
for scid in & node_info. channels {
80
80
if let Some ( chan_info) = network_channels. get ( & scid) {
81
- if let Some ( ( _, successor) ) = chan_info. as_directed_from ( & node_id) {
82
- // We may push a given successor multiple times, but the heap should sort its best entry
83
- // to the top. We do this because there is no way to adjust the priority of an existing
84
- // entry in `BinaryHeap`.
85
- frontier. push ( PathBuildingHop {
86
- cost : cost + 1 ,
87
- node_id : * successor,
88
- parent_node_id : node_id,
89
- } ) ;
81
+ if let Some ( ( directed_channel, successor) ) = chan_info. as_directed_from ( & node_id) {
82
+ if let Some ( direction) = directed_channel. direction ( ) {
83
+ if direction. enabled {
84
+ // We may push a given successor multiple times, but the heap should sort its best
85
+ // entry to the top. We do this because there is no way to adjust the priority of an
86
+ // existing entry in `BinaryHeap`.
87
+ frontier. push ( PathBuildingHop {
88
+ cost : cost + 1 ,
89
+ node_id : * successor,
90
+ parent_node_id : node_id,
91
+ } ) ;
92
+ }
93
+ }
90
94
}
91
95
}
92
96
}
@@ -236,6 +240,23 @@ mod tests {
236
240
let err = super :: find_path ( & our_id, & node_pks[ 2 ] , & network_graph, None , Arc :: clone ( & logger) ) . unwrap_err ( ) ;
237
241
assert_eq ! ( err, super :: Error :: PathNotFound ) ;
238
242
}
243
+
244
+ #[ test]
245
+ fn disabled_channels_test ( ) {
246
+ // Check that we won't attempt to route over nodes where the channel is disabled from their
247
+ // direction (implying the peer is offline).
248
+ let mut features = InitFeatures :: empty ( ) ;
249
+ features. set_onion_messages_optional ( ) ;
250
+ let ( secp_ctx, network_graph, _, _, logger) = build_graph_with_features ( features. to_context ( ) ) ;
251
+ let ( _, our_id, _, node_pks) = get_nodes ( & secp_ctx) ;
252
+
253
+ // Route to 1 via 2 and 3 because our channel to 1 is disabled
254
+ let path = super :: find_path ( & our_id, & node_pks[ 0 ] , & network_graph, None , Arc :: clone ( & logger) ) . unwrap ( ) ;
255
+ assert_eq ! ( path. len( ) , 3 ) ;
256
+ assert_eq ! ( path[ 0 ] , node_pks[ 1 ] ) ;
257
+ assert_eq ! ( path[ 1 ] , node_pks[ 2 ] ) ;
258
+ assert_eq ! ( path[ 2 ] , node_pks[ 0 ] ) ;
259
+ }
239
260
}
240
261
241
262
#[ cfg( all( test, feature = "_bench_unstable" , not( feature = "no-std" ) ) ) ]
0 commit comments