Skip to content

Commit 712b5b4

Browse files
committed
Add features for payment_secret and basic_mpp
1 parent 6e803a5 commit 712b5b4

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
@@ -82,14 +90,14 @@ impl InitFeatures {
8290
#[cfg(not(feature = "fuzztarget"))]
8391
pub(crate) fn our_features() -> InitFeatures {
8492
InitFeatures {
85-
flags: vec![2 | 1 << 5, 1 << (9-8)],
93+
flags: vec![2 | 1 << 5, 1 << (9-8) | 1 << (15 - 8), 1 << (17 - 8*2)],
8694
mark: PhantomData,
8795
}
8896
}
8997
#[cfg(feature = "fuzztarget")]
9098
pub fn our_features() -> InitFeatures {
9199
InitFeatures {
92-
flags: vec![2 | 1 << 5, 1 << (9-8)],
100+
flags: vec![2 | 1 << 5, 1 << (9-8) | 1 << (15 - 8), 1 << (17 - 8*2)],
93101
mark: PhantomData,
94102
}
95103
}
@@ -150,14 +158,14 @@ impl NodeFeatures {
150158
#[cfg(not(feature = "fuzztarget"))]
151159
pub(crate) 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
}
157165
#[cfg(feature = "fuzztarget")]
158166
pub fn our_features() -> NodeFeatures {
159167
NodeFeatures {
160-
flags: vec![2 | 1 << 5, 1 << (9-8)],
168+
flags: vec![2 | 1 << 5, 1 << (9-8) | 1 << (15 - 8), 1 << (17 - 8*2)],
161169
mark: PhantomData,
162170
}
163171
}
@@ -187,7 +195,8 @@ impl<T: sealed::Context> Features<T> {
187195
self.flags.iter().enumerate().any(|(idx, &byte)| {
188196
(match idx {
189197
0 => (byte & 0b01000100),
190-
1 => (byte & 0b01010100),
198+
1 => (byte & 0b00010100),
199+
2 => (byte & 0b01010100),
191200
_ => (byte & 0b01010101),
192201
}) != 0
193202
})
@@ -197,7 +206,8 @@ impl<T: sealed::Context> Features<T> {
197206
self.flags.iter().enumerate().any(|(idx, &byte)| {
198207
(match idx {
199208
0 => (byte & 0b11000100),
200-
1 => (byte & 0b11111100),
209+
1 => (byte & 0b00111100),
210+
2 => (byte & 0b11111100),
201211
_ => byte,
202212
}) != 0
203213
})
@@ -211,16 +221,19 @@ impl<T: sealed::Context> Features<T> {
211221

212222
#[cfg(test)]
213223
pub(crate) fn set_require_unknown_bits(&mut self) {
214-
let newlen = cmp::max(2, self.flags.len());
224+
let newlen = cmp::max(3, self.flags.len());
215225
self.flags.resize(newlen, 0u8);
216-
self.flags[1] |= 0x40;
226+
self.flags[2] |= 0x40;
217227
}
218228

219229
#[cfg(test)]
220230
pub(crate) fn clear_require_unknown_bits(&mut self) {
221-
let newlen = cmp::max(2, self.flags.len());
231+
let newlen = cmp::max(3, self.flags.len());
222232
self.flags.resize(newlen, 0u8);
223-
self.flags[1] &= !0x40;
233+
self.flags[2] &= !0x40;
234+
if self.flags.len() == 3 && self.flags[2] == 0 {
235+
self.flags.resize(2, 0u8);
236+
}
224237
if self.flags.len() == 2 && self.flags[1] == 0 {
225238
self.flags.resize(1, 0u8);
226239
}
@@ -262,6 +275,18 @@ impl<T: sealed::InitialRoutingSync> Features<T> {
262275
}
263276
}
264277

278+
impl<T: sealed::PaymentSecret> Features<T> {
279+
pub(crate) fn payment_secret(&self) -> bool {
280+
self.flags.len() > 1 && (self.flags[1] & (3 << (12-8))) != 0
281+
}
282+
}
283+
284+
impl<T: sealed::BasicMPP> Features<T> {
285+
pub(crate) fn basic_mpp(&self) -> bool {
286+
self.flags.len() > 2 && (self.flags[2] & (3 << (16-8*2))) != 0
287+
}
288+
}
289+
265290
impl<T: sealed::Context> Writeable for Features<T> {
266291
fn write<W: Writer>(&self, w: &mut W) -> Result<(), ::std::io::Error> {
267292
w.size_hint(self.flags.len() + 2);

0 commit comments

Comments
 (0)