Skip to content

Commit 2539cd4

Browse files
author
Antoine Riard
committed
Implement serialize/deserialize for Router.
Extend route_test to check if serialize/deserialize of NetworkMap works. Add PartialEq traits on some Router's structs. Modify also UnsignedNodeAnnouncement serialization
1 parent 301f91e commit 2539cd4

File tree

5 files changed

+428
-131
lines changed

5 files changed

+428
-131
lines changed

src/ln/msgs.rs

Lines changed: 159 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ use std::{cmp, fmt};
2626
use std::io::Read;
2727
use std::result::Result;
2828

29-
use util::{byte_utils, events};
29+
use util::events;
3030
use util::ser::{Readable, Writeable, Writer};
3131

3232
use ln::channelmanager::{PaymentPreimage, PaymentHash};
@@ -47,7 +47,6 @@ pub enum DecodeError {
4747
/// node_announcement included more than one address of a given type!
4848
ExtraAddressesPerType,
4949
/// A length descriptor in the packet didn't describe the later data correctly
50-
/// (currently only generated in node_announcement)
5150
BadLengthDescriptor,
5251
/// Error from std::io
5352
Io(::std::io::Error),
@@ -336,7 +335,7 @@ pub struct AnnouncementSignatures {
336335
}
337336

338337
/// An address which can be used to connect to a remote peer
339-
#[derive(Clone)]
338+
#[derive(PartialEq, Clone)]
340339
pub enum NetAddress {
341340
/// An IPv4 address/port on which the peer is listenting.
342341
IPv4 {
@@ -382,9 +381,95 @@ impl NetAddress {
382381
&NetAddress::OnionV3 {..} => { 4 },
383382
}
384383
}
384+
385+
/// Strict byte-length of address descriptor, 1-byte type not recorded
386+
/// If address is unknown, we give back a len of 0
387+
fn len(&self) -> u16 {
388+
match self {
389+
&NetAddress::IPv4 { .. } => { 6 },
390+
&NetAddress::IPv6 { .. } => { 18 },
391+
&NetAddress::OnionV2 { .. } => { 12 },
392+
&NetAddress::OnionV3 { .. } => { 37 },
393+
}
394+
}
385395
}
386396

387-
#[derive(Clone)]
397+
impl Writeable for NetAddress {
398+
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
399+
match self {
400+
&NetAddress::IPv4 { ref addr, ref port } => {
401+
1u8.write(writer)?;
402+
addr.write(writer)?;
403+
port.write(writer)?;
404+
},
405+
&NetAddress::IPv6 { ref addr, ref port } => {
406+
2u8.write(writer)?;
407+
addr.write(writer)?;
408+
port.write(writer)?;
409+
},
410+
&NetAddress::OnionV2 { ref addr, ref port } => {
411+
3u8.write(writer)?;
412+
addr.write(writer)?;
413+
port.write(writer)?;
414+
},
415+
&NetAddress::OnionV3 { ref ed25519_pubkey, ref checksum, ref version, ref port } => {
416+
4u8.write(writer)?;
417+
ed25519_pubkey.write(writer)?;
418+
checksum.write(writer)?;
419+
version.write(writer)?;
420+
port.write(writer)?;
421+
}
422+
}
423+
Ok(())
424+
}
425+
}
426+
427+
impl<R: ::std::io::Read> Readable<R> for Result<NetAddress, u8> {
428+
fn read(reader: &mut R) -> Result<Result<NetAddress, u8>, DecodeError> {
429+
let byte = <u8 as Readable<R>>::read(reader)?;
430+
match byte {
431+
1 => {
432+
let addr = Readable::read(reader)?;
433+
let port = Readable::read(reader)?;
434+
Ok(Ok(NetAddress::IPv4 {
435+
addr,
436+
port,
437+
}))
438+
},
439+
2 => {
440+
let addr = Readable::read(reader)?;
441+
let port = Readable::read(reader)?;
442+
Ok(Ok(NetAddress::IPv6 {
443+
addr,
444+
port,
445+
}))
446+
},
447+
3 => {
448+
let addr = Readable::read(reader)?;
449+
let port = Readable::read(reader)?;
450+
Ok(Ok(NetAddress::OnionV2 {
451+
addr,
452+
port,
453+
}))
454+
},
455+
4 => {
456+
let ed25519_pubkey = Readable::read(reader)?;
457+
let checksum = Readable::read(reader)?;
458+
let version = Readable::read(reader)?;
459+
let port = Readable::read(reader)?;
460+
Ok(Ok(NetAddress::OnionV3 {
461+
ed25519_pubkey,
462+
checksum,
463+
version,
464+
port,
465+
}))
466+
},
467+
_ => return Ok(Err(byte)),
468+
}
469+
}
470+
}
471+
472+
#[derive(PartialEq, Clone)]
388473
// Only exposed as broadcast of node_announcement should be filtered by node_id
389474
/// The unsigned part of a node_announcement
390475
pub struct UnsignedNodeAnnouncement {
@@ -401,7 +486,7 @@ pub struct UnsignedNodeAnnouncement {
401486
pub(crate) excess_address_data: Vec<u8>,
402487
pub(crate) excess_data: Vec<u8>,
403488
}
404-
#[derive(Clone)]
489+
#[derive(PartialEq, Clone)]
405490
/// A node_announcement message to be sent or received from a peer
406491
pub struct NodeAnnouncement {
407492
pub(crate) signature: Signature,
@@ -669,7 +754,7 @@ impl Error for DecodeError {
669754
DecodeError::InvalidValue => "Nonsense bytes didn't map to the type they were interpreted as",
670755
DecodeError::ShortRead => "Packet extended beyond the provided bytes",
671756
DecodeError::ExtraAddressesPerType => "More than one address of a single type",
672-
DecodeError::BadLengthDescriptor => "A length descriptor in the packet didn't describe the later data correctly",
757+
DecodeError::BadLengthDescriptor => "A length descriptor in the packet didn't describe the later correctly",
673758
DecodeError::Io(ref e) => e.description(),
674759
}
675760
}
@@ -1134,7 +1219,7 @@ impl<R: Read> Readable<R> for ErrorMessage {
11341219
sz = cmp::min(data_len, sz);
11351220
match String::from_utf8(data[..sz as usize].to_vec()) {
11361221
Ok(s) => s,
1137-
Err(_) => return Err(DecodeError::InvalidValue),
1222+
Err(_) => return Err(DecodeError::InvalidValue ),
11381223
}
11391224
}
11401225
})
@@ -1150,38 +1235,17 @@ impl Writeable for UnsignedNodeAnnouncement {
11501235
w.write_all(&self.rgb)?;
11511236
self.alias.write(w)?;
11521237

1153-
let mut addr_slice = Vec::with_capacity(self.addresses.len() * 18);
11541238
let mut addrs_to_encode = self.addresses.clone();
11551239
addrs_to_encode.sort_unstable_by(|a, b| { a.get_id().cmp(&b.get_id()) });
11561240
addrs_to_encode.dedup_by(|a, b| { a.get_id() == b.get_id() });
1157-
for addr in addrs_to_encode.iter() {
1158-
match addr {
1159-
&NetAddress::IPv4{addr, port} => {
1160-
addr_slice.push(1);
1161-
addr_slice.extend_from_slice(&addr);
1162-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1163-
},
1164-
&NetAddress::IPv6{addr, port} => {
1165-
addr_slice.push(2);
1166-
addr_slice.extend_from_slice(&addr);
1167-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1168-
},
1169-
&NetAddress::OnionV2{addr, port} => {
1170-
addr_slice.push(3);
1171-
addr_slice.extend_from_slice(&addr);
1172-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1173-
},
1174-
&NetAddress::OnionV3{ed25519_pubkey, checksum, version, port} => {
1175-
addr_slice.push(4);
1176-
addr_slice.extend_from_slice(&ed25519_pubkey);
1177-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(checksum));
1178-
addr_slice.push(version);
1179-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1180-
},
1181-
}
1241+
let mut addr_len = 0;
1242+
for addr in &addrs_to_encode {
1243+
addr_len += 1 + addr.len();
1244+
}
1245+
(addr_len + self.excess_address_data.len() as u16).write(w)?;
1246+
for addr in addrs_to_encode {
1247+
addr.write(w)?;
11821248
}
1183-
((addr_slice.len() + self.excess_address_data.len()) as u16).write(w)?;
1184-
w.write_all(&addr_slice[..])?;
11851249
w.write_all(&self.excess_address_data[..])?;
11861250
w.write_all(&self.excess_data[..])?;
11871251
Ok(())
@@ -1200,112 +1264,81 @@ impl<R: Read> Readable<R> for UnsignedNodeAnnouncement {
12001264
r.read_exact(&mut rgb)?;
12011265
let alias: [u8; 32] = Readable::read(r)?;
12021266

1203-
let addrlen: u16 = Readable::read(r)?;
1267+
let addr_len: u16 = Readable::read(r)?;
1268+
let mut addresses: Vec<NetAddress> = Vec::with_capacity(4);
12041269
let mut addr_readpos = 0;
1205-
let mut addresses = Vec::with_capacity(4);
1206-
let mut f: u8 = 0;
1207-
let mut excess = 0;
1270+
let mut excess = false;
1271+
let mut excess_byte = 0;
12081272
loop {
1209-
if addrlen <= addr_readpos { break; }
1210-
f = Readable::read(r)?;
1211-
match f {
1212-
1 => {
1213-
if addresses.len() > 0 {
1214-
return Err(DecodeError::ExtraAddressesPerType);
1215-
}
1216-
if addrlen < addr_readpos + 1 + 6 {
1217-
return Err(DecodeError::BadLengthDescriptor);
1218-
}
1219-
addresses.push(NetAddress::IPv4 {
1220-
addr: {
1221-
let mut addr = [0; 4];
1222-
r.read_exact(&mut addr)?;
1223-
addr
1224-
},
1225-
port: Readable::read(r)?,
1226-
});
1227-
addr_readpos += 1 + 6
1228-
},
1229-
2 => {
1230-
if addresses.len() > 1 || (addresses.len() == 1 && addresses[0].get_id() != 1) {
1231-
return Err(DecodeError::ExtraAddressesPerType);
1273+
if addr_len < addr_readpos { break; }
1274+
match Readable::read(r) {
1275+
Ok(res) => {
1276+
match res {
1277+
Ok(addr) => {
1278+
match addr {
1279+
NetAddress::IPv4 { .. } => {
1280+
if addresses.len() > 0 {
1281+
return Err(DecodeError::ExtraAddressesPerType);
1282+
}
1283+
},
1284+
NetAddress::IPv6 { .. } => {
1285+
if addresses.len() > 1 || (addresses.len() == 1 && addresses[0].get_id() != 1) {
1286+
return Err(DecodeError::ExtraAddressesPerType);
1287+
}
1288+
},
1289+
NetAddress::OnionV2 { .. } => {
1290+
if addresses.len() > 2 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 2) {
1291+
return Err(DecodeError::ExtraAddressesPerType);
1292+
}
1293+
},
1294+
NetAddress::OnionV3 { .. } => {
1295+
if addresses.len() > 3 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 3) {
1296+
return Err(DecodeError::ExtraAddressesPerType);
1297+
}
1298+
},
1299+
}
1300+
if addr_len < addr_readpos + 1 + addr.len() {
1301+
return Err(DecodeError::BadLengthDescriptor);
1302+
}
1303+
addr_readpos += (1 + addr.len()) as u16;
1304+
addresses.push(addr);
1305+
}
1306+
Err(unknown_descriptor) => {
1307+
excess = true;
1308+
excess_byte = unknown_descriptor;
1309+
break;
1310+
}
12321311
}
1233-
if addrlen < addr_readpos + 1 + 18 {
1234-
return Err(DecodeError::BadLengthDescriptor);
1235-
}
1236-
addresses.push(NetAddress::IPv6 {
1237-
addr: {
1238-
let mut addr = [0; 16];
1239-
r.read_exact(&mut addr)?;
1240-
addr
1241-
},
1242-
port: Readable::read(r)?,
1243-
});
1244-
addr_readpos += 1 + 18
1245-
},
1246-
3 => {
1247-
if addresses.len() > 2 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 2) {
1248-
return Err(DecodeError::ExtraAddressesPerType);
1249-
}
1250-
if addrlen < addr_readpos + 1 + 12 {
1251-
return Err(DecodeError::BadLengthDescriptor);
1252-
}
1253-
addresses.push(NetAddress::OnionV2 {
1254-
addr: {
1255-
let mut addr = [0; 10];
1256-
r.read_exact(&mut addr)?;
1257-
addr
1258-
},
1259-
port: Readable::read(r)?,
1260-
});
1261-
addr_readpos += 1 + 12
1262-
},
1263-
4 => {
1264-
if addresses.len() > 3 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 3) {
1265-
return Err(DecodeError::ExtraAddressesPerType);
1266-
}
1267-
if addrlen < addr_readpos + 1 + 37 {
1268-
return Err(DecodeError::BadLengthDescriptor);
1269-
}
1270-
addresses.push(NetAddress::OnionV3 {
1271-
ed25519_pubkey: Readable::read(r)?,
1272-
checksum: Readable::read(r)?,
1273-
version: Readable::read(r)?,
1274-
port: Readable::read(r)?,
1275-
});
1276-
addr_readpos += 1 + 37
12771312
},
1278-
_ => { excess = 1; break; }
1313+
Err(DecodeError::ShortRead) => return Err(DecodeError::BadLengthDescriptor),
1314+
_ => unreachable!(),
12791315
}
12801316
}
12811317

12821318
let mut excess_data = vec![];
1283-
let excess_address_data = if addr_readpos < addrlen {
1284-
let mut excess_address_data = vec![0; (addrlen - addr_readpos) as usize];
1285-
r.read_exact(&mut excess_address_data[excess..])?;
1286-
if excess == 1 {
1287-
excess_address_data[0] = f;
1319+
let excess_address_data = if addr_readpos < addr_len {
1320+
let mut excess_address_data = vec![0; (addr_len - addr_readpos) as usize];
1321+
r.read_exact(&mut excess_address_data[if excess { 1 } else { 0 }..])?;
1322+
if excess {
1323+
excess_address_data[0] = excess_byte;
12881324
}
12891325
excess_address_data
12901326
} else {
1291-
if excess == 1 {
1292-
excess_data.push(f);
1327+
if excess {
1328+
excess_data.push(excess_byte);
12931329
}
12941330
Vec::new()
12951331
};
1296-
1332+
r.read_to_end(&mut excess_data)?;
12971333
Ok(UnsignedNodeAnnouncement {
1298-
features: features,
1299-
timestamp: timestamp,
1300-
node_id: node_id,
1301-
rgb: rgb,
1302-
alias: alias,
1303-
addresses: addresses,
1304-
excess_address_data: excess_address_data,
1305-
excess_data: {
1306-
r.read_to_end(&mut excess_data)?;
1307-
excess_data
1308-
},
1334+
features,
1335+
timestamp,
1336+
node_id,
1337+
rgb,
1338+
alias,
1339+
addresses,
1340+
excess_address_data,
1341+
excess_data,
13091342
})
13101343
}
13111344
}

src/ln/peer_handler.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@ impl<Descriptor: SocketDescriptor> PeerManager<Descriptor> {
478478
log_debug!(self, "Got a channel/node announcement with an known required feature flag, you may want to udpate!");
479479
continue;
480480
},
481-
msgs::DecodeError::InvalidValue => return Err(PeerHandleError{ no_connection_possible: false }),
481+
msgs::DecodeError::InvalidValue { .. } => return Err(PeerHandleError{ no_connection_possible: false }),
482482
msgs::DecodeError::ShortRead => return Err(PeerHandleError{ no_connection_possible: false }),
483483
msgs::DecodeError::ExtraAddressesPerType => {
484484
log_debug!(self, "Error decoding message, ignoring due to lnd spec incompatibility. See https://github.com/lightningnetwork/lnd/issues/1407");

0 commit comments

Comments
 (0)