Skip to content

Commit 822f45e

Browse files
committed
Add features for payment_secret and basic_mpp
1 parent ef599a5 commit 822f45e

File tree

1 file changed

+35
-10
lines changed

1 file changed

+35
-10
lines changed

lightning/src/ln/features.rs

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ mod sealed { // You should just use the type aliases instead.
3333
pub trait VariableLengthOnion: Context {}
3434
impl VariableLengthOnion for InitContext {}
3535
impl VariableLengthOnion for NodeContext {}
36+
37+
pub trait PaymentSecret: Context {}
38+
impl PaymentSecret for InitContext {}
39+
impl PaymentSecret for NodeContext {}
40+
41+
pub trait BasicMPP: Context {}
42+
impl BasicMPP for InitContext {}
43+
impl BasicMPP for NodeContext {}
3644
}
3745

3846
/// Tracks the set of features which a node implements, templated by the context in which it
@@ -74,14 +82,14 @@ impl InitFeatures {
7482
#[cfg(not(feature = "fuzztarget"))]
7583
pub(crate) fn our_features() -> InitFeatures {
7684
InitFeatures {
77-
flags: vec![2 | 1 << 5, 1 << (9-8)],
85+
flags: vec![2 | 1 << 5, 1 << (9-8) | 1 << (15 - 8), 1 << (17 - 8*2)],
7886
mark: PhantomData,
7987
}
8088
}
8189
#[cfg(feature = "fuzztarget")]
8290
pub fn our_features() -> InitFeatures {
8391
InitFeatures {
84-
flags: vec![2 | 1 << 5, 1 << (9-8)],
92+
flags: vec![2 | 1 << 5, 1 << (9-8) | 1 << (15 - 8), 1 << (17 - 8*2)],
8593
mark: PhantomData,
8694
}
8795
}
@@ -143,14 +151,14 @@ impl NodeFeatures {
143151
#[cfg(not(feature = "fuzztarget"))]
144152
pub(crate) fn our_features() -> NodeFeatures {
145153
NodeFeatures {
146-
flags: vec![2 | 1 << 5, 1 << (9-8)],
154+
flags: vec![2 | 1 << 5, 1 << (9-8) | 1 << (15 - 8), 1 << (17 - 8*2)],
147155
mark: PhantomData,
148156
}
149157
}
150158
#[cfg(feature = "fuzztarget")]
151159
pub fn our_features() -> NodeFeatures {
152160
NodeFeatures {
153-
flags: vec![2 | 1 << 5, 1 << (9-8)],
161+
flags: vec![2 | 1 << 5, 1 << (9-8) | 1 << (15 - 8), 1 << (17 - 8*2)],
154162
mark: PhantomData,
155163
}
156164
}
@@ -195,7 +203,8 @@ impl<T: sealed::Context> Features<T> {
195203
self.flags.iter().enumerate().any(|(idx, &byte)| {
196204
(match idx {
197205
0 => (byte & 0b01000100),
198-
1 => (byte & 0b01010100),
206+
1 => (byte & 0b00010100),
207+
2 => (byte & 0b01010100),
199208
_ => (byte & 0b01010101),
200209
}) != 0
201210
})
@@ -205,7 +214,8 @@ impl<T: sealed::Context> Features<T> {
205214
self.flags.iter().enumerate().any(|(idx, &byte)| {
206215
(match idx {
207216
0 => (byte & 0b11000100),
208-
1 => (byte & 0b11111100),
217+
1 => (byte & 0b00111100),
218+
2 => (byte & 0b11111100),
209219
_ => byte,
210220
}) != 0
211221
})
@@ -219,16 +229,19 @@ impl<T: sealed::Context> Features<T> {
219229

220230
#[cfg(test)]
221231
pub(crate) fn set_require_unknown_bits(&mut self) {
222-
let newlen = cmp::max(2, self.flags.len());
232+
let newlen = cmp::max(3, self.flags.len());
223233
self.flags.resize(newlen, 0u8);
224-
self.flags[1] |= 0x40;
234+
self.flags[2] |= 0x40;
225235
}
226236

227237
#[cfg(test)]
228238
pub(crate) fn clear_require_unknown_bits(&mut self) {
229-
let newlen = cmp::max(2, self.flags.len());
239+
let newlen = cmp::max(3, self.flags.len());
230240
self.flags.resize(newlen, 0u8);
231-
self.flags[1] &= !0x40;
241+
self.flags[2] &= !0x40;
242+
if self.flags.len() == 3 && self.flags[2] == 0 {
243+
self.flags.resize(2, 0u8);
244+
}
232245
if self.flags.len() == 2 && self.flags[1] == 0 {
233246
self.flags.resize(1, 0u8);
234247
}
@@ -270,6 +283,18 @@ impl<T: sealed::InitialRoutingSync> Features<T> {
270283
}
271284
}
272285

286+
impl<T: sealed::PaymentSecret> Features<T> {
287+
pub(crate) fn payment_secret(&self) -> bool {
288+
self.flags.len() > 1 && (self.flags[1] & (3 << (12-8))) != 0
289+
}
290+
}
291+
292+
impl<T: sealed::BasicMPP> Features<T> {
293+
pub(crate) fn basic_mpp(&self) -> bool {
294+
self.flags.len() > 2 && (self.flags[2] & (3 << (16-8*2))) != 0
295+
}
296+
}
297+
273298
impl<T: sealed::Context> Writeable for Features<T> {
274299
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
275300
w.size_hint(self.flags.len() + 2);

0 commit comments

Comments
 (0)