Skip to content

Commit d4fcc56

Browse files
committed
Send channel_update messages to direct peers on private channels
If we are a public node and have a private channel, our counterparty needs to know the fees which we will charge to forward payments to them. Without sending them a channel_update, they have no way to learn that information, resulting in the channel being effectively useless for outbound-from-us payments. This commit fixes our lack of channel_update messages to private channel counterparties, ensuring we always send them a channel_update after the channel funding is confirmed.
1 parent 422bdcf commit d4fcc56

File tree

8 files changed

+130
-16
lines changed

8 files changed

+130
-16
lines changed

fuzz/src/chanmon_consistency.rs

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -571,7 +571,12 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
571571
events::MessageSendEvent::SendFundingLocked { .. } => continue,
572572
events::MessageSendEvent::SendAnnouncementSignatures { .. } => continue,
573573
events::MessageSendEvent::PaymentFailureNetworkUpdate { .. } => continue,
574-
_ => panic!("Unhandled message event"),
574+
events::MessageSendEvent::SendChannelUpdate { ref node_id, ref msg } => {
575+
assert_eq!(msg.contents.flags & 2, 0); // The disable bit must never be set!
576+
if Some(*node_id) == expect_drop_id { panic!("peer_disconnected should drop msgs bound for the disconnected peer"); }
577+
*node_id == a_id
578+
},
579+
_ => panic!("Unhandled message event {:?}", event),
575580
};
576581
if push_a { ba_events.push(event); } else { bc_events.push(event); }
577582
}
@@ -692,7 +697,16 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
692697
// Can be generated due to a payment forward being rejected due to a
693698
// channel having previously failed a monitor update
694699
},
695-
_ => panic!("Unhandled message event"),
700+
events::MessageSendEvent::SendChannelUpdate { ref msg, .. } => {
701+
// When we reconnect we will resend a channel_update to make sure our
702+
// counterparty has the latest parameters for receiving payments
703+
// through us. We do, however, check that the message does not include
704+
// the "disabled" bit, as we should never ever have a channel which is
705+
// disabled when we send such an update (or it may indicate channel
706+
// force-close which we should detect as an error).
707+
assert_eq!(msg.contents.flags & 2, 0);
708+
},
709+
_ => panic!("Unhandled message event {:?}", event),
696710
}
697711
if $limit_events != ProcessMessages::AllMessages {
698712
break;
@@ -722,6 +736,9 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
722736
events::MessageSendEvent::SendFundingLocked { .. } => {},
723737
events::MessageSendEvent::SendAnnouncementSignatures { .. } => {},
724738
events::MessageSendEvent::PaymentFailureNetworkUpdate { .. } => {},
739+
events::MessageSendEvent::SendChannelUpdate { ref msg, .. } => {
740+
assert_eq!(msg.contents.flags & 2, 0); // The disable bit must never be set!
741+
},
725742
_ => panic!("Unhandled message event"),
726743
}
727744
}
@@ -737,6 +754,9 @@ pub fn do_test<Out: test_logger::Output>(data: &[u8], out: Out) {
737754
events::MessageSendEvent::SendFundingLocked { .. } => {},
738755
events::MessageSendEvent::SendAnnouncementSignatures { .. } => {},
739756
events::MessageSendEvent::PaymentFailureNetworkUpdate { .. } => {},
757+
events::MessageSendEvent::SendChannelUpdate { ref msg, .. } => {
758+
assert_eq!(msg.contents.flags & 2, 0); // The disable bit must never be set!
759+
},
740760
_ => panic!("Unhandled message event"),
741761
}
742762
}

lightning-background-processor/src/lib.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,9 +443,13 @@ mod tests {
443443

444444
// Confirm the funding transaction.
445445
confirm_transaction(&mut nodes[0], &funding_tx);
446+
let as_funding = get_event_msg!(nodes[0], MessageSendEvent::SendFundingLocked, nodes[1].node.get_our_node_id());
446447
confirm_transaction(&mut nodes[1], &funding_tx);
447-
nodes[0].node.handle_funding_locked(&nodes[1].node.get_our_node_id(), &get_event_msg!(nodes[1], MessageSendEvent::SendFundingLocked, nodes[0].node.get_our_node_id()));
448-
nodes[1].node.handle_funding_locked(&nodes[0].node.get_our_node_id(), &get_event_msg!(nodes[0], MessageSendEvent::SendFundingLocked, nodes[1].node.get_our_node_id()));
448+
let bs_funding = get_event_msg!(nodes[1], MessageSendEvent::SendFundingLocked, nodes[0].node.get_our_node_id());
449+
nodes[0].node.handle_funding_locked(&nodes[1].node.get_our_node_id(), &bs_funding);
450+
let _as_channel_update = get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id());
451+
nodes[1].node.handle_funding_locked(&nodes[0].node.get_our_node_id(), &as_funding);
452+
let _bs_channel_update = get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, nodes[0].node.get_our_node_id());
449453

