Skip to content

Commit 4b53654

Browse files
authored
Merge pull request #2776 from jkczyz/2023-12-direct-connect-follow-ups
Folllow-ups to #2723
2 parents 2d26679 + 1c4d328 commit 4b53654

File tree

3 files changed

+42
-25
lines changed

3 files changed

+42
-25
lines changed

fuzz/src/onion_message.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ impl MessageRouter for TestMessageRouter {
7979
Ok(OnionMessagePath {
8080
intermediate_nodes: vec![],
8181
destination,
82-
addresses: None,
82+
first_node_addresses: None,
8383
})
8484
}
8585
}

lightning/src/onion_message/functional_tests.rs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ impl MessageRouter for TestMessageRouter {
5151
Ok(OnionMessagePath {
5252
intermediate_nodes: vec![],
5353
destination,
54-
addresses: Some(vec![SocketAddress::TcpIpV4 { addr: [127, 0, 0, 1], port: 1000 }]),
54+
first_node_addresses:
55+
Some(vec![SocketAddress::TcpIpV4 { addr: [127, 0, 0, 1], port: 1000 }]),
5556
})
5657
}
5758
}
@@ -227,7 +228,7 @@ fn one_unblinded_hop() {
227228
let path = OnionMessagePath {
228229
intermediate_nodes: vec![],
229230
destination: Destination::Node(nodes[1].node_id),
230-
addresses: None,
231+
first_node_addresses: None,
231232
};
232233
nodes[0].messenger.send_onion_message_using_path(path, test_msg, None).unwrap();
233234
nodes[1].custom_message_handler.expect_message(TestCustomMessage::Response);
@@ -242,7 +243,7 @@ fn two_unblinded_hops() {
242243
let path = OnionMessagePath {
243244
intermediate_nodes: vec![nodes[1].node_id],
244245
destination: Destination::Node(nodes[2].node_id),
245-
addresses: None,
246+
first_node_addresses: None,
246247
};
247248
nodes[0].messenger.send_onion_message_using_path(path, test_msg, None).unwrap();
248249
nodes[2].custom_message_handler.expect_message(TestCustomMessage::Response);
@@ -259,7 +260,7 @@ fn one_blinded_hop() {
259260
let path = OnionMessagePath {
260261
intermediate_nodes: vec![],
261262
destination: Destination::BlindedPath(blinded_path),
262-
addresses: None,
263+
first_node_addresses: None,
263264
};
264265
nodes[0].messenger.send_onion_message_using_path(path, test_msg, None).unwrap();
265266
nodes[1].custom_message_handler.expect_message(TestCustomMessage::Response);
@@ -276,7 +277,7 @@ fn two_unblinded_two_blinded() {
276277
let path = OnionMessagePath {
277278
intermediate_nodes: vec![nodes[1].node_id, nodes[2].node_id],
278279
destination: Destination::BlindedPath(blinded_path),
279-
addresses: None,
280+
first_node_addresses: None,
280281
};
281282

282283
nodes[0].messenger.send_onion_message_using_path(path, test_msg, None).unwrap();
@@ -294,7 +295,7 @@ fn three_blinded_hops() {
294295
let path = OnionMessagePath {
295296
intermediate_nodes: vec![],
296297
destination: Destination::BlindedPath(blinded_path),
297-
addresses: None,
298+
first_node_addresses: None,
298299
};
299300

300301
nodes[0].messenger.send_onion_message_using_path(path, test_msg, None).unwrap();
@@ -313,7 +314,7 @@ fn too_big_packet_error() {
313314
let path = OnionMessagePath {
314315
intermediate_nodes: hops,
315316
destination: Destination::Node(hop_node_id),
316-
addresses: None,
317+
first_node_addresses: None,
317318
};
318319
let err = nodes[0].messenger.send_onion_message_using_path(path, test_msg, None).unwrap_err();
319320
assert_eq!(err, SendError::TooBigPacket);
@@ -331,7 +332,7 @@ fn we_are_intro_node() {
331332
let path = OnionMessagePath {
332333
intermediate_nodes: vec![],
333334
destination: Destination::BlindedPath(blinded_path),
334-
addresses: None,
335+
first_node_addresses: None,
335336
};
336337

337338
nodes[0].messenger.send_onion_message_using_path(path, test_msg.clone(), None).unwrap();
@@ -343,7 +344,7 @@ fn we_are_intro_node() {
343344
let path = OnionMessagePath {
344345
intermediate_nodes: vec![],
345346
destination: Destination::BlindedPath(blinded_path),
346-
addresses: None,
347+
first_node_addresses: None,
347348
};
348349
nodes[0].messenger.send_onion_message_using_path(path, test_msg, None).unwrap();
349350
nodes[1].custom_message_handler.expect_message(TestCustomMessage::Response);
@@ -364,7 +365,7 @@ fn invalid_blinded_path_error() {
364365
let path = OnionMessagePath {
365366
intermediate_nodes: vec![],
366367
destination: Destination::BlindedPath(blinded_path),
367-
addresses: None,
368+
first_node_addresses: None,
368369
};
369370
let err = nodes[0].messenger.send_onion_message_using_path(path, test_msg.clone(), None).unwrap_err();
370371
assert_eq!(err, SendError::TooFewBlindedHops);
@@ -380,7 +381,7 @@ fn reply_path() {
380381
let path = OnionMessagePath {
381382
intermediate_nodes: vec![nodes[1].node_id, nodes[2].node_id],
382383
destination: Destination::Node(nodes[3].node_id),
383-
addresses: None,
384+
first_node_addresses: None,
384385
};
385386
let reply_path = BlindedPath::new_for_message(&[nodes[2].node_id, nodes[1].node_id, nodes[0].node_id], &*nodes[0].entropy_source, &secp_ctx).unwrap();
386387
nodes[0].messenger.send_onion_message_using_path(path, test_msg.clone(), Some(reply_path)).unwrap();
@@ -396,7 +397,7 @@ fn reply_path() {
396397
let path = OnionMessagePath {
397398
intermediate_nodes: vec![],
398399
destination: Destination::BlindedPath(blinded_path),
399-
addresses: None,
400+
first_node_addresses: None,
400401
};
401402
let reply_path = BlindedPath::new_for_message(&[nodes[2].node_id, nodes[1].node_id, nodes[0].node_id], &*nodes[0].entropy_source, &secp_ctx).unwrap();
402403

@@ -431,7 +432,7 @@ fn invalid_custom_message_type() {
431432
let path = OnionMessagePath {
432433
intermediate_nodes: vec![],
433434
destination: Destination::Node(nodes[1].node_id),
434-
addresses: None,
435+
first_node_addresses: None,
435436
};
436437
let err = nodes[0].messenger.send_onion_message_using_path(path, test_msg, None).unwrap_err();
437438
assert_eq!(err, SendError::InvalidMessage);
@@ -444,7 +445,7 @@ fn peer_buffer_full() {
444445
let path = OnionMessagePath {
445446
intermediate_nodes: vec![],
446447
destination: Destination::Node(nodes[1].node_id),
447-
addresses: None,
448+
first_node_addresses: None,
448449
};
449450
for _ in 0..188 { // Based on MAX_PER_PEER_BUFFER_SIZE in OnionMessenger
450451
nodes[0].messenger.send_onion_message_using_path(path.clone(), test_msg.clone(), None).unwrap();
@@ -469,7 +470,7 @@ fn many_hops() {
469470
let path = OnionMessagePath {
470471
intermediate_nodes,
471472
destination: Destination::Node(nodes[num_nodes-1].node_id),
472-
addresses: None,
473+
first_node_addresses: None,
473474
};
474475
nodes[0].messenger.send_onion_message_using_path(path, test_msg, None).unwrap();
475476
nodes[num_nodes-1].custom_message_handler.expect_message(TestCustomMessage::Response);

lightning/src/onion_message/messenger.rs

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ pub(super) const MAX_TIMER_TICKS: usize = 2;
8787
/// # Ok(OnionMessagePath {
8888
/// # intermediate_nodes: vec![hop_node_id1, hop_node_id2],
8989
/// # destination,
90-
/// # addresses: None,
90+
/// # first_node_addresses: None,
9191
/// # })
9292
/// # }
9393
/// # }
@@ -223,6 +223,13 @@ impl OnionMessageRecipient {
223223
*self = OnionMessageRecipient::ConnectedPeer(new_pending_messages);
224224
}
225225
}
226+
227+
fn is_connected(&self) -> bool {
228+
match self {
229+
OnionMessageRecipient::ConnectedPeer(..) => true,
230+
OnionMessageRecipient::PendingConnection(..) => false,
231+
}
232+
}
226233
}
227234

228235
/// An [`OnionMessage`] for [`OnionMessenger`] to send.
@@ -292,7 +299,9 @@ where
292299
) -> Result<OnionMessagePath, ()> {
293300
let first_node = destination.first_node();
294301
if peers.contains(&first_node) {
295-
Ok(OnionMessagePath { intermediate_nodes: vec![], destination, addresses: None })
302+
Ok(OnionMessagePath {
303+
intermediate_nodes: vec![], destination, first_node_addresses: None
304+
})
296305
} else {
297306
let network_graph = self.network_graph.deref().read_only();
298307
let node_announcement = network_graph
@@ -303,8 +312,10 @@ where
303312

304313
match node_announcement {
305314
Some(node_announcement) if node_announcement.features.supports_onion_messages() => {
306-
let addresses = Some(node_announcement.addresses.clone());
307-
Ok(OnionMessagePath { intermediate_nodes: vec![], destination, addresses })
315+
let first_node_addresses = Some(node_announcement.addresses.clone());
316+
Ok(OnionMessagePath {
317+
intermediate_nodes: vec![], destination, first_node_addresses
318+
})
308319
},
309320
_ => Err(()),
310321
}
@@ -325,7 +336,7 @@ pub struct OnionMessagePath {
325336
///
326337
/// Only needs to be set if a connection to the node is required. [`OnionMessenger`] may use
327338
/// this to initiate such a connection.
328-
pub addresses: Option<Vec<SocketAddress>>,
339+
pub first_node_addresses: Option<Vec<SocketAddress>>,
329340
}
330341

331342
impl OnionMessagePath {
@@ -459,7 +470,8 @@ pub enum PeeledOnion<T: OnionMessageContents> {
459470
/// Creates an [`OnionMessage`] with the given `contents` for sending to the destination of
460471
/// `path`.
461472
///
462-
/// Returns both the node id of the peer to send the message to and the message itself.
473+
/// Returns the node id of the peer to send the message to, the message itself, and any addresses
474+
/// need to connect to the first node.
463475
pub fn create_onion_message<ES: Deref, NS: Deref, T: OnionMessageContents>(
464476
entropy_source: &ES, node_signer: &NS, secp_ctx: &Secp256k1<secp256k1::All>,
465477
path: OnionMessagePath, contents: T, reply_path: Option<BlindedPath>,
@@ -468,7 +480,7 @@ where
468480
ES::Target: EntropySource,
469481
NS::Target: NodeSigner,
470482
{
471-
let OnionMessagePath { intermediate_nodes, mut destination, addresses } = path;
483+
let OnionMessagePath { intermediate_nodes, mut destination, first_node_addresses } = path;
472484
if let Destination::BlindedPath(BlindedPath { ref blinded_hops, .. }) = destination {
473485
if blinded_hops.is_empty() {
474486
return Err(SendError::TooFewBlindedHops);
@@ -510,7 +522,7 @@ where
510522
packet_payloads, packet_keys, prng_seed).map_err(|()| SendError::TooBigPacket)?;
511523

512524
let message = OnionMessage { blinding_point, onion_routing_packet };
513-
Ok((first_node_id, message, addresses))
525+
Ok((first_node_id, message, first_node_addresses))
514526
}
515527

516528
/// Decode one layer of an incoming [`OnionMessage`].
@@ -724,7 +736,11 @@ where
724736
},
725737
hash_map::Entry::Occupied(mut e) => {
726738
e.get_mut().enqueue_message(onion_message);
727-
Ok(SendSuccess::Buffered)
739+
if e.get().is_connected() {
740+
Ok(SendSuccess::Buffered)
741+
} else {
742+
Ok(SendSuccess::BufferedAwaitingConnection(first_node_id))
743+
}
728744
},
729745
}
730746
}

0 commit comments

Comments
 (0)