Skip to content

Commit 158ef6f

Browse files
committed
Log peer's features if they require some we don't support
1 parent 1d2a27d commit 158ef6f

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

lightning/src/ln/features.rs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,35 @@ impl<T: sealed::Context> Features<T> {
784784
})
785785
}
786786

787+
pub(crate) fn required_unknown_bits_from(&self, other: &Self) -> Vec<usize> {
788+
let mut unknown_bits = Vec::new();
789+
790+
// Bitwise AND-ing with all even bits set except for known features will select required
791+
// unknown features.
792+
self.flags.iter().enumerate().for_each(|(i, &byte)| {
793+
const REQUIRED_FEATURES: u8 = 0b01_01_01_01;
794+
const OPTIONAL_FEATURES: u8 = 0b10_10_10_10;
795+
let unknown_features = if i < other.flags.len() {
796+
// Form a mask similar to !T::KNOWN_FEATURE_MASK only for `other`
797+
!(other.flags[i]
798+
| ((other.flags[i] >> 1) & REQUIRED_FEATURES)
799+
| ((other.flags[i] << 1) & OPTIONAL_FEATURES))
800+
} else {
801+
0b11_11_11_11
802+
};
803+
804+
if byte & unknown_features != 0 {
805+
for bit in (0..8).step_by(2) {
806+
if ((byte & unknown_features) >> bit) & 1 == 1 {
807+
unknown_bits.push(i * 8 + bit);
808+
}
809+
}
810+
}
811+
});
812+
813+
unknown_bits
814+
}
815+
787816
/// Returns true if this `Features` object contains unknown feature flags which are set as
788817
/// "required".
789818
pub fn requires_unknown_bits(&self) -> bool {
@@ -1034,11 +1063,24 @@ mod tests {
10341063
features.set_unknown_feature_required();
10351064
assert!(features.requires_unknown_bits());
10361065
assert!(features.supports_unknown_bits());
1066+
assert_eq!(features.required_unknown_bits_from(&ChannelFeatures::empty()), vec![123456788]);
10371067

10381068
let mut features = ChannelFeatures::empty();
10391069
features.set_unknown_feature_optional();
10401070
assert!(!features.requires_unknown_bits());
10411071
assert!(features.supports_unknown_bits());
1072+
assert_eq!(features.required_unknown_bits_from(&ChannelFeatures::empty()), vec![]);
1073+
1074+
let mut features = ChannelFeatures::empty();
1075+
features.set_unknown_feature_required();
1076+
features.set_custom_bit(123456786).unwrap();
1077+
assert!(features.requires_unknown_bits());
1078+
assert!(features.supports_unknown_bits());
1079+
assert_eq!(features.required_unknown_bits_from(&ChannelFeatures::empty()), vec![123456786, 123456788]);
1080+
1081+
let mut limiter = ChannelFeatures::empty();
1082+
limiter.set_unknown_feature_optional();
1083+
assert_eq!(features.required_unknown_bits_from(&limiter), vec![123456786]);
10421084
}
10431085

10441086
#[test]

lightning/src/ln/peer_handler.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,12 +1648,14 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
16481648

16491649
let our_features = self.init_features(&their_node_id);
16501650
if msg.features.requires_unknown_bits_from(&our_features) {
1651-
log_debug!(logger, "Peer requires features unknown to us");
1651+
log_debug!(logger, "Peer {} requires features unknown to us: {:?}",
1652+
log_pubkey!(their_node_id), msg.features.required_unknown_bits_from(&our_features));
16521653
return Err(PeerHandleError { }.into());
16531654
}
16541655

16551656
if our_features.requires_unknown_bits_from(&msg.features) {
1656-
log_debug!(logger, "We require features unknown to our peer");
1657+
log_debug!(logger, "We require features unknown to our peer {}: {:?}",
1658+
log_pubkey!(their_node_id), our_features.required_unknown_bits_from(&msg.features));
16571659
return Err(PeerHandleError { }.into());
16581660
}
16591661

0 commit comments

Comments
 (0)