450454
assert!(bg_processor.stop().is_ok());
451455

lightning/src/ln/chanmon_update_fail_tests.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1158,7 +1158,10 @@ fn test_monitor_update_fail_reestablish() {
11581158
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &bs_reestablish);
11591159

11601160
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &as_reestablish);
1161-
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
1161+
assert_eq!(
1162+
get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id())
1163+
.contents.flags & 2, 0); // The "disabled" bit should be unset as we just reconnected
1164+
11621165
nodes[1].logger.assert_log("lightning::ln::channelmanager".to_string(), "Failed to update ChannelMonitor".to_string(), 1);
11631166
check_added_monitors!(nodes[1], 1);
11641167

@@ -1172,10 +1175,15 @@ fn test_monitor_update_fail_reestablish() {
11721175
assert!(bs_reestablish == get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id()));
11731176

11741177
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &bs_reestablish);
1178+
assert_eq!(
1179+
get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id())
1180+
.contents.flags & 2, 0); // The "disabled" bit should be unset as we just reconnected
11751181

11761182
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &as_reestablish);
11771183
check_added_monitors!(nodes[1], 0);
1178-
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
1184+
assert_eq!(
1185+
get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, nodes[0].node.get_our_node_id())
1186+
.contents.flags & 2, 0); // The "disabled" bit should be unset as we just reconnected
11791187

11801188
*nodes[1].chain_monitor.update_ret.lock().unwrap() = Some(Ok(()));
11811189
let (outpoint, latest_update) = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap().get(&chan_1.2).unwrap().clone();
@@ -1352,14 +1360,14 @@ fn claim_while_disconnected_monitor_update_fail() {
13521360
let bs_reconnect = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
13531361

13541362
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &bs_reconnect);
1355-
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
1363+
let _as_channel_update = get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id());
13561364

13571365
// Now deliver a's reestablish, freeing the claim from the holding cell, but fail the monitor
13581366
// update.
13591367
*nodes[1].chain_monitor.update_ret.lock().unwrap() = Some(Err(ChannelMonitorUpdateErr::TemporaryFailure));
13601368

13611369
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &as_reconnect);
1362-
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
1370+
let _bs_channel_update = get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, nodes[0].node.get_our_node_id());
13631371
nodes[1].logger.assert_log("lightning::ln::channelmanager".to_string(), "Failed to update ChannelMonitor".to_string(), 1);
13641372
check_added_monitors!(nodes[1], 1);
13651373
assert!(nodes[1].node.get_and_clear_pending_msg_events().is_empty());
@@ -1492,7 +1500,9 @@ fn monitor_failed_no_reestablish_response() {
14921500
let bs_reconnect = get_event_msg!(nodes[1], MessageSendEvent::SendChannelReestablish, nodes[0].node.get_our_node_id());
14931501

14941502
nodes[1].node.handle_channel_reestablish(&nodes[0].node.get_our_node_id(), &as_reconnect);
1503+
let _bs_channel_update = get_event_msg!(nodes[1], MessageSendEvent::SendChannelUpdate, nodes[0].node.get_our_node_id());
14951504
nodes[0].node.handle_channel_reestablish(&nodes[1].node.get_our_node_id(), &bs_reconnect);
1505+
let _as_channel_update = get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id());
14961506

14971507
*nodes[1].chain_monitor.update_ret.lock().unwrap() = Some(Ok(()));
14981508
let (outpoint, latest_update) = nodes[1].chain_monitor.latest_monitor_update_id.lock().unwrap().get(&channel_id).unwrap().clone();

lightning/src/ln/channelmanager.rs

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,6 +1598,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
15981598
action: msgs::ErrorAction::IgnoreError
15991599
});
16001600
}
1601+
log_trace!(self.logger, "Attempting to generate broadcast channel update for channel {}", log_bytes!(chan.channel_id()));
16011602
self.get_channel_update_for_unicast(chan)
16021603
}
16031604

