Merge pull request #841 from valentinewallace/207-replacement
[rust-lightning] / lightning / src / ln / wire.rs
index 43a8cd5ddac6c79ad5d7190df617c73f33719da0..8197ce151ef9deceb8fa17591c04d642e29385d2 100644 (file)
@@ -1,3 +1,12 @@
+// This file is Copyright its original authors, visible in version control
+// history.
+//
+// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
+// or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
+// You may not use this file except in accordance with one or both of these
+// licenses.
+
 //! Wire encoding/decoding for Lightning messages according to [BOLT #1].
 //!
 //! Messages known by this module can be read from the wire using [`read`].
 use ln::msgs;
 use util::ser::{Readable, Writeable, Writer};
 
-/// Maximum Lightning message data length according to
-/// [BOLT-8](https://github.com/lightningnetwork/lightning-rfc/blob/v1.0/08-transport.md#lightning-message-specification)
-/// and [BOLT-1](https://github.com/lightningnetwork/lightning-rfc/blob/master/01-messaging.md#lightning-message-format):
-pub const LN_MAX_MSG_LEN: usize = std::u16::MAX as usize; // Must be equal to 65535
-
 /// A Lightning message returned by [`read`] when decoding bytes received over the wire. Each
 /// variant contains a message from [`ln::msgs`] or otherwise the message type if unknown.
 ///
@@ -51,6 +55,11 @@ pub enum Message {
        ChannelAnnouncement(msgs::ChannelAnnouncement),
        NodeAnnouncement(msgs::NodeAnnouncement),
        ChannelUpdate(msgs::ChannelUpdate),
+       QueryShortChannelIds(msgs::QueryShortChannelIds),
+       ReplyShortChannelIdsEnd(msgs::ReplyShortChannelIdsEnd),
+       QueryChannelRange(msgs::QueryChannelRange),
+       ReplyChannelRange(msgs::ReplyChannelRange),
+       GossipTimestampFilter(msgs::GossipTimestampFilter),
        /// A message that could not be decoded because its type is unknown.
        Unknown(MessageType),
 }
@@ -86,6 +95,11 @@ impl Message {
                        &Message::ChannelAnnouncement(ref msg) => msg.type_id(),
                        &Message::NodeAnnouncement(ref msg) => msg.type_id(),
                        &Message::ChannelUpdate(ref msg) => msg.type_id(),
+                       &Message::QueryShortChannelIds(ref msg) => msg.type_id(),
+                       &Message::ReplyShortChannelIdsEnd(ref msg) => msg.type_id(),
+                       &Message::QueryChannelRange(ref msg) => msg.type_id(),
+                       &Message::ReplyChannelRange(ref msg) => msg.type_id(),
+                       &Message::GossipTimestampFilter(ref msg) => msg.type_id(),
                        &Message::Unknown(type_id) => type_id,
                }
        }
@@ -182,6 +196,21 @@ pub fn read<R: ::std::io::Read>(buffer: &mut R) -> Result<Message, msgs::DecodeE
                msgs::ChannelUpdate::TYPE => {
                        Ok(Message::ChannelUpdate(Readable::read(buffer)?))
                },
+               msgs::QueryShortChannelIds::TYPE => {
+                       Ok(Message::QueryShortChannelIds(Readable::read(buffer)?))
+               },
+               msgs::ReplyShortChannelIdsEnd::TYPE => {
+                       Ok(Message::ReplyShortChannelIdsEnd(Readable::read(buffer)?))
+               },
+               msgs::QueryChannelRange::TYPE => {
+                       Ok(Message::QueryChannelRange(Readable::read(buffer)?))
+               },
+               msgs::ReplyChannelRange::TYPE => {
+                       Ok(Message::ReplyChannelRange(Readable::read(buffer)?))
+               }
+               msgs::GossipTimestampFilter::TYPE => {
+                       Ok(Message::GossipTimestampFilter(Readable::read(buffer)?))
+               },
                _ => {
                        Ok(Message::Unknown(MessageType(message_type)))
                },
@@ -308,6 +337,26 @@ impl Encode for msgs::ChannelUpdate {
        const TYPE: u16 = 258;
 }
 
+impl Encode for msgs::QueryShortChannelIds {
+       const TYPE: u16 = 261;
+}
+
+impl Encode for msgs::ReplyShortChannelIdsEnd {
+       const TYPE: u16 = 262;
+}
+
+impl Encode for msgs::QueryChannelRange {
+       const TYPE: u16 = 263;
+}
+
+impl Encode for msgs::ReplyChannelRange {
+       const TYPE: u16 = 264;
+}
+
+impl Encode for msgs::GossipTimestampFilter {
+       const TYPE: u16 = 265;
+}
+
 #[cfg(test)]
 mod tests {
        use super::*;
@@ -316,12 +365,6 @@ mod tests {
        // Big-endian wire encoding of Pong message (type = 19, byteslen = 2).
        const ENCODED_PONG: [u8; 6] = [0u8, 19u8, 0u8, 2u8, 0u8, 0u8];
 
-       #[test]
-       fn max_msg_len() {
-               assert_eq!(LN_MAX_MSG_LEN, 65535);
-               assert_eq!(LN_MAX_MSG_LEN, std::u16::MAX as usize);
-       }
-
        #[test]
        fn read_empty_buffer() {
                let buffer = [];
@@ -417,24 +460,25 @@ mod tests {
        fn read_lnd_init_msg() {
                // Taken from lnd v0.9.0-beta.
                let buffer = vec![0, 16, 0, 2, 34, 0, 0, 3, 2, 162, 161];
-               check_init_msg(buffer);
+               check_init_msg(buffer, false);
        }
 
        #[test]
        fn read_clightning_init_msg() {
                // Taken from c-lightning v0.8.0.
                let buffer = vec![0, 16, 0, 2, 34, 0, 0, 3, 2, 170, 162, 1, 32, 6, 34, 110, 70, 17, 26, 11, 89, 202, 175, 18, 96, 67, 235, 91, 191, 40, 195, 79, 58, 94, 51, 42, 31, 199, 178, 183, 60, 241, 136, 145, 15];
-               check_init_msg(buffer);
+               check_init_msg(buffer, true);
        }
 
-       fn check_init_msg(buffer: Vec<u8>) {
+       fn check_init_msg(buffer: Vec<u8>, expect_unknown: bool) {
                let mut reader = ::std::io::Cursor::new(buffer);
                let decoded_msg = read(&mut reader).unwrap();
                match decoded_msg {
                        Message::Init(msgs::Init { features }) => {
                                assert!(features.supports_variable_length_onion());
                                assert!(features.supports_upfront_shutdown_script());
-                               assert!(features.supports_unknown_bits());
+                               assert!(features.supports_gossip_queries());
+                               assert_eq!(expect_unknown, features.supports_unknown_bits());
                                assert!(!features.requires_unknown_bits());
                                assert!(!features.initial_routing_sync());
                        },
@@ -452,7 +496,7 @@ mod tests {
                        Message::NodeAnnouncement(msgs::NodeAnnouncement { contents: msgs::UnsignedNodeAnnouncement { features, ..}, ..}) => {
                                assert!(features.supports_variable_length_onion());
                                assert!(features.supports_upfront_shutdown_script());
-                               assert!(features.supports_unknown_bits());
+                               assert!(features.supports_gossip_queries());
                                assert!(!features.requires_unknown_bits());
                        },
                        _ => panic!("Expected node announcement, found message type: {}", decoded_msg.type_id())