Skip to content

Commit c7b8c31

Browse files
Antoine RiardTheBlueMatt
authored andcommitted
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 70d06b4 commit c7b8c31

File tree

5 files changed

+335
-125
lines changed

5 files changed

+335
-125
lines changed

src/ln/msgs.rs

Lines changed: 137 additions & 119 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,84 @@ impl NetAddress {
382381
&NetAddress::OnionV3 {..} => { 4 },
383382
}
384383
}
384+
385+
/// Strict byte-length of address descriptor, 1-byte type not recorded
386+
fn len(&self) -> u16 {
387+
match self {
388+
&NetAddress::IPv4 { .. } => { 6 },
389+
&NetAddress::IPv6 { .. } => { 18 },
390+
&NetAddress::OnionV2 { .. } => { 12 },
391+
&NetAddress::OnionV3 { .. } => { 37 },
392+
}
393+
}
385394
}
386395

387-
#[derive(Clone)]
396+
impl Writeable for NetAddress {
397+
fn write<W: Writer>(&self, writer: &mut W) -> Result<(), ::std::io::Error> {
398+
match self {
399+
&NetAddress::IPv4 { ref addr, ref port } => {
400+
1u8.write(writer)?;
401+
addr.write(writer)?;
402+
port.write(writer)?;
403+
},
404+
&NetAddress::IPv6 { ref addr, ref port } => {
405+
2u8.write(writer)?;
406+
addr.write(writer)?;
407+
port.write(writer)?;
408+
},
409+
&NetAddress::OnionV2 { ref addr, ref port } => {
410+
3u8.write(writer)?;
411+
addr.write(writer)?;
412+
port.write(writer)?;
413+
},
414+
&NetAddress::OnionV3 { ref ed25519_pubkey, ref checksum, ref version, ref port } => {
415+
4u8.write(writer)?;
416+
ed25519_pubkey.write(writer)?;
417+
checksum.write(writer)?;
418+
version.write(writer)?;
419+
port.write(writer)?;
420+
}
421+
}
422+
Ok(())
423+
}
424+
}
425+
426+
impl<R: ::std::io::Read> Readable<R> for Result<NetAddress, u8> {
427+
fn read(reader: &mut R) -> Result<Result<NetAddress, u8>, DecodeError> {
428+
let byte = <u8 as Readable<R>>::read(reader)?;
429+
match byte {
430+
1 => {
431+
Ok(Ok(NetAddress::IPv4 {
432+
addr: Readable::read(reader)?,
433+
port: Readable::read(reader)?,
434+
}))
435+
},
436+
2 => {
437+
Ok(Ok(NetAddress::IPv6 {
438+
addr: Readable::read(reader)?,
439+
port: Readable::read(reader)?,
440+
}))
441+
},
442+
3 => {
443+
Ok(Ok(NetAddress::OnionV2 {
444+
addr: Readable::read(reader)?,
445+
port: Readable::read(reader)?,
446+
}))
447+
},
448+
4 => {
449+
Ok(Ok(NetAddress::OnionV3 {
450+
ed25519_pubkey: Readable::read(reader)?,
451+
checksum: Readable::read(reader)?,
452+
version: Readable::read(reader)?,
453+
port: Readable::read(reader)?,
454+
}))
455+
},
456+
_ => return Ok(Err(byte)),
457+
}
458+
}
459+
}
460+
461+
#[derive(PartialEq, Clone)]
388462
// Only exposed as broadcast of node_announcement should be filtered by node_id
389463
/// The unsigned part of a node_announcement
390464
pub struct UnsignedNodeAnnouncement {
@@ -401,7 +475,7 @@ pub struct UnsignedNodeAnnouncement {
401475
pub(crate) excess_address_data: Vec<u8>,
402476
pub(crate) excess_data: Vec<u8>,
403477
}
404-
#[derive(Clone)]
478+
#[derive(PartialEq, Clone)]
405479
/// A node_announcement message to be sent or received from a peer
406480
pub struct NodeAnnouncement {
407481
pub(crate) signature: Signature,
@@ -1192,38 +1266,17 @@ impl Writeable for UnsignedNodeAnnouncement {
11921266
w.write_all(&self.rgb)?;
11931267
self.alias.write(w)?;
11941268

1195-
let mut addr_slice = Vec::with_capacity(self.addresses.len() * 18);
11961269
let mut addrs_to_encode = self.addresses.clone();
11971270
addrs_to_encode.sort_unstable_by(|a, b| { a.get_id().cmp(&b.get_id()) });
11981271
addrs_to_encode.dedup_by(|a, b| { a.get_id() == b.get_id() });
1199-
for addr in addrs_to_encode.iter() {
1200-
match addr {
1201-
&NetAddress::IPv4{addr, port} => {
1202-
addr_slice.push(1);
1203-
addr_slice.extend_from_slice(&addr);
1204-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1205-
},
1206-
&NetAddress::IPv6{addr, port} => {
1207-
addr_slice.push(2);
1208-
addr_slice.extend_from_slice(&addr);
1209-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1210-
},
1211-
&NetAddress::OnionV2{addr, port} => {
1212-
addr_slice.push(3);
1213-
addr_slice.extend_from_slice(&addr);
1214-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1215-
},
1216-
&NetAddress::OnionV3{ed25519_pubkey, checksum, version, port} => {
1217-
addr_slice.push(4);
1218-
addr_slice.extend_from_slice(&ed25519_pubkey);
1219-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(checksum));
1220-
addr_slice.push(version);
1221-
addr_slice.extend_from_slice(&byte_utils::be16_to_array(port));
1222-
},
1223-
}
1272+
let mut addr_len = 0;
1273+
for addr in &addrs_to_encode {
1274+
addr_len += 1 + addr.len();
1275+
}
1276+
(addr_len + self.excess_address_data.len() as u16).write(w)?;
1277+
for addr in addrs_to_encode {
1278+
addr.write(w)?;
12241279
}
1225-
((addr_slice.len() + self.excess_address_data.len()) as u16).write(w)?;
1226-
w.write_all(&addr_slice[..])?;
12271280
w.write_all(&self.excess_address_data[..])?;
12281281
w.write_all(&self.excess_data[..])?;
12291282
Ok(())
@@ -1242,112 +1295,77 @@ impl<R: Read> Readable<R> for UnsignedNodeAnnouncement {
12421295
r.read_exact(&mut rgb)?;
12431296
let alias: [u8; 32] = Readable::read(r)?;
12441297

1245-
let addrlen: u16 = Readable::read(r)?;
1298+
let addr_len: u16 = Readable::read(r)?;
1299+
let mut addresses: Vec<NetAddress> = Vec::with_capacity(4);
12461300
let mut addr_readpos = 0;
1247-
let mut addresses = Vec::with_capacity(4);
1248-
let mut f: u8 = 0;
1249-
let mut excess = 0;
1301+
let mut excess = false;
1302+
let mut excess_byte = 0;
12501303
loop {
1251-
if addrlen <= addr_readpos { break; }
1252-
f = Readable::read(r)?;
1253-
match f {
1254-
1 => {
1255-
if addresses.len() > 0 {
1256-
return Err(DecodeError::ExtraAddressesPerType);
1257-
}
1258-
if addrlen < addr_readpos + 1 + 6 {
1259-
return Err(DecodeError::BadLengthDescriptor);
1260-
}
1261-
addresses.push(NetAddress::IPv4 {
1262-
addr: {
1263-
let mut addr = [0; 4];
1264-
r.read_exact(&mut addr)?;
1265-
addr
1304+
if addr_len <= addr_readpos { break; }
1305+
match Readable::read(r) {
1306+
Ok(Ok(addr)) => {
1307+
match addr {
1308+
NetAddress::IPv4 { .. } => {
1309+
if addresses.len() > 0 {
1310+
return Err(DecodeError::ExtraAddressesPerType);
1311+
}
12661312
},
1267-
port: Readable::read(r)?,
1268-
});
1269-
addr_readpos += 1 + 6
1270-
},
1271-
2 => {
1272-
if addresses.len() > 1 || (addresses.len() == 1 && addresses[0].get_id() != 1) {
1273-
return Err(DecodeError::ExtraAddressesPerType);
1274-
}
1275-
if addrlen < addr_readpos + 1 + 18 {
1276-
return Err(DecodeError::BadLengthDescriptor);
1277-
}
1278-
addresses.push(NetAddress::IPv6 {
1279-
addr: {
1280-
let mut addr = [0; 16];
1281-
r.read_exact(&mut addr)?;
1282-
addr
1313+
NetAddress::IPv6 { .. } => {
1314+
if addresses.len() > 1 || (addresses.len() == 1 && addresses[0].get_id() != 1) {
1315+
return Err(DecodeError::ExtraAddressesPerType);
1316+
}
12831317
},
1284-
port: Readable::read(r)?,
1285-
});
1286-
addr_readpos += 1 + 18
1287-
},
1288-
3 => {
1289-
if addresses.len() > 2 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 2) {
1290-
return Err(DecodeError::ExtraAddressesPerType);
1291-
}
1292-
if addrlen < addr_readpos + 1 + 12 {
1293-
return Err(DecodeError::BadLengthDescriptor);
1294-
}
1295-
addresses.push(NetAddress::OnionV2 {
1296-
addr: {
1297-
let mut addr = [0; 10];
1298-
r.read_exact(&mut addr)?;
1299-
addr
1318+
NetAddress::OnionV2 { .. } => {
1319+
if addresses.len() > 2 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 2) {
1320+
return Err(DecodeError::ExtraAddressesPerType);
1321+
}
1322+
},
1323+
NetAddress::OnionV3 { .. } => {
1324+
if addresses.len() > 3 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 3) {
1325+
return Err(DecodeError::ExtraAddressesPerType);
1326+
}
13001327
},
1301-
port: Readable::read(r)?,
1302-
});
1303-
addr_readpos += 1 + 12
1304-
},
1305-
4 => {
1306-
if addresses.len() > 3 || (addresses.len() > 0 && addresses.last().unwrap().get_id() > 3) {
1307-
return Err(DecodeError::ExtraAddressesPerType);
13081328
}
1309-
if addrlen < addr_readpos + 1 + 37 {
1329+
if addr_len < addr_readpos + 1 + addr.len() {
13101330
return Err(DecodeError::BadLengthDescriptor);
13111331
}
1312-
addresses.push(NetAddress::OnionV3 {
1313-
ed25519_pubkey: Readable::read(r)?,
1314-
checksum: Readable::read(r)?,
1315-
version: Readable::read(r)?,
1316-
port: Readable::read(r)?,
1317-
});
1318-
addr_readpos += 1 + 37
1332+
addr_readpos += (1 + addr.len()) as u16;
1333+
addresses.push(addr);
13191334
},
1320-
_ => { excess = 1; break; }
1335+
Ok(Err(unknown_descriptor)) => {
1336+
excess = true;
1337+
excess_byte = unknown_descriptor;
1338+
break;
1339+
},
1340+
Err(DecodeError::ShortRead) => return Err(DecodeError::BadLengthDescriptor),
1341+
Err(e) => return Err(e),
13211342
}
13221343
}
13231344

13241345
let mut excess_data = vec![];
1325-
let excess_address_data = if addr_readpos < addrlen {
1326-
let mut excess_address_data = vec![0; (addrlen - addr_readpos) as usize];
1327-
r.read_exact(&mut excess_address_data[excess..])?;
1328-
if excess == 1 {
1329-
excess_address_data[0] = f;
1346+
let excess_address_data = if addr_readpos < addr_len {
1347+
let mut excess_address_data = vec![0; (addr_len - addr_readpos) as usize];
1348+
r.read_exact(&mut excess_address_data[if excess { 1 } else { 0 }..])?;
1349+
if excess {
1350+
excess_address_data[0] = excess_byte;
13301351
}
13311352
excess_address_data
13321353
} else {
1333-
if excess == 1 {
1334-
excess_data.push(f);
1354+
if excess {
1355+
excess_data.push(excess_byte);
13351356
}
13361357
Vec::new()
13371358
};
1338-
1359+
r.read_to_end(&mut excess_data)?;
13391360
Ok(UnsignedNodeAnnouncement {
1340-
features: features,
1341-
timestamp: timestamp,
1342-
node_id: node_id,
1343-
rgb: rgb,
1344-
alias: alias,
1345-
addresses: addresses,
1346-
excess_address_data: excess_address_data,
1347-
excess_data: {
1348-
r.read_to_end(&mut excess_data)?;
1349-
excess_data
1350-
},
1361+
features,
1362+
timestamp,
1363+
node_id,
1364+
rgb,
1365+
alias,
1366+
addresses,
1367+
excess_address_data,
1368+
excess_data,
13511369
})
13521370
}
13531371
}

src/ln/peer_handler.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -478,8 +478,14 @@ 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 }),
482-
msgs::DecodeError::ShortRead => return Err(PeerHandleError{ no_connection_possible: false }),
481+
msgs::DecodeError::InvalidValue => {
482+
log_debug!(self, "Got an invalid value while deserializing message");
483+
return Err(PeerHandleError{ no_connection_possible: false });
484+
},
485+
msgs::DecodeError::ShortRead => {
486+
log_debug!(self, "Deserialization failed due to shortness of message");
487+
return Err(PeerHandleError{ no_connection_possible: false });
488+
},
483489
msgs::DecodeError::ExtraAddressesPerType => {
484490
log_debug!(self, "Error decoding message, ignoring due to lnd spec incompatibility. See https://github.com/lightningnetwork/lnd/issues/1407");
485491
continue;

0 commit comments

Comments
 (0)