@@ -1607,6 +1608,7 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
16071608
/// provided evidence that they know about the existence of the channel.
16081609
/// May be called with channel_state already locked!
16091610
fn get_channel_update_for_unicast(&self, chan: &Channel<Signer>) -> Result<msgs::ChannelUpdate, LightningError> {
1611+
log_trace!(self.logger, "Attempting to generate channel update for channel {}", log_bytes!(chan.channel_id()));
16101612
let short_channel_id = match chan.get_short_channel_id() {
16111613
None => return Err(LightningError{err: "Channel not yet established".to_owned(), action: msgs::ErrorAction::IgnoreError}),
16121614
Some(id) => id,
@@ -2789,7 +2791,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
27892791
pub fn channel_monitor_updated(&self, funding_txo: &OutPoint, highest_applied_update_id: u64) {
27902792
let _persistence_guard = PersistenceNotifierGuard::notify_on_drop(&self.total_consistency_lock, &self.persistence_notifier);
27912793

2792-
let (mut pending_failures, chan_restoration_res) = {
2794+
let chan_restoration_res;
2795+
let mut pending_failures = {
27932796
let mut channel_lock = self.channel_state.lock().unwrap();
27942797
let channel_state = &mut *channel_lock;
27952798
let mut channel = match channel_state.by_id.entry(funding_txo.to_channel_id()) {
@@ -2801,7 +2804,21 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
28012804
}
28022805

28032806
let (raa, commitment_update, order, pending_forwards, pending_failures, funding_broadcastable, funding_locked) = channel.get_mut().monitor_updating_restored(&self.logger);
2804-
(pending_failures, handle_chan_restoration_locked!(self, channel_lock, channel_state, channel, raa, commitment_update, order, None, pending_forwards, funding_broadcastable, funding_locked))
2807+
let channel_update = if funding_locked.is_some() && channel.get().is_usable() && !channel.get().should_announce() {
2808+
// We only send a channel_update in the case where we are just now sending a
2809+
// funding_locked and the channel is in a usable state. Further, we rely on the
2810+
// normal announcement_signatures process to send a channel_update for public
2811+
// channels, only generating a unicast channel_update if this is a private channel.
2812+
Some(events::MessageSendEvent::SendChannelUpdate {
2813+
node_id: channel.get().get_counterparty_node_id(),
2814+
msg: self.get_channel_update_for_unicast(channel.get()).unwrap(),
2815+
})
2816+
} else { None };
2817+
chan_restoration_res = handle_chan_restoration_locked!(self, channel_lock, channel_state, channel, raa, commitment_update, order, None, pending_forwards, funding_broadcastable, funding_locked);
2818+
if let Some(upd) = channel_update {
2819+
channel_state.pending_msg_events.push(upd);
2820+
}
2821+
pending_failures
28052822
};
28062823
post_handle_chan_restoration!(self, chan_restoration_res);
28072824
for failure in pending_failures.drain(..) {
@@ -2964,6 +2981,11 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
29642981
node_id: counterparty_node_id.clone(),
29652982
msg: announcement_sigs,
29662983
});
2984+
} else if chan.get().is_usable() {
2985+
channel_state.pending_msg_events.push(events::MessageSendEvent::SendChannelUpdate {
2986+
node_id: counterparty_node_id.clone(),
2987+
msg: self.get_channel_update_for_unicast(chan.get()).unwrap(),
2988+
});
29672989
}
29682990
Ok(())
29692991
},
@@ -3394,7 +3416,8 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
33943416
}
33953417

