@@ -1101,7 +1101,9 @@ where L::Target: Logger {
1101
1101
} }
1102
1102
}
1103
1103
1104
- let empty_node_features = NodeFeatures :: empty ( ) ;
1104
+ let mut onion_format_optional_features = NodeFeatures :: empty ( ) ;
1105
+ onion_format_optional_features. set_variable_length_onion_optional ( ) ;
1106
+
1105
1107
// Find ways (channels with destination) to reach a given node and store them
1106
1108
// in the corresponding data structures (routing graph etc).
1107
1109
// $fee_to_target_msat represents how much it costs to reach to this node from the payee,
@@ -1132,7 +1134,7 @@ where L::Target: Logger {
1132
1134
let features = if let Some ( node_info) = $node. announcement_info. as_ref( ) {
1133
1135
& node_info. features
1134
1136
} else {
1135
- & empty_node_features
1137
+ & onion_format_optional_features
1136
1138
} ;
1137
1139
1138
1140
if !features. requires_unknown_bits( ) {
@@ -1312,7 +1314,7 @@ where L::Target: Logger {
1312
1314
// traversing the graph and arrange the path out of what we found.
1313
1315
if node_id == our_node_id {
1314
1316
let mut new_entry = dist. remove ( & our_node_id) . unwrap ( ) ;
1315
- let mut ordered_hops = vec ! ( ( new_entry. clone( ) , NodeFeatures :: empty ( ) ) ) ;
1317
+ let mut ordered_hops = vec ! ( ( new_entry. clone( ) , onion_format_optional_features . clone ( ) ) ) ;
1316
1318
1317
1319
' path_walk: loop {
1318
1320
let mut features_set = false ;
@@ -1330,7 +1332,7 @@ where L::Target: Logger {
1330
1332
if let Some ( node_info) = node. announcement_info . as_ref ( ) {
1331
1333
ordered_hops. last_mut ( ) . unwrap ( ) . 1 = node_info. features . clone ( ) ;
1332
1334
} else {
1333
- ordered_hops. last_mut ( ) . unwrap ( ) . 1 = NodeFeatures :: empty ( ) ;
1335
+ ordered_hops. last_mut ( ) . unwrap ( ) . 1 = onion_format_optional_features . clone ( ) ;
1334
1336
}
1335
1337
} else {
1336
1338
// We can fill in features for everything except hops which were
@@ -1357,7 +1359,7 @@ where L::Target: Logger {
1357
1359
// so that fees paid for a HTLC forwarding on the current channel are
1358
1360
// associated with the previous channel (where they will be subtracted).
1359
1361
ordered_hops. last_mut ( ) . unwrap ( ) . 0 . fee_msat = new_entry. hop_use_fee_msat ;
1360
- ordered_hops. push ( ( new_entry. clone ( ) , NodeFeatures :: empty ( ) ) ) ;
1362
+ ordered_hops. push ( ( new_entry. clone ( ) , onion_format_optional_features . clone ( ) ) ) ;
1361
1363
}
1362
1364
ordered_hops. last_mut ( ) . unwrap ( ) . 0 . fee_msat = value_contribution_msat;
1363
1365
ordered_hops. last_mut ( ) . unwrap ( ) . 0 . hop_use_fee_msat = 0 ;
@@ -1845,6 +1847,10 @@ mod tests {
1845
1847
}
1846
1848
}
1847
1849
1850
+ fn default_onion_format_flags ( ) -> Vec < u8 > {
1851
+ vec ! [ 0 , 2 ]
1852
+ }
1853
+
1848
1854
fn build_graph ( ) -> (
1849
1855
Secp256k1 < All > ,
1850
1856
sync:: Arc < NetworkGraph > ,
@@ -2785,7 +2791,7 @@ mod tests {
2785
2791
assert_eq ! ( route. paths[ 0 ] [ 4 ] . short_channel_id, 8 ) ;
2786
2792
assert_eq ! ( route. paths[ 0 ] [ 4 ] . fee_msat, 100 ) ;
2787
2793
assert_eq ! ( route. paths[ 0 ] [ 4 ] . cltv_expiry_delta, 42 ) ;
2788
- assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
2794
+ assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , & default_onion_format_flags ( ) ) ; // We dont pass flags in from invoices yet
2789
2795
assert_eq ! ( route. paths[ 0 ] [ 4 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
2790
2796
}
2791
2797
@@ -2861,7 +2867,7 @@ mod tests {
2861
2867
assert_eq ! ( route. paths[ 0 ] [ 4 ] . short_channel_id, 8 ) ;
2862
2868
assert_eq ! ( route. paths[ 0 ] [ 4 ] . fee_msat, 100 ) ;
2863
2869
assert_eq ! ( route. paths[ 0 ] [ 4 ] . cltv_expiry_delta, 42 ) ;
2864
- assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
2870
+ assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , & default_onion_format_flags ( ) ) ; // We dont pass flags in from invoices yet
2865
2871
assert_eq ! ( route. paths[ 0 ] [ 4 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
2866
2872
}
2867
2873
@@ -2958,7 +2964,7 @@ mod tests {
2958
2964
assert_eq ! ( route. paths[ 0 ] [ 3 ] . short_channel_id, last_hops[ 0 ] . 0 [ 1 ] . short_channel_id) ;
2959
2965
assert_eq ! ( route. paths[ 0 ] [ 3 ] . fee_msat, 100 ) ;
2960
2966
assert_eq ! ( route. paths[ 0 ] [ 3 ] . cltv_expiry_delta, 42 ) ;
2961
- assert_eq ! ( route. paths[ 0 ] [ 3 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
2967
+ assert_eq ! ( route. paths[ 0 ] [ 3 ] . node_features. le_flags( ) , & vec! [ 0 , 2 ] ) ; // We dont pass flags in from invoices yet
2962
2968
assert_eq ! ( route. paths[ 0 ] [ 3 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
2963
2969
}
2964
2970
@@ -3023,14 +3029,14 @@ mod tests {
3023
3029
assert_eq ! ( route. paths[ 0 ] [ 2 ] . short_channel_id, last_hops[ 0 ] . 0 [ 0 ] . short_channel_id) ;
3024
3030
assert_eq ! ( route. paths[ 0 ] [ 2 ] . fee_msat, 0 ) ;
3025
3031
assert_eq ! ( route. paths[ 0 ] [ 2 ] . cltv_expiry_delta, 129 ) ;
3026
- assert_eq ! ( route. paths[ 0 ] [ 2 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
3032
+ assert_eq ! ( route. paths[ 0 ] [ 2 ] . node_features. le_flags( ) , & default_onion_format_flags ( ) ) ; // We dont pass flags in from invoices yet
3027
3033
assert_eq ! ( route. paths[ 0 ] [ 2 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
3028
3034
3029
3035
assert_eq ! ( route. paths[ 0 ] [ 3 ] . pubkey, nodes[ 6 ] ) ;
3030
3036
assert_eq ! ( route. paths[ 0 ] [ 3 ] . short_channel_id, last_hops[ 0 ] . 0 [ 1 ] . short_channel_id) ;
3031
3037
assert_eq ! ( route. paths[ 0 ] [ 3 ] . fee_msat, 100 ) ;
3032
3038
assert_eq ! ( route. paths[ 0 ] [ 3 ] . cltv_expiry_delta, 42 ) ;
3033
- assert_eq ! ( route. paths[ 0 ] [ 3 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
3039
+ assert_eq ! ( route. paths[ 0 ] [ 3 ] . node_features. le_flags( ) , & default_onion_format_flags ( ) ) ; // We dont pass flags in from invoices yet
3034
3040
assert_eq ! ( route. paths[ 0 ] [ 3 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
3035
3041
}
3036
3042
@@ -3121,7 +3127,7 @@ mod tests {
3121
3127
assert_eq ! ( route. paths[ 0 ] [ 4 ] . short_channel_id, 8 ) ;
3122
3128
assert_eq ! ( route. paths[ 0 ] [ 4 ] . fee_msat, 100 ) ;
3123
3129
assert_eq ! ( route. paths[ 0 ] [ 4 ] . cltv_expiry_delta, 42 ) ;
3124
- assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
3130
+ assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , & default_onion_format_flags ( ) ) ; // We dont pass flags in from invoices yet
3125
3131
assert_eq ! ( route. paths[ 0 ] [ 4 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
3126
3132
}
3127
3133
@@ -3151,7 +3157,7 @@ mod tests {
3151
3157
assert_eq ! ( route. paths[ 0 ] [ 1 ] . short_channel_id, 8 ) ;
3152
3158
assert_eq ! ( route. paths[ 0 ] [ 1 ] . fee_msat, 100 ) ;
3153
3159
assert_eq ! ( route. paths[ 0 ] [ 1 ] . cltv_expiry_delta, 42 ) ;
3154
- assert_eq ! ( route. paths[ 0 ] [ 1 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
3160
+ assert_eq ! ( route. paths[ 0 ] [ 1 ] . node_features. le_flags( ) , & default_onion_format_flags ( ) ) ; // We dont pass flags in from invoices yet
3155
3161
assert_eq ! ( route. paths[ 0 ] [ 1 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
3156
3162
3157
3163
last_hops[ 0 ] . 0 [ 0 ] . fees . base_msat = 1000 ;
@@ -3188,7 +3194,7 @@ mod tests {
3188
3194
assert_eq ! ( route. paths[ 0 ] [ 3 ] . short_channel_id, 10 ) ;
3189
3195
assert_eq ! ( route. paths[ 0 ] [ 3 ] . fee_msat, 100 ) ;
3190
3196
assert_eq ! ( route. paths[ 0 ] [ 3 ] . cltv_expiry_delta, 42 ) ;
3191
- assert_eq ! ( route. paths[ 0 ] [ 3 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
3197
+ assert_eq ! ( route. paths[ 0 ] [ 3 ] . node_features. le_flags( ) , & default_onion_format_flags ( ) ) ; // We dont pass flags in from invoices yet
3192
3198
assert_eq ! ( route. paths[ 0 ] [ 3 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
3193
3199
3194
3200
// ...but still use 8 for larger payments as 6 has a variable feerate
@@ -3229,7 +3235,7 @@ mod tests {
3229
3235
assert_eq ! ( route. paths[ 0 ] [ 4 ] . short_channel_id, 8 ) ;
3230
3236
assert_eq ! ( route. paths[ 0 ] [ 4 ] . fee_msat, 2000 ) ;
3231
3237
assert_eq ! ( route. paths[ 0 ] [ 4 ] . cltv_expiry_delta, 42 ) ;
3232
- assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , & Vec :: < u8 > :: new ( ) ) ; // We dont pass flags in from invoices yet
3238
+ assert_eq ! ( route. paths[ 0 ] [ 4 ] . node_features. le_flags( ) , & default_onion_format_flags ( ) ) ; // We dont pass flags in from invoices yet
3233
3239
assert_eq ! ( route. paths[ 0 ] [ 4 ] . channel_features. le_flags( ) , & Vec :: <u8 >:: new( ) ) ; // We can't learn any flags from invoices, sadly
3234
3240
}
3235
3241
@@ -3281,7 +3287,7 @@ mod tests {
3281
3287
assert_eq ! ( route. paths[ 0 ] [ 1 ] . short_channel_id, 8 ) ;
3282
3288
assert_eq ! ( route. paths[ 0 ] [ 1 ] . fee_msat, 1000000 ) ;
3283
3289
assert_eq ! ( route. paths[ 0 ] [ 1 ] . cltv_expiry_delta, 42 ) ;
3284
- assert_eq ! ( route. paths[ 0 ] [ 1 ] . node_features. le_flags( ) , & [ 0 ; 0 ] ) ; // We dont pass flags in from invoices yet
3290
+ assert_eq ! ( route. paths[ 0 ] [ 1 ] . node_features. le_flags( ) , & default_onion_format_flags ( ) ) ; // We dont pass flags in from invoices yet
3285
3291
assert_eq ! ( route. paths[ 0 ] [ 1 ] . channel_features. le_flags( ) , & [ 0 ; 0 ] ) ; // We can't learn any flags from invoices, sadly
3286
3292
}
3287
3293
0 commit comments