+
+ macro_rules! broadcast_msgs {
+ ({ $($except_check: stmt), * }, { $($encoded_msg: expr), * }) => { {
+ for (ref descriptor, ref mut peer) in peers.peers.iter_mut() {
+ if !peer.channel_encryptor.is_ready_for_encryption() || peer.their_features.is_none() {
+ continue
+ }
+ match peer.their_node_id {
+ None => continue,
+ Some(their_node_id) => {
+ $(
+ if { $except_check }(&peer, their_node_id) { continue }
+ )*
+ }
+ }
+ $(peer.pending_outbound_buffer.push_back(peer.channel_encryptor.encrypt_message(&$encoded_msg));)*
+ self.do_attempt_write_data(&mut (*descriptor).clone(), peer);
+ }
+ } }
+ }
+
+ for (from_node_id, broadcast) in peers.pending_broadcasts.drain(..) {
+ match broadcast {
+ AnnouncementMsg::ChanUpdate(msg) => {
+ let encoded_msg = encode_msg!(&msg);
+ broadcast_msgs!({ |peer: & &mut Peer, _| !peer.should_forward_channel_announcement(msg.contents.short_channel_id),
+ |_, their_node_id| their_node_id == from_node_id },
+ { encoded_msg });
+ },
+ AnnouncementMsg::ChanAnnounce(msg) => {
+ let encoded_msg = encode_msg!(&msg);
+ broadcast_msgs!({ |peer: & &mut Peer, _| !peer.should_forward_channel_announcement(msg.contents.short_channel_id),
+ |_, their_node_id| their_node_id == msg.contents.node_id_1,
+ |_, their_node_id| their_node_id == msg.contents.node_id_2,
+ |_, their_node_id| their_node_id == from_node_id },
+ { encoded_msg });
+ },
+ AnnouncementMsg::NodeAnnounce(msg) => {
+ let encoded_msg = encode_msg!(&msg);
+
+ broadcast_msgs!({ |peer: & &mut Peer, _| !peer.should_forward_node_announcement(msg.contents.node_id),
+ |_, their_node_id| their_node_id == msg.contents.node_id,
+ |_, their_node_id| their_node_id == from_node_id },
+ { encoded_msg });
+ }
+ }
+ }
+