- peer.their_node_id = Some(their_node_id);
- insert_node_id!();
- let features = InitFeatures::known();
- let resp = msgs::Init { features, remote_network_address: filter_addresses(peer.their_net_address.clone())};
- self.enqueue_message(peer, &resp);
- peer.awaiting_pong_timer_tick_intervals = 0;
- },
- NextNoiseStep::ActThree => {
- let their_node_id = try_potential_handleerror!(peer.channel_encryptor.process_act_three(&peer.pending_read_buffer[..]));
- peer.pending_read_buffer = [0; 18].to_vec(); // Message length header is 18 bytes
- peer.pending_read_is_header = true;
- peer.their_node_id = Some(their_node_id);
- insert_node_id!();
- let features = InitFeatures::known();
- let resp = msgs::Init { features, remote_network_address: filter_addresses(peer.their_net_address.clone())};
- self.enqueue_message(peer, &resp);
- peer.awaiting_pong_timer_tick_intervals = 0;
- },
- NextNoiseStep::NoiseComplete => {
- if peer.pending_read_is_header {
- let msg_len = try_potential_handleerror!(peer.channel_encryptor.decrypt_length_header(&peer.pending_read_buffer[..]));
- peer.pending_read_buffer = Vec::with_capacity(msg_len as usize + 16);
- peer.pending_read_buffer.resize(msg_len as usize + 16, 0);
- if msg_len < 2 { // Need at least the message type tag
- return Err(PeerHandleError{ no_connection_possible: false });
- }
- peer.pending_read_is_header = false;
- } else {
- let msg_data = try_potential_handleerror!(peer.channel_encryptor.decrypt_message(&peer.pending_read_buffer[..]));
- assert!(msg_data.len() >= 2);
-
- // Reset read buffer
- peer.pending_read_buffer = [0; 18].to_vec();
- peer.pending_read_is_header = true;
-
- let mut reader = io::Cursor::new(&msg_data[..]);
- let message_result = wire::read(&mut reader, &*self.custom_message_handler);
- let message = match message_result {
- Ok(x) => x,
- Err(e) => {
- match e {
- // Note that to avoid recursion we never call
- // `do_attempt_write_data` from here, causing
- // the messages enqueued here to not actually
- // be sent before the peer is disconnected.
- (msgs::DecodeError::UnknownRequiredFeature, Some(ty)) if is_gossip_msg(ty) => {
- log_gossip!(self.logger, "Got a channel/node announcement with an unknown required feature flag, you may want to update!");
- continue;
- }
- (msgs::DecodeError::UnsupportedCompression, _) => {
- log_gossip!(self.logger, "We don't support zlib-compressed message fields, sending a warning and ignoring message");
- self.enqueue_message(peer, &msgs::WarningMessage { channel_id: [0; 32], data: "Unsupported message compression: zlib".to_owned() });
- continue;
- }
- (_, Some(ty)) if is_gossip_msg(ty) => {
- log_gossip!(self.logger, "Got an invalid value while deserializing a gossip message");
- self.enqueue_message(peer, &msgs::WarningMessage { channel_id: [0; 32], data: "Unreadable/bogus gossip message".to_owned() });
- continue;
- }
- (msgs::DecodeError::UnknownRequiredFeature, ty) => {
- log_gossip!(self.logger, "Received a message with an unknown required feature flag or TLV, you may want to update!");
- self.enqueue_message(peer, &msgs::WarningMessage { channel_id: [0; 32], data: format!("Received an unknown required feature/TLV in message type {:?}", ty) });
- return Err(PeerHandleError { no_connection_possible: false });
- }
- (msgs::DecodeError::UnknownVersion, _) => return Err(PeerHandleError { no_connection_possible: false }),
- (msgs::DecodeError::InvalidValue, _) => {
- log_debug!(self.logger, "Got an invalid value while deserializing message");
- return Err(PeerHandleError { no_connection_possible: false });
- }
- (msgs::DecodeError::ShortRead, _) => {
- log_debug!(self.logger, "Deserialization failed due to shortness of message");
- return Err(PeerHandleError { no_connection_possible: false });
- }
- (msgs::DecodeError::BadLengthDescriptor, _) => return Err(PeerHandleError { no_connection_possible: false }),
- (msgs::DecodeError::Io(_), _) => return Err(PeerHandleError { no_connection_possible: false }),
- }
- }
- };
-
- match self.handle_message(peer, message) {
- Err(handling_error) => match handling_error {
- MessageHandlingError::PeerHandleError(e) => { return Err(e) },
- MessageHandlingError::LightningError(e) => {
- try_potential_handleerror!(Err(e));
- },
- },
- Ok(Some(msg)) => {
- peer_node_id = Some(peer.their_node_id.expect("After noise is complete, their_node_id is always set"));
- msgs_to_forward.push(msg);
- },
- Ok(None) => {},
- }
- }