33963418
fn internal_channel_reestablish(&self, counterparty_node_id: &PublicKey, msg: &msgs::ChannelReestablish) -> Result<(), MsgHandleErrInternal> {
3397-
let (htlcs_failed_forward, need_lnd_workaround, chan_restoration_res) = {
3419+
let chan_restoration_res;
3420+
let (htlcs_failed_forward, need_lnd_workaround) = {
33983421
let mut channel_state_lock = self.channel_state.lock().unwrap();
33993422
let channel_state = &mut *channel_state_lock;
34003423

@@ -3409,15 +3432,27 @@ impl<Signer: Sign, M: Deref, T: Deref, K: Deref, F: Deref, L: Deref> ChannelMana
34093432
// add-HTLCs on disconnect, we may be handed HTLCs to fail backwards here.
34103433
let (funding_locked, revoke_and_ack, commitment_update, monitor_update_opt, order, htlcs_failed_forward, shutdown) =
34113434
try_chan_entry!(self, chan.get_mut().channel_reestablish(msg, &self.logger), channel_state, chan);
3435+
let mut channel_update = None;
34123436
if let Some(msg) = shutdown {
34133437
channel_state.pending_msg_events.push(events::MessageSendEvent::SendShutdown {
34143438
node_id: counterparty_node_id.clone(),
34153439
msg,
34163440
});
3441+
} else if chan.get().is_usable() {
3442+
// If the channel is in a usable state (ie the channel is not being shut
3443+
// down), send a unicast channel_update to our counterparty to make sure
3444+
// they have the latest channel parameters.
3445+
channel_update = Some(events::MessageSendEvent::SendChannelUpdate {
3446+
node_id: chan.get().get_counterparty_node_id(),
3447+
msg: self.get_channel_update_for_unicast(chan.get()).unwrap(),
3448+
});
34173449
}
34183450
let need_lnd_workaround = chan.get_mut().workaround_lnd_bug_4006.take();
3419-
(htlcs_failed_forward, need_lnd_workaround,
3420-
handle_chan_restoration_locked!(self, channel_state_lock, channel_state, chan, revoke_and_ack, commitment_update, order, monitor_update_opt, Vec::new(), None, funding_locked))
3451+
chan_restoration_res = handle_chan_restoration_locked!(self, channel_state_lock, channel_state, chan, revoke_and_ack, commitment_update, order, monitor_update_opt, Vec::new(), None, funding_locked);
3452+
if let Some(upd) = channel_update {
3453+
channel_state.pending_msg_events.push(upd);
3454+
}
3455+
(htlcs_failed_forward, need_lnd_workaround)
34213456
},
34223457
hash_map::Entry::Vacant(_) => return Err(MsgHandleErrInternal::send_err_msg_no_close("Failed to find corresponding channel".to_owned(), msg.channel_id))
34233458
}
@@ -3970,6 +4005,12 @@ where
39704005
node_id: channel.get_counterparty_node_id(),
39714006
msg: announcement_sigs,
39724007
});
4008+
} else if channel.is_usable() {
4009+
log_trace!(self.logger, "Sending funding_locked WITHOUT announcement_signatures but with private channel_update for our counterparty on channel {}", log_bytes!(channel.channel_id()));
4010+
pending_msg_events.push(events::MessageSendEvent::SendChannelUpdate {
4011+
node_id: channel.get_counterparty_node_id(),
4012+
msg: self.get_channel_update_for_unicast(channel).unwrap(),
4013+
});
39734014
} else {
39744015
log_trace!(self.logger, "Sending funding_locked WITHOUT announcement_signatures for {}", log_bytes!(channel.channel_id()));
39754016
}
@@ -4209,6 +4250,7 @@ impl<Signer: Sign, M: Deref , T: Deref , K: Deref , F: Deref , L: Deref >
42094250
&events::MessageSendEvent::BroadcastChannelAnnouncement { .. } => true,
42104251
&events::MessageSendEvent::BroadcastNodeAnnouncement { .. } => true,
42114252
&events::MessageSendEvent::BroadcastChannelUpdate { .. } => true,
4253+
&events::MessageSendEvent::SendChannelUpdate { ref node_id, .. } => node_id != counterparty_node_id,
42124254
&events::MessageSendEvent::HandleError { ref node_id, .. } => node_id != counterparty_node_id,
42134255
&events::MessageSendEvent::PaymentFailureNetworkUpdate { .. } => true,
42144256
&events::MessageSendEvent::SendChannelRangeQuery { .. } => false,
@@ -5042,7 +5084,19 @@ pub mod bench {
50425084
Listen::block_connected(&node_b, &block, 1);
50435085

50445086
node_a.handle_funding_locked(&node_b.get_our_node_id(), &get_event_msg!(node_b_holder, MessageSendEvent::SendFundingLocked, node_a.get_our_node_id()));
5045-
node_b.handle_funding_locked(&node_a.get_our_node_id(), &get_event_msg!(node_a_holder, MessageSendEvent::SendFundingLocked, node_b.get_our_node_id()));
5087+
let msg_events = node_a.get_and_clear_pending_msg_events();
5088+
assert_eq!(msg_events.len(), 2);
5089+
match msg_events[0] {
5090+
MessageSendEvent::SendFundingLocked { ref msg, .. } => {
5091+
node_b.handle_funding_locked(&node_a.get_our_node_id(), msg);
5092+
get_event_msg!(node_b_holder, MessageSendEvent::SendChannelUpdate, node_a.get_our_node_id());
5093+
},
5094+
_ => panic!(),
5095+
}
5096+
match msg_events[1] {
5097+
MessageSendEvent::SendChannelUpdate { .. } => {},
5098+
_ => panic!(),
5099+
}
50465100

50475101
let dummy_graph = NetworkGraph::new(genesis_hash);
50485102

lightning/src/ln/functional_test_utils.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1583,18 +1583,20 @@ macro_rules! handle_chan_reestablish_msgs {
15831583
let mut revoke_and_ack = None;
15841584
let mut commitment_update = None;
15851585
let order = if let Some(ev) = msg_events.get(idx) {
1586-
idx += 1;
15871586
match ev {
15881587
&MessageSendEvent::SendRevokeAndACK { ref node_id, ref msg } => {
15891588
assert_eq!(*node_id, $dst_node.node.get_our_node_id());
15901589
revoke_and_ack = Some(msg.clone());
1590+
idx += 1;
15911591
RAACommitmentOrder::RevokeAndACKFirst
15921592
},
15931593
&MessageSendEvent::UpdateHTLCs { ref node_id, ref updates } => {
15941594
assert_eq!(*node_id, $dst_node.node.get_our_node_id());
15951595
commitment_update = Some(updates.clone());
1596+
idx += 1;
15961597
RAACommitmentOrder::CommitmentFirst
15971598
},
1599+
&MessageSendEvent::SendChannelUpdate { .. } => RAACommitmentOrder::CommitmentFirst,
15981600
_ => panic!("Unexpected event"),
15991601
}
16001602
} else {
@@ -1607,16 +1609,24 @@ macro_rules! handle_chan_reestablish_msgs {
16071609
assert_eq!(*node_id, $dst_node.node.get_our_node_id());
16081610
assert!(revoke_and_ack.is_none());
16091611
revoke_and_ack = Some(msg.clone());
1612+
idx += 1;
16101613
},
16111614
&MessageSendEvent::UpdateHTLCs { ref node_id, ref updates } => {
16121615
assert_eq!(*node_id, $dst_node.node.get_our_node_id());
16131616
assert!(commitment_update.is_none());
16141617
commitment_update = Some(updates.clone());
1618+
idx += 1;
16151619
},
1620+
&MessageSendEvent::SendChannelUpdate { .. } => {},
16161621
_ => panic!("Unexpected event"),
16171622
}
16181623
}
16191624

1625+
if let Some(&MessageSendEvent::SendChannelUpdate { ref node_id, ref msg }) = msg_events.get(idx) {
1626+
assert_eq!(*node_id, $dst_node.node.get_our_node_id());
1627+
assert_eq!(msg.contents.flags & 2, 0); // "disabled" flag must not be set as we just reconnected.
1628+
}
1629+
16201630
(funding_locked, revoke_and_ack, commitment_update, order)
16211631
}
16221632
}

lightning/src/ln/functional_tests.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1039,7 +1039,8 @@ fn do_test_shutdown_rebroadcast(recv_count: u8) {
10391039
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_1_2nd_shutdown);
10401040
node_0_2nd_shutdown
10411041
} else {
1042-
assert!(nodes[0].node.get_and_clear_pending_msg_events().is_empty());
1042+
let node_0_chan_update = get_event_msg!(nodes[0], MessageSendEvent::SendChannelUpdate, nodes[1].node.get_our_node_id());
1043+
assert_eq!(node_0_chan_update.contents.flags & 2, 0); // "disabled" flag must not be set as we just reconnected.
10431044
nodes[0].node.handle_shutdown(&nodes[1].node.get_our_node_id(), &InitFeatures::known(), &node_1_2nd_shutdown);
10441045
get_event_msg!(nodes[0], MessageSendEvent::SendShutdown, nodes[1].node.get_our_node_id())
10451046
};

lightning/src/ln/peer_handler.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,6 +1264,12 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, L: Deref> PeerManager<D
12641264
self.forward_broadcast_msg(peers, &wire::Message::ChannelUpdate(msg), None);
12651265
}
12661266
},
1267+
MessageSendEvent::SendChannelUpdate { ref node_id, ref msg } => {
1268+
log_trace!(self.logger, "Handling SendChannelUpdate event in peer_handler for node {} for channel {}",
1269+
log_pubkey!(node_id), msg.contents.short_channel_id);
1270+
let peer = get_peer_for_forwarding!(node_id);
1271+
peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&encode_msg!(msg)));
1272+
},
12671273
MessageSendEvent::PaymentFailureNetworkUpdate { ref update } => {
12681274
self.message_handler.route_handler.handle_htlc_fail_channel_update(update);
12691275
},

0 commit comments

Comments
 (0)